iptables常用使用場景分析

0x 01 前言

iptables功能豐富,應用場景多樣,本文介紹5種常用場景。


0x 02 準備工作

1.刪除舊錶和規則

在配置新的iptables規則前,最好先將舊的配置和規則清除:

iptables -F
清除filter表規則
iptables -X 
清除自定義鏈

2.設置默認的chain策略


默認ACCEPT

iptables默認的chain策略爲ACCEPT,放通所有流量,如果需要限制某些路徑,再按需設置策略。

之前我一直覺得這樣與ACL精神相違背,後來發現iptables的規則比我想象還要靈活很多,安全和易用可以兼得。下面的配置既可以保證安全,也可以避免起初在設置DROP策略時候,可能會由於人爲失誤等產生的無法連接的情況,維護起來也更爲方便,刪除策略不會對連通性產生風險。
具體策略如下:

如果是遠程連接,需要先保證遠程的shell的正常通信,在此默認使用ssh,且端口爲22號,使用stateful防火牆特有的狀態監測:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

放通ping的流量和本地迴環流量
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT

禁止其他的流量和流量轉發
iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited
iptables -A FORWARD -j REJECT --reject-with icmp-host-prohibited

默認DROP

這種設計與ACL的deny all 精神相符合,不過用起來確實會麻煩一點,爲了完成基礎通信,需要更多的配置。具體配置如下。

如果是遠程連接,需要先保證遠程的shell的正常通信,在此默認使用ssh,且端口爲22號:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT

爲了保證yum或者apt的正常使用,正常連接各個鏡像源,需要將DNS服務端口53和HTTP的默認80端口打開:
iptables -A INPUT -p udp -m udp --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT

iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

關閉filter三條默認鏈的所有流量,包括接收、轉發和發出。
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

另外,在chain中要特別注意每條規則的上下順序,默認是由上往下匹配。而且如果你的target是ACCEPT或者DROP,那麼匹配上該規則後,就不會再匹配下面的規則了,而如果是其他target,則會繼續向下匹配。


0x 03 場景分析

場景一,屏蔽風險源IP

當因爲合規或者安全風險考慮,我們需要將某個或者某段IP的輸入進行屏蔽,這時我們可以使用以下命令,將指定網卡中的ip源的包丟棄:

iptables -A INPUT -i eth0 -p tcp -s 192.168.8.0/24 -j DROP

以上命令設置將源地址段爲192.168.8.0/24,且經過eth0的網卡的tcp的流量包丟棄。當然我們還可以設定源目端口或者限定特定IP,同樣我們也可以限定本地發往的目的IP。

####場景二,網絡地址轉換(DNAT or SNAT)

在多網卡的場景下,我們經常需要將IP地址進行轉換,以滿足不同網絡之間跨網絡訪問需求。iptables的nat表可以完成此類轉換工作:

在此之前我們需要將Linux系統的轉發功能打開:

echo "1">/proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp -d 192.168.0.1 --dport 33 -j DNAT --to 10.1.1.1:22
以上命令將192.168.0.1的33端口的包轉發到10.1.1.1的22端口,因而我們可以通過192.168.0.1的33端口連接到10.1.1.1上的ssh服務,這種場景多見於堡壘機或者反向代理。

iptables  -t nat  -A POSTROUTING -p tcp -s 192.168.0.1  --sport 80 -j SNAT --to 10.1.1.1:8080
以上命令將源地址爲192.168.0.1的80端口的流量轉換爲10.1.1.1的8080端口的流量,以達到源地址改變的效果,這種場景多見於內外網轉換。

注:在進行DNAT時候,要保證後端的機器要有到Client的回程路由,且網關指向iptables所在機器,不然也無法完成。

場景三,DDoS攻擊的防護

利用iptables的limit模塊,可以實現輕量的DDoS攻擊防護。利用connlimit模塊,可以防護CC攻擊(一種低流量高連接的DDoS攻擊)

  • 通過自定義鏈的方式防止大流量攻擊
iptables -N syn-flood
新建syn-flood自定義鏈
iptables -A INPUT -p tcp --syn -j syn-flood
將所有進入本機的流量全部使用自定義鏈tcp-syn去匹配
iptables -I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN 
--limit 3/s表示每秒鐘可以釋放3個包的鏈接配額。
--limit-burst 6的意思是本機最多可存在6個封包。注意:這與session的概念是不同,一個session可以有無限個包。
iptables -A syn-flood -j DROP
當超過上個規則的限定的包,將被丟棄。該規則與上一個規則的關係類似以if,else的關係。
  • 使用系統默認鏈的方式防止大流量攻擊
