iptables關鍵學習總結

iptables技術推薦參考這位仁兄的博客:http://www.zsythink.net/archives/category/%E8%BF%90%E7%BB%B4%E7%9B%B8%E5%85%B3/%E9%98%B2%E7%81%AB%E5%A2%99/page/2/算法

iptables指南參見:https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.htmbash

iptables匹配原則:從序列號爲1的開始匹配,直到匹配到第一條合適的規則並執行,後續規則即便可以匹配也再也不執行服務器

iptables規則順序:將常常會被匹配到的規則放在表前面網絡

報文傳輸順序嚴格遵循下圖(圖片系引用),須要注意到,與轉發相關的PREROUTING的nat功能在路由選擇以前,所以nat可以正常被路由處理ssh

 

  • 使用iptables -t filter -nvL INPUT --line查看iptables規則
  • iptables-save能夠將當前的iptables規則以「保存後的格式」輸出到屏幕上,使用iptables-save > /etc/sysconfig/iptables-config保存到系統中
  • iptables-restore能夠將保存的規格重載到環境中,使用:iptables-restore < /etc/sysconfig/iptables
  • 使用iptables -t filter -P INPUT DROP修改表的默認規則(此處爲DROP)
  • 使用iptables -t filter -I INPUT -s 1.1.1.1,1.1.1.2 -j DROP添加多個規則,逗號隔開,逗號左右側不能有空格
  • 使用iptables -t filter -I INPUT -s 1.1.1.0/24 -j DROP添加一個網段的規則
  • 使用iptables -t filter -I INPUT ! -s 175.24.0.59 -j ACCEPT,添加表示接收IP非175.24.0.59的報文,但175.24.0.59的報文是否接收取決於規則中是否有對175.24.0.59的處理,若是規則中是有以下一條內容,則會接收175.24.0.59的報文
