背景介紹
公網上的伺服器更容易受到攻擊
- 網際網路上有很多掃描器,24小時不間斷掃描伺服器,然後去嘗試擷取一定權限,進而控制您的伺服器。
- 實際運維和檢視伺服器日志中,發現 大多數發起攻擊的伺服器在國外 ,如荷蘭、美國、新加坡、日本等國家。
- 不論我們購買的是雲伺服器還是IDC機房托管的伺服器,隻要我們對外提供了一定的服務,就會暴漏服務端口。
解決方案
大多國内公司的伺服器都是面向國内使用者
能不能禁止國外的IP通路伺服器呢?顯著提升伺服器的安全性,答案是肯定的。
我們首先介紹一些背景知識:
- 伺服器上都是有防火牆工具軟體的(Iptables),可以用來過濾和攔截請求
- Iptables中包含了一個叫Ipset的子產品,支援比對大批量IP位址段,同時兼具良好的性能
- https://www.ipdeny.com/ 這個網站會定期更新全球配置設定的IP位址段
接下來我們梳理下禁止國外IP的思路(如下圖):
- 首先把國内的IP位址段整理到到Ipset中
- 接着從Iptables中調用Ipset子產品判斷來源IP是否在國内的IP位址段中
- 最後如果來源IP是國内IP位址就放行,否則就将資料包丢棄。
如何拒絕國外IP/屏蔽國外IP通路伺服器?背景介紹解決方案實作步驟
實作步驟
作業系統環境是CentOS7.6
不同版本Linux指令可能不同
有不明白的地方,可以評論溝通
下面來詳細講解基于Iptables、Ipset、Ipdeny 來屏蔽國外IP通路伺服器的具體實作:
整理IP位址段到Ipset
1、下載下傳IP位址段檔案
通路網址 http://www.ipdeny.com/ipblocks/data/countries/cn.zone ,另存為國内IP位址段,然後将檔案上傳到伺服器;
也可以直接在伺服器上執行如下指令直接下載下傳檔案到伺服器:
wget http://www.ipdeny.com/ipblocks/data/countries/cn.zone
2、将IP位址段轉換為Ipset指令
執行如下腳本,将IP位址段中的記錄轉換為Ipset指令,儲存在
ipset_result.sh
可執行檔案中
for i in `cat cn.zone`; do echo "ipset add china $i" >>ipset_result.sh; done
chmod +x ipset_result.sh
3、Ipset寫入位址段資料
首先,建立一個名字叫
china
的Ipset的鍊
然後,執行前面生成的
ipset_result.sh
腳本,為
china
鍊添加國内位址段
ipset create china hash:net hashsize 10000 maxelem 1000000
sh ipset_result.sh
接着,添加區域網路IP位址段,防止區域網路IP位址被攔截
ipset add china 10.0.0.0/8
ipset add china 172.16.0.0/12
ipset add china 192.168.0.0/16
我們來檢查一下
china
鍊的資料,大概8000多條資料
ipset list china
ipset list china | wc -l
最後,為了性能考慮,Ipset資料儲存在記憶體中。
如果伺服器重新開機,将會導緻Ipset中的IP位址段資料失效。
我們需要将資料持久化到
/etc/ipset.conf
這個檔案中。
ipset save china > /etc/ipset.conf
ipset restore < /etc/ipset.conf
讓伺服器重新開機時,通過腳本在加載
/etc/ipset.conf
中的資料。
chmod +x /etc/rc.d/rc.local
echo "ipset restore < /etc/ipset.conf" >> /etc/rc.d/rc.local
在Iptables中調用Ipset的 china
鍊完成攔截國外IP
china
1、調整或建立Iptables規則
Iptables中的指令有從上到下比對順序的,我們需要注意攔截指令順序
iptables -I INPUT 5 -m set ! --match-set china src -j DROP
iptables -F # 清除預設鍊中規則
iptables -X # 清除自定義鍊中規則
iptables -A INPUT -i lo -j ACCEPT # 允許來自本機的全部連接配接
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # 允許已建立的連接配接不中斷
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT # 允許icmp協定,即允許ping伺服器
iptables -A INPUT -m set ! --match-set china src -j DROP # 比對china鍊,非國内IP則直接丢棄包
iptables -A INPUT -p udp --dport 5060 -j ACCEPT # 允許UDP協定的5060端口
iptables -A INPUT -p udp --dport 20000:30000 -j ACCEPT # 允許UDP協定的20000-30000端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 允許TCP協定的80端口
iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 允許TCP協定的443端口
iptables -A INPUT -j DROP # 未比對以上規則的請求直接丢棄
iptables -A OUTPUT -j ACCEPT # 允許全部出網資料包
iptables -A FORWARD -j DROP # 不允許Iptables的FORWARD轉發
2、持久化Iptables規則
iptables-save > /etc/sysconfig/iptables # 持久化Iptables規則
chmod +x /etc/rc.d/rc.local
echo "/usr/sbin/iptables-restore < /etc/sysconfig/iptables" >> /etc/rc.d/rc.local