iptables -A INPUT  -p tcp --syn -m limit --limit 3/s --limit-burst 6 -j ACCEPT
iptables -A INPUT  -p tcp --syn -j DROP
這裏涉及到的參數與自定義鏈的參數的意思相同,效果也一致。
  • 使用connlimit模塊來防護CC攻擊
iptables -A INPUT -i -p tcp --syn -m connlimit --connlimit-above 15 -j DROP 
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
允許每個IP最多15個初始連接,超過的丟棄 
connlimit模塊爲擴展模板,需要另外編譯安裝

場景四,按需管理iptables的日誌

iptables提供靈活的日誌記錄功能,我們可以爲每一個規則設置不同的日誌標識。

  • 爲了方便,建議將iptables的日誌與系統日誌分開。
   vim /etc/rsyslog.conf
   kern.* /var/log/iptables.log
   systemctl   restart  rsyslog
  • 記錄所有進入本機的80端口的日誌
iptables -I INPUT -p tcp --dport 80 -j LOG 
  • 爲日誌添加級別,並添加標記
    iptables使用 --log-level定義生成的日誌級別,使用–log-prefix爲每條規則添加標記。
iptables -A INPUT -s 192.168.10.0/24 -j LOG --log-prefix '**http-test**'  --log-level 4

注:日誌級別如下
6)info
5)notice
4)warning
3)error
2)crit
1)alert
0)emerg或panic:導致系統幾乎要死機

場景五,過濾包中的字符

如果想要對包中的內容做檢查,我們可以使用-m中的string模塊,比如我們想要禁止內部員工登錄淘寶,可以使用如下規則:

iptables -A OUTPUT -m string --algo bm --string "taobao.com" -j DROP

如果想對數據包中的某個字段進行匹配,比如打日誌什麼的,也可以使用string模塊。不過該模塊會對包中的所有內容都進行匹配,所以很容易“誤殺”。
下面是官方文檔的描述:
This patch by Emmanuel Roger [email protected] adds a new match that allows you to match a string anywhere in the packet.
點擊這裏,可以查看官方文檔的詳細描述。


0x 04 規則表的保存

iptables規則與路由規則類似,如果是用命令敲入的規則,只會保存到內存中,再開機的時候,規則都會消失。由於Ubuntu/Debian的發行版和RHEL/CentOS/fedora不同。在此也分成兩類。

Ubuntu/Debian類

  • Ubuntu默認沒有iptables配置文件,需通過如下命令保存並生成配置文件
iptables-save > /etc/network/iptables.up.rules
  • iptables配置文件路徑及文件名建議爲/etc/network/iptables.up.rules,因爲執行iptables-apply默認指向該文件,也可以通過-w參數指定文件
  • 在/etc/network/interfaces裏寫入如下配置
pre-up iptables-restore < /etc/network/iptables.up.rules

RHEL/CentOS/fedora類

  • 首先開啓iptables開機啓動
systemctl  enable iptables

  • 由於centos7之後,redhat推薦使用firewalld,因此需要stop和disable firewalld
systemctl  stop firewalld
systemctl  disable firewalld
另,如果出現發現不了iptables的unit的話,重新安裝即可
yum install  iptables-services 
  • centos7系統在安裝完iptables之後,就會自動生成配置文件/etc/sysconfig/iptables
service iptables  save  
將配置保存到配置文件/etc/sysconfig/iptables
或者使用如下命令也可以
iptables-save >  /etc/sysconfig/iptables 

這樣就將當前的配置全部導入到配置文件中,下次開機重啓的時候,就會將iptables的規則生效。


0x 05 參考

http://seanlook.com/2014/02/26/iptables-example/
http://www.cnblogs.com/bangerlee/archive/2013/02/27/2935422.html
http://blog.chinaunix.net/uid-20152246-id-1974690.html
https://www.howtoing.com/enable-logging-in-iptables-on-linux
http://blog.51cto.com/babyshen/1966077
https://blog.csdn.net/foreverfriends/article/details/70227791
http://blog.51cto.com/qiangsh/1978835
https://blog.csdn.net/xiaocao12/article/details/54729887

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章