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
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
//表示丟棄全部經過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
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——地址掩碼應答 |
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
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 -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
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