1、iptables:administration tool for IPv4/IPv6 packet filtering and NAT
1)簡介:Linux的2.4版內核引入了一種全新的包處理引擎Netfilter,同時還有一個管理它的命令行工具iptables。iptables用於建立、維護和檢查Linux內核中IPv4包過濾規則的表。
2)結構層次:iptables - 表table - 鏈chain(內建或自定義) - 規則(目標target子句等)。
iptables對網絡上的數據包有次序地施加規則“鏈”。鏈的集合就構成了表,用於處理特定類型的流量。
默認的iptables表為filter(過濾器)。它包含3個默認鏈:FORWARD、INPUT和OUTPUT,內核處理的每個包都要經過3個鏈中的某一個。FORWARD鏈里的規則用於在一個網絡接口收到的、而且需要轉發到另一個網絡接口的所有包。INPUT和OUTPUT鏈里的規則分別用於目的是本地主機,或者從本地主機發出的流量。
nat表包含的規則鏈控制着NAT(網絡地址轉換)。另外,還有mangle、raw和security表,這里不詳述。
構成一條鏈的每條規則都有一個“target(目標)”子句,它決定了如何處理匹配的包。一旦某個包匹配了一條規則,那么它的結局就確定了,不再用其他規則來檢查它。雖然iptables內部定義了許多target,但還是可以指定另一條鏈作為規則的target。在filter表中的規則可以使用的target子句有ACCEPT(包可以繼續通過)、DROP(默默地丟棄包)和REJECT(把包丟棄並返回一則ICMP錯誤消息)等。
3) 示例:
本例中,eth1(128.138.101.4)通往Internet,eth0(10.1.1.1)通往內部網絡,兩個接口的子網掩碼都是255.255.255.0。IP為10.1.1.2的Web服務器受到該防火牆保護。
# -F:沖洗指定的鏈(刪除所有規則);-P:為鏈設置默認的目標(建議使用DROP) iptables -F # 沖洗掉表中所有的鏈 iptables -P INPUT DROP # 設置INPUT鏈的默認目標為DROP(最安全的策略就是丟棄沒有明確允許的任何包) iptables -P FORWARD DROP # 設置FORWARD鏈的默認目標為DROP # 規則是按照它們出現在鏈中的順序來進行匹配的,所以將用得最多的規則放在最前面 # -A:在指定鏈上追加規則;-i:接收數據包的接口;-j:目標;-p:協議;-d:主機或網絡的目的地址;--dport:目的端口 iptables -A FORWARD -i eth0 -p ANY -j ACCEPT # 讓源自內部網絡的任何包都能被轉發 iptables -A FORWARD -d 10.1.1.2 -p tcp --dport 22 -j ACCEPT # 允許SSH/HTTP/HTTPS能夠通過防火牆連到Web服務器10.1.1.2 iptables -A FORWARD -d 10.1.1.2 -p tcp --dport 80 -j ACCEPT iptables -A FORWARD -d 10.1.1.2 -p tcp --dport 443 -j ACCEPT iptables -A INPUT -i eth0 -d 10.1.1.1 -p tcp --dport 22 -j ACCEPT # 允許到防火牆主機10.1.1.1的唯一TCP流量是SSH,它用於管理防火牆 iptables -A INPUT -i lo -d 127.0.0.1 -p ANY -j ACCEPT # 允許環回流量 iptables -A INPUT -i eth0 -d 10.1.1.1 -p icmp --icmp-type 8 -j ACCEPT # 允許從內部網絡來的ICMP ECHO_REQUEST包 # 為了讓主機在Internet上正常工作,必須允許某些類型的ICMP包通過防火牆。以下規則就是既能送到防火牆主機,也能送到在它之后的網絡的最小ICMP包集合 iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT iptables -A INPUT -p icmp --icmp-type 5 -j ACCEPT iptables -A INPUT -p icmp --icmp-type 11 -j ACCEPT iptables -A FORWARD -d 10.1.1.2 -p icmp --icmp-type 0 -j ACCEPT iptables -A FORWARD -d 10.1.1.2 -p icmp --icmp-type 3 -j ACCEPT iptables -A FORWARD -d 10.1.1.2 -p icmp --icmp-type 5 -j ACCEPT iptables -A FORWARD -d 10.1.1.2 -p icmp --icmp-type 11 -j ACCEPT # 雖然nat表的目的並不是用作包過濾的,但它的PREROUTING鏈對於反IP欺騙的過濾來說特別有用 # 如果在PREROUTING鏈中加入DROP項,它們就不需要出現在INPUT和FORWARD鏈里了,因為PREROUTING鏈會應用到所有進入防火牆主機的數據包上 # -t:表;-s:主機或網絡的源地址 iptables -t nat -A PREROUTING -i eth1 -s 10.0.0.0/8 -j DROP # eth1接收到的包的源地址不可能是內部地址、環回地址或D類地址 iptables -t nat -A PREROUTING -i eth1 -s 172.16.0.0/12 -j DROP iptables -t nat -A PREROUTING -i eth1 -s 192.168.0.0/16 -j DROP iptables -t nat -A PREROUTING -i eth1 -s 127.0.0.0/8 -j DROP iptables -t nat -A PREROUTING -i eth1 -s 224.0.0.0/4 -j DROP iptables -A INPUT -i eth1 -j LOG # 禁止所有沒有得到明確許可的包。LOG目標提供一種跟蹤數據包的簡單途徑 iptables -A FORWARD -i eth1 -j LOG
4)以下問題可能與配置了iptables有關:
(1)可以ping通,但nc提示"No route to host":ping所用的icmp流量允許通過防火牆,但nc所用的tcp流量不允許(使用tcpdump觀察到一個SYN包,但它被防火牆丟棄,所以三次握手都沒完成)。
參考資料:
《UNIX/Linux系統管理技術手冊》
不斷學習中。。。