host-175-24-0-58:/home # iptables -t filter -nvL INPUT --line
Chain INPUT (policy ACCEPT 138 packets, 15020 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1       46  9364 DROP       all  --  *      *      !175.24.0.59          0.0.0.0/0

    但若是規則以下明確表示拒絕175.24.0.59,則不會接收175.24.0.59的報文,注意新加的規則是在原規則以後而不是以前tcp

host-175-24-0-58:/home # iptables -t filter -nvL INPUT --line
Chain INPUT (policy ACCEPT 138 packets, 15020 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1       46  9364 DROP       all  --  *      *      !175.24.0.59          0.0.0.0/0
2       0    0   REJECT     all  --  *      *       175.24.0.59          0.0.0.0/0
  •  iptables使用-s來指定報文源地址,使用-d指定報文目的地址,iptables -t filter -I INPUT -s 1.1.1.1 -d 1.1.1.2 -j DROP,表示僅丟棄來自1.1.1.1發往1.1.1.2報文;若是規則爲iptables -t filter -I INPUT -s 0.0.0.0 -d 1.1.1.2 -j DROP則表示丟棄全部發往1.1.1.2的報文,-d指定的地址能夠是本機。當一條規則存在多個匹配條件時,報文須要知足全部匹配條件,規則才能生效
  • iptables使用-p來指定協議類型,iptables -t filter -I INPUT -s 1.1.1.1 -p tcp -j reject,表示拒絕來自1.1.1.1的tcp報文,默認拒絕全部協議的報文(不指定-p),能夠從/etc/protocols中獲取全部的協議信息。
  • iptables 使用-i匹配報文是經過哪塊網卡流入本機,使用-o來匹配報文從哪一個網口流出。-i選項只能用於PREROUTING鏈、INPUT鏈、FORWARD鏈;-o選項只能用於POSTROUTING鏈、OUTPUT鏈、FORWARD鏈。   
//表示丟棄全部經過eth1傳入的tcp報文 
iptables -t filter -I INPUT -i eth1 -p tcp -j DROP
//表示丟棄全部經過eth2傳出的icmp報文
iptables -t filter -I OUTPUT -o eth2 -p icmp -d drop
  • 以上命令爲基本匹配條件,使用擴展匹配條件須要加載擴展模塊。如使用--dport匹配目標端口時須要加載特定的模塊,如tcp:iptables -t filter -I INPUT -s 1.1.1.1 -p tcp -m tcp -dport 22 -j REJECT,表示本端拒絕來自1.1.1.1的ssh鏈接。--dport能夠認爲是tcp模塊中的功能,因此必須制定tcp模塊(若是不指定使用與-p名稱同樣的模塊)。
    • 使用冒號能夠連續指定匹配端口號,如iptables -t filter -I INPUT -p tcp -m tcp --dport 22:30 -j REJECT,也可使用如:22匹配1到22的端口;使用22:匹配22到65535的端口號,但不能指定離散的端口
    • 使用multiport模塊能夠指定多個離散的端口:iptables -t filter -I INPUT -p tcp -m multiport --dport 22,40,50:60 -j REJECT,但multiport只能用於tcp和udp協議
  • 擴展匹配條件也可使用!取反,如 ! --dport 22,表示目標端口不是22的報文都會被匹配
  • icmp可使用type/code匹配具體的報文,iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j DROP,表示type爲8,code爲0的icmp報文會被丟棄,type code對應關係以下
TYPE CODE Description Query Error
0 0 Echo Reply——回顯應答(Ping應答) x  
3 0 Network Unreachable——網絡不可達   x
3 1 Host Unreachable——主機不可達   x
3 2 Protocol Unreachable——協議不可達   x
3 3 Port Unreachable——端口不可達   x
3 4 Fragmentation needed but no frag. bit set——須要進行分片但設置不分片比特   x
3 5 Source routing failed——源站選路失敗   x
3 6 Destination network unknown——目的網絡未知   x
3 7 Destination host unknown——目的主機未知   x
3 8 Source host isolated (obsolete)——源主機被隔離(做廢不用)   x
3 9 Destination network administratively prohibited——目的網絡被強制禁止   x
3 10 Destination host administratively prohibited——目的主機被強制禁止   x
3 11 Network unreachable for TOS——因爲服務類型TOS,網絡不可達   x
3 12 Host unreachable for TOS——因爲服務類型TOS,主機不可達   x
3 13 Communication administratively prohibited by filtering——因爲過濾,通訊被強制禁止   x
3 14 Host precedence violation——主機越權   x
3 15 Precedence cutoff in effect——優先停止生效   x
4 0 Source quench——源端被關閉(基本流控制)    
5 0 Redirect for network——對網絡重定向    
5 1 Redirect for host——對主機重定向    
5 2 Redirect for TOS and network——對服務類型和網絡重定向    
5 3 Redirect for TOS and host——對服務類型和主機重定向    
8 0 Echo request——回顯請求(Ping請求) x  
9 0 Router advertisement——路由器通告    
10 0 Route solicitation——路由器請求    
11 0 TTL equals 0 during transit——傳輸期間生存時間爲0   x
11 1 TTL equals 0 during reassembly——在數據報組裝期間生存時間爲0   x
12 0 IP header bad (catchall error)——壞的IP首部(包括各類差錯)   x
12 1 Required options missing——缺乏必需的選項   x
13 0 Timestamp request (obsolete)——時間戳請求(做廢不用) x  
14   Timestamp reply (obsolete)——時間戳應答(做廢不用) x  
15 0 Information request (obsolete)——信息請求(做廢不用) x  
16 0 Information reply (obsolete)——信息應答(做廢不用) x  
17 0 Address mask request——地址掩碼請求 x  
18 0 Address mask reply——地址掩碼應答
  • iptables的白名單方式爲:首先添加一個「拒絕全部請求」,而後將白名單規則放在它前面
  • Chain INPUT (policy DROP 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination         
        0     0 ACCEPT     all  --  *      *       1.1.1.1              0.0.0.0/0           
      222 26155 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0 
  • 使用自定義鏈有2個條件:首先建立一個自定義鏈;而後將新建立的鏈關聯到現有的鏈(references表示被關聯的次數)。主鏈中匹配條件後跳轉到子鏈,自鏈也會從新按照本身的規則進行報文匹配,所以主鏈和子鏈之間的匹配條件無需重複
    • 使用iptables -t filter -N NEW_CHAIN0建立自定義鏈
    • 使用iptables -t filter -E NEW_CHAIN0 NEW_CHAIN1
    • 刪除自定義鏈以前須要刪除全部references,而後清除自定義鏈的全部規則,使用iptables -t filter -X NEW_CHAIN1刪除自定義鏈
    • 子鏈中能夠添加RETURN操做來返回到主鏈,以下表示若是源地址是1.1.1.1,則返回到主鏈處理
Chain NEW_CHAIN0 (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    1    60 RETURN     all  --  *      *       1.1.1.1              0.0.0.0/0            
    0     0 ACCEPT     all  --  *      *       192.168.128.1        0.0.0.0/0   
  • iptables使用state模塊進行鏈接跟蹤,除了本地產生的包由OUTPUT鏈處理外,全部鏈接跟蹤都是在PREROUTING鏈裏進行處理的,意思就是, iptables會在PREROUTING鏈裏重新計算全部的狀態。若是咱們發送一個流的初始化包,狀態就會在OUTPUT鏈 裏被設置爲NEW,當咱們收到迴應的包時,狀態就會在PREROUTING鏈裏被設置爲ESTABLISHED。若是第一個包不是本地產生的,那就會在PREROUTING鏈裏被設置爲NEW狀 態。綜上,全部狀態的改變和計算都是在nat表中的PREROUTING鏈和OUTPUT鏈裏完成的。使用state模塊能夠控制「誰或什麼能發起新的會話

  使用以下命令能夠防止外部主機訪問本機,但不妨礙本機訪問其餘主機性能

iptables -t filter -A INPUT -j REJECT
iptables -t filter -I INPUT -m state --state ESTABLISHED -j ACCEPT

能夠在/proc/net/nf_conntrack查看跟蹤記錄,能夠在/proc/sys/net/ipv4/netfilter中設置跟蹤參數,好比能夠在nf_conntrack_icmp_timeout中設置icmp跟蹤記錄的生存時間ui

  • REJECT使用選項--reject-with能夠設置提示信息,如iptables -t filter -I INPUT -j REJECT --reject-with icmp-host-unreachable,當ping該主機的時候會接收到主機不可達的提示信息
  • 使用LOG動做能夠將匹配到的報文相關信息記錄到日誌中:/var/log/message,iptables -t filter -I INPUT -s 1.1.1.1 -j LOG,表示在INPUT鏈的filter表中匹配到源地址爲1.1.1.1的報文後記錄在日誌中
  • NAT功能一般被集成到路由器,防火牆或獨立的NAT設備中,使用SNAT或DNAT須要看具體場景,以下圖,A訪問C,報文源地址爲1.1.1.1,目的地址爲2.2.2.1,此時須要在B上配置SNAT(源地址轉換爲路由器地址),不然B將接收不到C返回的報文,這種場景用在私網訪問公網場景,A爲私網,C爲公網;若是A須要訪問C,報文源地址爲1.1.1.1,目的地址爲1.1.1.2,此時須要在B上配置DNAT,這種場景通常用在訪問服務器場景,A爲普通主機,C爲服務器

A(host)------------------>B(NAT)----------------->C(host)
(1.1.1.1)              (1.1.1.2)(2.2.2.2)               (2.2.2.1)spa

SNAT只能配置在INPUT和POSTROUTING上,INPUT用於主機接收;POSTROUTING主要走轉發流程,如上圖A直接ping 2.2.2.1須要配置以下內容,同時在A機器上能夠抓包或使用iptables LOG功能或/var/log/message查看源地址,爲B機器的2.2.2.2的地址.net

#A機器上添加到達C的路由,不然報文會走默認網關
route add -host 2.2.2.1  gw 1.1.1.2
#B轉發機器添加iptables規則
iptables -t nat -I POSTROUTING -d 1.1.1.2 -j SNAT --to 2.2.2.2

DNAT只能配置在OUTPUT和PREROUTING上,PREROUTING用於路由判斷,走轉發;OUTPUT僅用於主機發送,A經過B ping C的配置以下(B機器配置)

#首先目的地址轉換
iptables -t nat -I PREROUTING -d 1.1.1.2 -j DNAT --to 2.2.2.1
#修改源地址,不然報文回來找不到目的地址
iptables -t nat -I POSTROUTING -d 2.2.2.1 -j SNAT --to 2.2.2.2

使用NAT只能用於轉換IP地址,若是要nat帶端口號的服務,如基於tcp的ssh,或基於UDP的服務等,就須要NAPT,以上圖爲例,若是A須要ssh鏈接C,配置以下:

#添加到2.2.2.1的DNAT
iptables -t nat -I PREROUTING -d 1.1.1.2 -p tcp -m tcp --dport 20220 -j DNAT --to 2.2.2.1:22
#修改B發出的源地址
iptables -t nat -I POSTROUTING -d 2.2.2.1 -p tcp -m tcp --dport 22 -j SNAT --to 2.2.2.2

A最後ssh鏈接C的方式爲:ssh -p 20220 2.2.2.2,當訪問B主機的20220端口時,會映射到C主機的22端口。由於端口映射的關係是保存在NAT服務器上的,所以必須經過DNATP的方式,單獨使用以下方式是沒法通的

iptables -t nat -I POSTROUTING -d 2.2.2.1 -p tcp -m tcp --dport 22 -j SNAT --to 2.2.2.2

NAT儘可能不要使用多端口映射,參見https://blog.csdn.net/u013401853/article/details/70848433

  • MASQUERADE主要用於可變源地址轉換,只能用於nat表的POSTROUTING,如DHCP狀況下,iptables -t nat -I POSTROUTING -d 1.1.1.1 -o eth1 -j MASQUERADE,表示將報文源地址修改成eth1接口地址,MASQUERADE相比SNAT性能比較低,若是IP地址不變,則優先使用SNAT。
  • REDIRECT用於在本機進行端口映射,只能用於nat表的PREROUTING、OUTPUT,如iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080,當其餘主機訪問本機80端口時,報文會被重定向到本機的8080端口。DNAT 是明確指定修改目的地址,而 REDIRECT 會把要轉發的包的目的地址改寫爲入口接口的 IP 地址,即接收到的全部報文的目的地址都會被修改成入接口的IP,同時端口也會被修改。
  • 使用limit模塊能夠對報文進行限速,如iptables -t filter -I INPUT -p icmp -m limit --limit 10/minute -j ACCEPT,表示每分鐘最多放行10個包,即沒6s最多放行一個包。limit模塊使用「令牌桶」算法,使用--limit-burst能夠指定令牌個數。 
相關文章
相關標籤/搜索