IPtables(包過濾型防火牆)是一個工作在linux內核中且有連接追蹤的包過濾型防火牆
Firewall(防火牆):是一個用來做網絡隔離、工作在網絡邊緣的組件。防火牆可以根據事先定義的規則對進出本網絡的數據報文進行匹配檢測,並對其匹配的報文做出相應的處理。簡單來說就是:根據規則,匹配報文,做出處理。
防火牆分類:
主機防火牆
網絡防火牆
硬件防火牆(硬件個軟件邏輯)
軟件防火牆(軟件邏輯,靈活)
IPchains:規則連,自上而下一條條的對報文進行規則匹配,一旦被某個規則匹配就按照這個規則的定義進行報文的處理,如果所有的規則都沒有匹配,則按照默認規則進行處理
netfilter:netfilter纔是真真的防火牆,工作在內核之中
iptables:專門編寫規則和檢查規則的語法
注:iptables編寫的每條規則,最後都會直接送到netfilter的某個hook function(鉤子函數)上,進行報文過濾
hook function有五種:
prerouting
input
forward
output
postrouting
每個hook function都對應一個鏈
鏈有五種:
PREROUTING 路由前
INPUT 進入
FORWARD 轉發
OUTPUT 外出
POSTROUTING 路由後
功能分類:
filter:進行過濾,是最常用的一個,定義哪個包能夠通過,哪個包不能通過
nat(network address translation):網絡地址轉換,用於修改源IP/目標ip,也可以修改端口
mangle;用於拆解報文,並對報文做出修改後重新封裝起來
raw:關閉nat表上啓用的連接追蹤機制
每一個鏈上可以定義多個功能,每個功能可以寫入多個規則,這就是一個規則表。但是每個規則的生效有先後順序
功能和鏈的對應關係
Raw:PREROUTING、OUTPUT上可以定義
Mangle:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING 五個上面都可以定義
Nat:PREROUTING、INPUT、OUTPUT、POSTROUTING(除了forward)上可以定義
Filter:INPUT、FORWARD、OUTPUT上可以定義
報文的流向:
流入機制: PREROUTING-->INPUT
由本機流出:OUTPUT-->POSTROUTING
轉發:PREROUTING-->FORWARD-->POSTROUTING
路由功能發生的時刻:
報文進入本機時:目標主機是哪個?
報文離開本機之前:判斷經由哪個接口送往下一站?
例:
凡是來自172.16.1.0網段的主機都不允許訪問web服務,應該在哪個鏈上進行定義?
在INPUT鏈上,因爲只有INPUT、FORWARD、OUTPUT鏈上可以定義Filter(過濾)其他兩個明顯不符合,應該定義在進入本機的鏈上
所有由本機發出的訪問172.16.1.0網段web服務的都不被允許?
定義在OUTPUT鏈上,對外出的報文進行Filter(過濾)
所有由本機轉發的訪問172.16.1.0網段的web服務都允許
定義在FORWARD上,因爲轉發時報文只經過PREROUTING-->FORWARD-->POSTROUTING,而只有FORWARD鏈才被允許進行Filter(過濾)
iptables--編寫規則-->在netfilter上的hook function對應的鏈上進行匹配報文
規則的匹配條件分爲:
基本匹配條件
擴展匹配條件
規則的處理動作分爲:
基本處理動作
擴展處理動作
自定義的處理機制
根據規則,匹配報文,做出處理動作
iptables的鏈又分爲內置鏈和自定義鏈
5種內置鏈對應5個 hook function
自定義鏈:用於內置鏈的擴展和補充,可以更靈活的對規則進行管理
注:自定義鏈只有被內置鏈調用才能生效,自定義鏈必須與內置鏈相關聯
鏈上的規則檢查次序:
同類規則(訪問同一個應用),匹配到報文頻率小的放在上面
不同類規則(訪問不同的應用),匹配到報文頻率大的放在上面
將那些可以由一條規則描述的多個規則可以合併爲一個規則
要設置默認的策略
iptables命令的格式
iptables [-t table] command chain [-m matchname[per-match-options]] -j targetname [per-target-options]
-t (table): raw mangle filter nat
command:
鏈管理: -N:new 自定義一個新的規則鏈
-X:delete 刪除規則鏈
-P:policy設置默認的策略,對filter表中的鏈而言其默認的策略有:accept、drop、reject
-E:重新命名自定義的鏈,引用計數不爲0(即被內置鏈調用和關聯的鏈)的自定義鏈不能被重新命名,也不能被刪除
規則管理: -A:append追加
-I:insert插入,要指明位置,省略時表示插在第一條
-D:delete刪除規則鏈中的規則 1:指明規則序號 2:指明規則本身
-R:replace,替換指定鏈上指定的規則
-F:flush 清空指定的規則鏈
-Z:zero 清零計數器
注:iptables的每條規則都有2個計數器分別爲(1)匹配報文個數 (2)匹配到的所有報文的大小之和
-L:list 列出指定鏈上的所有規則
-n:numberic 以數字的格式顯示地址和端口號
-v:verbose 顯示詳細信息;-vv,-vvv
-x:exactly 顯示計數器結果的精確值
--line_numbers:顯示規則的序列號
匹配條件:
基本匹配條件,無需加載任何模塊,有iptables/netfilter自行提供
-s,--source address[/netmask] 檢查報文中源IP是否符合指定的範圍
-d,--destination address[/nermask] 檢查報文中的目標IP是否符合指定的範圍
-p,protocal +tcp、udp、tcmp、udplite、esp.....
-I,指定數據報文流入的接口,只能用於數據流入的鏈如(PREROUTING、INPUT、FORWARD)
-O, 指定數據報文流出的接口,只能用於(FORWARD、OUTPUT、POSTROUTING)
擴展匹配條件,需要加載模塊才能生效
隱式擴展:不需要手動加載擴展模塊,因爲他們爲協議的擴展所以但凡使用了-p 指明瞭協議,就表明已經指明瞭擴展模塊
顯式擴展:必須手動加載擴展模塊 [-m matchname [per-match-options]]
tcp:
--source-port 匹配報文源端口,或者源端口範圍
--sport
--destionation-port 匹配報文目標端口,或則目標端口範圍
--dport
--tcp-flags mask comp
例: --tcp-flags SYN,ACK,FIN,RST_SYN 表示要檢查的標誌位爲 SYN,ACK,FIN,RST_SYN四個,其中SYN必須爲1,其餘必須爲0
注:--SYN 用於匹配第一次握手,相當於--tcp-flags SYN,ACK,FIN,FIN,RST SYN
#iptables -A INPUT -p tcp --tcp-flags SYN,FIN,ACK SYN
#iptables -A FROWARD -p tcp --tcp-flags ALL SYN,ACK
上實例中第一個表示SYN、ACK、FIN的標誌都檢查,但是隻有SYN匹配。第二個表示ALL(SYN,ACK,FIN,RST,URG,PSH)的標誌都檢查,但是隻有設置了SYN和ACK的匹配。
udp:
--source-port 匹配報文源端口或者範圍
--sport
--destionation-port 匹配報文目標端口,可以爲範圍
--dport
icmp: --icmp-type {type|code}
0 表示響應報文
8 表示請求報文
例
允許你ping別人
#iptables -A OUTPUT -s 172.16.100.7 -p icmp -icmp-type 8 -j ACCEPT (ping往出走)
#iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 0 -j ACCEPT (ping往回走)
不允許別人ping你
# iptables -A OUTPUT -s 192.168.139.2 -p icmp --icmp-type 0 -j REJECT
# iptables -A INPUT -d 192.168.139.2 -p icmp --icmp-type 8 -j REJECT
你ping別人爲出8進0,別人ping你爲出0進8
處理動作:
-j target_name [per-target-options]
ACCEPT 接受
DROP 丟棄報文
REJECT 拒絕報文
RETURN 返回調用鏈
REDIRECT 端口重定向
LOG 記錄日誌
MARK 做防火牆標記
DNAT 做目標地址轉換
SNAT 做源地址轉換
MASQUERDE 地址僞裝
防火牆服務: service iptables start|stop|restart|status
默認規則文件:/etc/sysconfig/iptables
redhat7: systemctl start|stop|restart|status firewalld.service
#iptables -t nat -F PREROUTING (清空nat表的PREROUTING鏈)
[root@node1 ~]# iptables -L -n --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT icmp -- 192.168.139.2 0.0.0.0/0 cmp
2 REJECT icmp -- 192.168.139.2 0.0.0.0/0 icmp type 0 reject-with icmp-port-unreachable
[root@node1 ~]# iptables -D INPUT 5 將INPUT鏈上的第5個規則刪除
[root@node1 ~]# iptables -D OUTPUT 1
[root@node1 ~]# iptables -D OUTPUT 2
[root@node1 ~]# iptables -N mychain
[root@node1 ~]# iptables -L -n(自定義一個鏈叫mychain)
Chain mychain (0 references)
target prot opt source destination
[root@node1 ~]# iptables -X mychain 刪除自定義的規則mychain
[root@node1 ~]# iptables -t filter -A INPUT -s 192.168.139.4 -d 192.168.139.2 -j DROP
將來自192.168.139.4的所有包都丟掉,但192.168.139.4仍然可以ping通192.168.139.2
[root@node1 ~]# iptables -L -n --line-numbers -v
Chain INPUT (policy ACCEPT 6 packets, 468 bytes)
num pkts bytes target prot opt in out source destination
5 0 0 REJECT all -- * * 192.168.139.4 192.168.139.2
num:規則號
pkts:被本規則匹配到的報文個數
bytes:所有匹配的報文加起來的字節和
target:對目標處理的機制
prot:協議
opt:額外選項
in:從哪個網卡進來的;*代表從任意網卡
out:從哪個網卡出來的;*代表從任意網卡
sour:源地址
desti:目標地址
[root@node1 ~]# iptables -t filter -R INPUT 1 -s 192.168.139.4 -d 192.168.139.2 -p icmp -j REJECT
將filter表中,INPUT鏈上的第一號規則替換爲:拒絕來自192.168.139.4的icmp協議包
[root@node2 ~]# ping 192.168.139.2 用192.168.139.4ping不通
PING 192.168.139.2 (192.168.139.2) 56(84) bytes of data.
From 192.168.139.2 icmp_seq=1 Destination Port Unreachable
From 192.168.139.2 icmp_seq=2 Destination Port Unreachable
[root@node1 ~]# iptables -t filter -L -n --line-numbers -v
查看特定表(filter)上的規則
[root@node1 ~]# iptables -R INPUT 1 -s 192.168.139.4 -d 192.168.139.2 -p icmp -i eth0 -j DROP
將INPUT鏈上的第一號規則替換爲:將從eth0網卡進來的所有有關192.168.139.4的icmp報文都丟掉
[root@node2 ~]# ping 192.168.139.2 測試時一直卡在這裏,連Destination Port Unreachable都沒
PING 192.168.139.2 (192.168.139.2) 56(84) bytes of data.
[root@node2 ~]# iptables -t filter -A INPUT -s 192.168.139.4 -d 192.168.139.2 -p tcp --dport 22 -j DROP
不讓192.168.139.4訪問192.168.139.2(本機)的22號端口(即不能telnet本機)
[root@node2 ~]# rpm -ql iptables |grep "[[:lower:]]\+\.so$"
[[:lower:]]小寫字母 \+ 表示至少出現一次 \.so$ 表示以.so結尾
/lib64/xtables/libipt_icmp.so
/lib64/xtables/libxt_length.so
/lib64/xtables/libxt_limit.so
/lib64/xtables/libxt_string.so
/lib64/xtables/libxt_tcp.so
/lib64/xtables/libxt_time.so
/lib64/xtables/libxt_udp.so
......
上面全是系統自帶的用於擴展匹配的模塊
multiport擴展
指定多個源端端口 --source-ports, --sports
指定多個目標端口 --destionation-ports, --dports
[root@node2 ~]# iptables -t filter -A INPUT -s 192.168.139.0/16 -d 192.168.139.2 -p tcp -m multiport --dports 22,80 -j ACCEPT
允許192.168.139.0/16網段的主機訪問本機的22和80端口
2.iprange擴展
指明連續的(但一般不是整個網絡)IP地址範圍;
--src-range from- :源IP地址
--dst-range from- :目標IP地址
[root@node2 ~]# iptables -A INPUT -d 192.168.139.2 -p tcp --dport 80 -m iprange --src-range 192.168.139.1-192.168.139.20
允許192.168.139.1-192.168.139.20的主機訪問192.168.139.2的80端口
3.string擴展
對報文中的應用層數據做字符串模式匹配檢測(如檢測是否含有敏感字符)
--aglo {bm|kpm}:字符串匹配檢測算法
--string pattern:要檢測的字符串模式
[root@node2 ~]# iptables -t filter -A OUTPUT -s 192.168.139.2 -d 192.168.139.0/24 -p tcp --sport 80 -m string --algo bm --string "caonima" -j REJECT
注:數據包出時源爲本機
在OUTPUT鏈(在外出的鏈上進行filter匹配)上匹配"caonima"字符串
4.time擴展
根據報文到達的時間和指定的時間範圍進行匹配
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]
--datestop 結束時間
--datestart 開始時間
[root@node2 ~]# iptables -A INPUT -s 192.168.139.0/24 -d 192.168.139.2 -p tcp --dport 80 -m time --timestart 16:30 --timestop 16:30 --weekdays Sat,Sun -j DROP
注:Sat,Sun只有首字母大寫
本機的web服務在週六、周天的16:30-18:30時間段不允許192.168.139.0/24 網段的用戶訪問
5.connlimit擴展
根據每客戶端IP做併發連接數量匹配
--commlimit-upon n 連接數小於n的時候匹配
--commlimit-above n 連接數大於n時匹配
[root@node2 ~]# iptables -A INPUT -d 192.168.139.2 -p tcp --dport 21 -m connlimit --connlimit-above 2 -j REJECT
允許來自同一個客戶端的IP訪問本機的21號端口(ftp)最多三次
6.limit擴展
基於收發報文的速率匹配 --limit rate [/second|/minute|/hour|/day] 平均速率
令牌桶過濾器 --limit-burst number 峯值速率
[root@node2 ~]# iptables -A INPUT -d 192.168.139.2 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT
允許對192.168.139.2(本機)每分鐘ping三次,第一次ping五次
7.state擴展
根據連接追蹤機制去檢查連接的狀態,與tcp協議無關,是在IP層有netfilter在內核中實現的,將訪問者的ip,訪問目標記錄在內核中
如何判斷從本地發出的響應時主動與別人連接還是隻是對別人的請求發出響應?
用cootrack機制:追蹤本機的請求和響應之間的關係
狀態有以下幾種:
NEW:新發出的請求,第一次發出的請求
ESTABLISHED:NEW狀態後,連接追蹤模板中爲其建立的條目失效之前
RELATED:相關聯的連接,如ftp協議命令連接和數據連接之間的關係
INVALID:無法識別的連接,無效連接
UNTRACKED:未進行追蹤的連接
例:本地web服務器正常情況下只開放80端口進行用戶請求的響應,而不應該主動去連接客戶端。如果主動開放80端口與其他主機相連,則很有可能中了反彈射***;這是你可以用iptables設定值允許本地80端口的報文只能是響應(ESTABLISHED)狀態,而不能爲NEW狀態
[root@node1 ~]# iptables -A INPUT -d 192.168.139.2 -p tcp -m multiport --dports 20,80 -m state --state NEW,ESTABLISHED -j ACCEPT
進入本機的報文可以通過本機的20和80端口進入,且報文狀態必須爲NEW/ESTABLISHED
[root@node1 ~]# iptables -A OUTPUT -s 192.168.139.2 -p tcp -m multiport --sports 20,80 -m state --state ESTABLISHED -j ACCEPT
從本機出去的報文可以通過本機的20,80端口出去,但是報文狀態必須爲ESTABLISHED
自定義鏈:需要被內置鏈調用才能生效,自定義鏈需要定義返回規則,target爲RETURN
#iptables -A INPUT -d 192.168.139.2 -p icmp -j in-icmp (轉爲自定義的鏈in-icmp)
[root@node1 ~]# iptables -N clean_in
創建一個叫clean_in的自定義鏈
[root@node1 ~]# iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
[root@node1 ~]# iptables -A clean_in -d 192.168.139.255 -p icmp -j DROP
[root@node1 ~]# iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP
將syn不是1,但是狀態爲new的都丟棄
[root@node1 ~]# iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
[root@node1 ~]# iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
[root@node1 ~]# iptables -A clean_in -d 192.168.139.2 -j RETURN 都沒有匹配返回主鏈
[root@node1 ~]# iptables -I INPUT -j clean_in 一進入INPUT鏈,先跳轉到clean_in自定義鏈進行處理
[root@node1 ~]# iptables -L -n --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 clean_in all -- 0.0.0.0/0 0.0.0.0/0
2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
Chain clean_in (1 references)
num target prot opt source destination
1 DROP icmp -- 0.0.0.0/0 255.255.255.255
2 DROP icmp -- 0.0.0.0/0 192.168.139.255
3 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp flags:!0x17/0x02 state NEW
4 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp flags:0x3F/0x3F
5 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp flags:0x3F/0x00
6 RETURN all -- 0.0.0.0/0 192.168.139.2
[root@node1 ~]# iptables -X clean_in
iptables: Too many links.
會發現,刪除不掉,有引用必須取消引用,且要爲空鏈才能刪除
利於iptables的recent模塊低於DOS***
–name #設定列表名稱,默認DEFAULT。
–rsource #源地址,此爲默認。
–rdest #目的地址
–seconds #指定時間內
–hitcount #命中次數
–set #將地址添加進列表,並更新信息,包含地址加入的時間戳。
–rcheck #檢查地址是否在列表,以第一個匹配開始計算時間。
–update #和rcheck類似,以最後一個匹配計算時間。
–remove #在列表裏刪除相應地址,後跟列表名稱及地址。
限制80端口60秒內每個IP只能發起10個新連接,超過記錄日記並丟失數據包,可防CC及非僞造IP的syn flood
[root@node1 ~]# iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j LOG --log-prefix 'DDOS:' --log-ip-options
每個IP目標端口爲80的新連接會記錄在案,可在/proc/net/xt_recent/webpool中查看,rcheck檢查此IP是否在案及請求次數,如果超過規則就丟棄數據包,否則進入下條規則並更新列表信息。
爲了方便地對日誌進行分析,可加上適當的記錄日誌前綴,即在IPtables中使用LOG選項,通過LOG 選項打開匹配數據包的內核記錄功能。LOG 選項的子選項 --log-prefix 用來給記錄信息添加一個消息前綴,這個前綴可設達 29 個字符。添加前綴的目的只是爲了更好的辨別記錄信息,比如更容易用 grep 這種工具過濾出匹配的記錄信息。
限制80端口60秒內每個IP只能發起10個新連接,超出後會丟棄
[root@node1 ~]#iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j DROP
將80端口的新連接的IP地址都添加進列表,並跟新信息,包含地址加入的時間戳,但會接受連接
[root@node1 ~]#iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --set -j ACCEPT
NAT:network address translation(網絡地址轉換)
DNAT:目標地址轉換
SNAT: 源地址轉換
NAT:一個區域內只有一個主機可以訪問換臉網(擁有公網IP),這是這個區域內的所有主機都可以將請求先發給這個擁有公網IP的主機,然後做一個SNAT,將報文的源IP改成這個公網IP,而報文不反悔時,NAT服務器通過查看記錄的NAT表再做一個DNAT,將目標IP換成真正的主機IP,從而就可以上區域內的所有主機都實現上網
/proc/sys/net/ipv4/ip_forward == 1 則Linux服務器就具備了路由轉發功能,這樣可以讓兩個不同網段的主機(如192.16.10.0/24和172.16.0.0/16)通過linux服務器的轉發實現通信,但這個服務器要有兩個網卡,一個網卡的IP在192.16.10.0/24網段,另一個IP在172.16.0.0/16網段,這樣就具備了路由轉發功能
-j SNAT
--to-source 指定轉換的源地址
#iptables -t -nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.7
來自192.168.10.0/24網段的都將源地址轉換爲172.16.100.7(172.16.100.7爲公網ip)
例:教室中學生IP爲192.168.0.0/24網段,通過ADSL進行撥號上網IP:123.2.3.2
#iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 123.2.3.2
#iptables -t nat -A postROUTING -s 192.168.0.0/24 -O ppp0 -j SNAT --to-source 123.2.3.2
-O指定從哪個網卡出來,只有訪問互聯網時,纔會使用ADSL的撥號網卡ppp0,如果有兩個網卡則爲ppp0,ppp1....
當有多個可以轉換的IP時:
-j SNAT --to-source 123.2.3.2-123.2.3.5
則會將源地址轉換成其中的任意一個IP
但是每次的撥號上網,地址可能會發生改變,咋辦?
-j NAT 有個跟高級的 -j MASQUERADE
只有外網ip動態獲取時使用
綜合例子:
172.16.100.7上(NAT SERVER)
1.
#iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
對所有已經建立的連接都通過
2.
#iptables -A FORWARD -s 192.168.10.0/24 -p tcp --dport 80 -m state --state NEW -j ACCEPT
對所有tcp的80端口新建立的連接都放行(允許其上網)
3.
#iptables -A FORWARD -s 192.168.0.0/24 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
192.168.0.0/24中的主機ping會將其轉發給網段內主機,但是其他網段的向ping網段內的主機都會被前2個規則過濾掉
1、2、3規則允許192.168.10.0/24網段的所有主機上網,且允許其內部互ping,但不能通過外網訪問192.168.0.0/24任意主機上的任意端口(服務)
4.
#iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
允許轉發已經建立的連接和相關聯的連接
RELATED:相關聯的鏈接,如ftp協議中命令鏈接數據鏈接之間的關係
5.
#iptables -A FORWARD -s 192.168.139.0/24 -p tcp --dport 21 -m state --state NEW -j ACCEPT
允許轉發192.168.139.0/24網段訪問21端口的建立新連接(ftp)
DNAT:目標地址轉換
如我的內部網內有一臺web服務器(192.168.0.22)和一臺ftp服務器(192.168.10.23),web服務器和NAT服務器可以通信(172.16.100.7爲一個公有IP),外部的主機可以通過訪問172.16.100.7這個ip訪問NAT服務器,如果請求的爲80端口,則NAT服務器將請求報文做一個DNAT(將請求報文的目標地址由172.16.100.7換成192.168.0.22),轉發至192.168.0.22web服務器,如果請求的爲21端口,則NAT服務器做一個DNAT轉換,將請求報文轉發至192.168.0.23ftp服務器
#iptables -t nat -A PREROUTING -d 172.16.100.7 -p tcp --dport 80 -j DNAT --to-destionation 192.168.10.22
任何請求172.16.100.7的80端口的請求都轉發至192.168.10.22主機
注:172.10.100.7只是一個NAT服務器,真正提供服務的爲192.168.10.22主機
而且還支持端口轉換
#iptables -t nat -A PREROUTONG -d 172.16.100.7 -p tcp --dport 80 -j DNAT --to-destionation 192.168.10.22:8080
任何請求172.16.100.7的80端口的請求都轉發至192.168.10.22的8080端口
#iptables -t nat -A PREROUTING -d 172.16.100.7 -p tcp --dport 21 -j DNAT --to -destionation 192.168.10.22
任何請求172.16.100.7的80端口的請求都轉發至192.168.10.23
如果要採取字符串匹配,則可以在NAT服務器的forward上設置
主:只有爲轉發就不能再INPUT|OUTPUT上設置
#iptables -t nat -A FORWARD -m string --aglo kmp --string "SB" -j DROP
任何包含“SB”的報文都丟棄