天天看點

如何拒絕國外IP/屏蔽國外IP通路伺服器?背景介紹解決方案實作步驟

背景介紹

公網上的伺服器更容易受到攻擊

  • 網際網路上有很多掃描器,24小時不間斷掃描伺服器,然後去嘗試擷取一定權限,進而控制您的伺服器。
  • 實際運維和檢視伺服器日志中,發現 大多數發起攻擊的伺服器在國外 ,如荷蘭、美國、新加坡、日本等國家。
  • 不論我們購買的是雲伺服器還是IDC機房托管的伺服器,隻要我們對外提供了一定的服務,就會暴漏服務端口。

解決方案

大多國内公司的伺服器都是面向國内使用者

能不能禁止國外的IP通路伺服器呢?顯著提升伺服器的安全性,答案是肯定的。

我們首先介紹一些背景知識:

  • 伺服器上都是有防火牆工具軟體的(Iptables),可以用來過濾和攔截請求
  • Iptables中包含了一個叫Ipset的子產品,支援比對大批量IP位址段,同時兼具良好的性能
  • https://www.ipdeny.com/ 這個網站會定期更新全球配置設定的IP位址段

接下來我們梳理下禁止國外IP的思路(如下圖):

  1. 首先把國内的IP位址段整理到到Ipset中
  2. 接着從Iptables中調用Ipset子產品判斷來源IP是否在國内的IP位址段中
  3. 最後如果來源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

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
           

繼續閱讀