前文咱們講了iptables的擴展匹配,一些經常使用的擴展模塊以及它的專有選項的使用和說明,回顧請參考http://www.javashuo.com/article/p-vfhrxjrp-bc.html;今天咱們來講說iptables的處理動做;iptables的處理動做分基本處理動做和擴展處理動做,基本處理動做有ACCEPT和DROP 這兩個動做很好理解,一個表示放行操做,一個表示丟棄操做。擴展處理動做有REJECT,這個動做表示拒絕,一般狀況下建議都用DROP 去丟棄不想經過的報文,REJECT這個處理動做,它表示明確的拒絕,而且它會給拒絕的報文一個迴應消息;RETURN表示返回,RETURN經常使用於自定義鏈上,用於返回主鏈。接下來咱們一一來介紹LOG、SNAT、DNAT、MASQUERADE、REDIRECT這些擴展處理動做的用法,以及一些經常使用選項的說明;html
基本處理動做這裏就很少說了,無外乎就是放行和丟棄操做。想必你們都會用,這裏着重介紹擴展處理動做的用法,廢話很少說,下面咱們來看看擴展處理動做的用法。前端
一、LOG,此處理動做用於記錄日誌,它能夠幫咱們哪些報文來請求過咱們服務器,並經過日誌的形式記錄到日誌文件中。默認狀況LOG處理動做將日誌記錄在/var/log/messages系統日誌中(事實上它是把日誌交給rsyslog,若是咱們沒有更改rsyslog的配置,默認是記錄到/var/log/messages);它是非中斷處理動做,也就是說它自己不作容許或拒絕操做,爲了能匹配更多的報文,咱們能夠把此處理動做規則放在那些容許和拒絕規則以前,這樣一來就能夠記錄來訪咱們服務器的報文在容許或拒絕以前的全部報文,方便往後分析日誌。node
--log-level level ,此選項表示定義日誌的級別,這個日誌級別同rsyslog的日誌級別相似,日誌級別有debug、info、notice、warning、error、crit、alert、emerg,有關日誌級別的說明請參考http://www.javashuo.com/article/p-wobakswo-m.htmlweb
--log-prefix prefix,此選項表示定義日誌的前綴信息,用於區別不一樣的日誌,最多29個字符數據庫
示例,記錄來訪本機的80端口的報文日誌,日誌級別是info,日誌前綴爲「web log」後端
[root@test ~]# iptables -nvL Chain INPUT (policy DROP 241 packets, 19880 bytes) pkts bytes target prot opt in out source destination 772 108K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED 65 3920 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 80,3306,41319 state NEW 35 13283 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy DROP 2 packets, 144 bytes) pkts bytes target prot opt in out source destination 847 269K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED 23 1604 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0 [root@test ~]# iptables -I INPUT 1 -p tcp --dport 80 -j LOG --log-level info --log-prefix "web log" [root@test ~]# iptables -nvL Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 LOG tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 LOG flags 0 level 6 prefix "web log" 1000 124K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED 65 3920 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 80,3306,41319 state NEW 35 13283 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 993 284K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED 23 1604 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0 [root@test ~]#
測試:咱們用本機訪問80端口,看看/var/log/messages系統日誌會不記錄咱們訪問80端口的報文centos
[root@test ~]# curl -I http://192.168.0.99/loganalyzer HTTP/1.1 301 Moved Permanently Date: Sun, 09 Feb 2020 05:58:40 GMT Server: Apache/2.4.6 (CentOS) PHP/5.4.16 Location: http://192.168.0.99/loganalyzer/ Content-Type: text/html; charset=iso-8859-1 [root@test ~]# curl -I http://192.168.0.99/loganalyzer HTTP/1.1 301 Moved Permanently Date: Sun, 09 Feb 2020 05:58:48 GMT Server: Apache/2.4.6 (CentOS) PHP/5.4.16 Location: http://192.168.0.99/loganalyzer/ Content-Type: text/html; charset=iso-8859-1 [root@test ~]# tail /var/log/messages Dec 24 21:43:07 test systemd: Started System Logging Service. Dec 24 23:26:04 test systemd: Stopping System Logging Service... Dec 24 23:26:04 test rsyslogd: [origin software="rsyslogd" swVersion="8.24.0-41.el7_7.2" x-pid="16136" x-info="http://www.rsyslog.com"] exiting on signal 15. Dec 24 23:26:04 test systemd: Stopped System Logging Service. Dec 24 23:26:04 test systemd: Starting System Logging Service... Dec 24 23:26:04 test rsyslogd: [origin software="rsyslogd" swVersion="8.24.0-41.el7_7.2" x-pid="16359" x-info="http://www.rsyslog.com"] start Dec 24 23:26:04 test rsyslogd: action '*' treated as ':omusrmsg:*' - please use ':omusrmsg:*' syntax instead, '*' will not be supported in the future [v8.24.0-41.el7_7.2 try http://www.rsyslog.com/e/2184 ] Dec 24 23:26:04 test systemd: Started System Logging Service. Dec 24 23:26:04 test rsyslogd: error during parsing file /etc/rsyslog.conf, on or before line 76: warnings occured in file '/etc/rsyslog.conf' around line 76 [v8.24.0-41.el7_7.2 try http://www.rsyslog.com/e/2207 ] Dec 24 23:26:13 test-node1 qiuhom: i am test-node1 [root@test ~]#
提示:咱們訪問兩次,在/var/log/messages系統日誌文件中卻沒有記錄咱們訪問80端口的報文日誌,這是爲何呢?防火牆規則寫的不對嗎?咱們來看看咱們防火牆規則是否匹配到報文?bash
提示:咱們查看防火牆規則,咱們剛纔寫的規則是匹配到有規則呀,可是/var/log/messges日誌文件中爲何沒有記錄呢?咱們在來看看rsyslog的配置文件吧服務器
提示:看了rsyslog的配置文件終於明白了,防火牆把日誌交給rsyslog,rsyslog它的配置文件中定義了把任何設施級別爲info的日誌都存放在數據庫裏了。那咱們來看看數據庫裏是否有呢網絡
提示:本人用的是rsyslog的前端展現工具loganalyzer,這個工具本質就是把rsyslog日誌從數據庫裏讀出來,而後展現給用戶。咱們從上面的信息能夠看到咱們用本機去訪問80端口的報文日誌,以及咱們定義的日誌前綴。從上面的日誌信息咱們還了解到,咱們數據報文所走的流入接口是lo,日誌的facillity是KERN(內核)。
固然咱們還能夠基於某種報文的狀態來記錄日誌,例如,咱們就只想記錄狀態爲NEW的報文
[root@test ~]# iptables -nvL Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 368 71198 LOG tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 LOG flags 0 level 6 prefix "web log" 4227 656K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED 127 7438 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 80,3306,41319 state NEW 35 13283 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy DROP 20 packets, 1430 bytes) pkts bytes target prot opt in out source destination 4130 1134K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED 53 3418 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0 [root@test ~]# iptables -R INPUT 1 -p tcp -m state --state NEW -j LOG --log-level info --log-prefix "status NEW" [root@test ~]# iptables -nvL Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 LOG tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW LOG flags 0 level 6 prefix "status NEW" 4304 662K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED 127 7438 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 80,3306,41319 state NEW 35 13283 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 4196 1141K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED 53 3418 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0 [root@test ~]#
提示:咱們把原來的規則給更改爲狀態爲NEW的是訪問我本機說明服務都給記錄下來
測試,咱們用192.168.0.151 去訪問咱們的web服務,咱們在loganalyzer裏看看,有沒有記錄到狀態爲NEW的報文日誌
提示:從上面的信息看,咱們是匹配到了兩個包,咱們在loganalyzer裏在看看呢
提示:能夠看到loganalyzer裏是記錄了咱們用192.168.0.151 訪問80端口且狀態爲NEW的報文
二、NAT它的全稱是network address translation,意思是網絡地址轉換,不難理解此處理動做用於轉換地址所用的處理動做,它一般用於PREROUTING,INPUT,OUTPUT,POSTROUTING這四個主鏈上。咱們能夠用iptables -t nat -nvL 命令來查看nat表所在的全部鏈的規則狀況,從而知道nat表的規則只用於這四個主鏈上。
SNAT,此處理動做表示源地址轉換,一般在POSTROUTING鏈上作SNAT,主要做用是讓本地網絡中的主機經過某一特定地址訪問外部網絡,實現地址假裝。
提示:SNAT的TOP圖如上所示,內網主機要上互聯網,必須經過防火牆將其源地址更改成可以訪問互聯網的ip地址FWIP0。報文走向流程是這樣的,內網主機向遠端服務器發送請求,其報文段源IP是內網主機自己的ip,目標ip是遠端服務器的ip,當報文到達防火牆時,防火牆一看,目標地址不是本身,而後它就把報文經過路由從FORWARD鏈上給轉發出去了,在報文經過FORWARD鏈後,咱們就要在防火牆的POSTROUTING鏈上明確說明,源地址爲172.16.0.0/16的報文,訪問外部主機,必須給修改爲192.168.0.11,也就是防火牆可以上互聯網的IP ,這樣一修改後,從防火牆出去的報文源IP就是防火牆的外網IP(FWIP0),經過互聯網的層層路由報文終於到達了目標服務器,目標服務器收到報文,一看是訪問它本機的,而後它就把報文給拆了,拿到客戶端請求的內容,而後它就開始響應客戶端,響應時,它把本身的SIP當源地址,FWIP0即防火牆外網ip當目標ip給封裝好,從本身的網卡發出去,一樣回來的報文,經過互聯網的層層路由,相應報文到達防火牆後,一看是本身的報文,而後它就把響應報文給收下了,而後它會去查它本機自動維護的一個NAT表,這個表記錄着那個客戶端的源地址,源端口,和目標地址,目標端口等信息的一個對應表,它一看源IP爲172.16.0.10源端口爲55114的客戶端主機,請求了192.168.0.20的80端口,而後對比本身收到的報文,它就把本身剛纔收到的源地址爲192.168.0.20源端口爲80的報文給修改爲源地址爲192.168.0.20,源端口爲80,目標地址爲172.16.0.10目標端口爲55114,而後經過FORWARD鏈把報文發送給客戶端,客戶端收到防火牆發來的報文,而後拆開數據包拿到服務器的響應。這就是SNAT報文從客戶端到遠端服務端,服務端響應回來的報文過程。這裏須要注意一點的是,服務端響應回來的數據包到達防火牆,防火牆修改目標地址的過程是NAT自身的功能,咱們不須要作額外的配置,換句話說咱們只關心出去的報文就行,回來的報文NAT會自動維持一個NAT會話表,自動把響應報文修改爲咱們客戶端的ip發送給客戶端。
瞭解了SNAT的報文走向,接下來咱們來配置防火牆,讓其內部主機可以經過SNAT去訪問遠端服務器
提示:在內網主機上咱們ping遠端服務器上ping 不通的
提示:在防火牆主機上是能夠正常訪問遠端服務器
接下來咱們要在防火牆主機上打開轉發,並在其防火牆的POSTROUTING作SANT ,把172.16.0.0/16的源地址更改成192.168.0.11
[root@test-centos6-node1 ~]# cat /proc/sys/net/ipv4/ip_forward 0 [root@test-centos6-node1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward [root@test-centos6-node1 ~]# cat /proc/sys/net/ipv4/ip_forward 1 [root@test-centos6-node1 ~]# iptables -nvL -t nat Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination [root@test-centos6-node1 ~]# iptables -t nat -A POSTROUTING -s 172.16.0.0/24 -j SNAT --to-source 192.168.0.11 [root@test-centos6-node1 ~]# iptables -nvL -t nat Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 SNAT all -- * * 172.16.0.0/24 0.0.0.0/0 to:192.168.0.11 Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination [root@test-centos6-node1 ~]#
提示:SNAT 只能在nat表上作,咱們開啓了防火牆的核心轉發,同時在POSTROUTING鏈上的nat表上添加了一條 源地址爲172.16.0.0/16網段的主機經過時,咱們就將其源地址更給爲192.168.0.11,接下來咱們在內網主機上訪問遠端服務器看看是否是可以訪問呢
提示:能夠看到內網主機上能夠正常的訪問遠端服務器了
咱們在防火牆上抓包看看,數據報文的走向
提示:咱們能夠看到,當報文到達eth1時,源ip和目標ip都未發生改變。通過eht1到達eth0時,報文段源ip變成了192.168.0.11,目標ip沒有發生變化仍是192.168.0.20.服務端收到報文響應回來在防火牆,eth0相應報文段源ip是192.168.0.20,目標IP是192.168.0.11,響應報文經過eth0後,到達eth1響應報文的源ip沒有發生變化仍是192.168.0.20,目標ip卻變成了172.16.0.10,經過這一過程,想必你們對SNAT的工做機制有了很好的瞭解。
--to-source [ipaddr[-ipaddr]][:port[-port]],此選項表示指定SNAT後的源地址,它能夠說一個網絡地址範圍,當防火牆上有多個外網ip時 咱們能夠指定其一個網絡地址範圍;以下
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24 -j SNAT --to-source 172.18.1.6-172.18.1.9
提示:以上規則表示在POSTROUTING 鏈上的nat標上增長一條源地址爲10.0.1.0/24的ip地址 目標地址非10.0.1.0/24的ip地址,都作源地址轉換,轉換源地址爲172.18.1.6-172.18.1.9,這樣設置規則後,當報文匹配到後,防火牆會在172.18.1.6-172.18.1.9中順序去轉換源地址,也就說第一個報文來了,它會把源地址更改成172.18.1.6,第二個報文來了它會把源地址更改成172.18.1.7,依次輪循。
--random 此選項會任意的從地址池裏任意挑選一個給客戶端請求報文作源地址轉換。
--persistent 此選項會從地址池中輪詢的方式給客戶端固定其轉換後的源地址,好比第一個客戶端報文來了,第一次防火牆會把172.18.1.6這個地址作SNAT給第一個客戶端,其後只要是同一客戶端,它都會拿這個地址給作SNAT,同理第二個客戶端第一次作地址轉換後的地址是172.18.0.7,那麼它後面無論第幾回來,都會被轉換成172.18.0.7這個地址。一般狀況--random和--persistent這兩個選項用得不多。
DNAT,此處理動做表示目標地址轉換,一般在PREROUTING鏈上作DNAT,主要做用是把本地網絡中的主機上的某服務開放給外部網絡訪問(發佈服務和端口映射),但隱藏真實IP。
提示:DNAT的TOP圖如上所示,客戶端要訪問遠端服務器,經過互聯網層層路由,到達服務器所在網絡的防火牆上,當防火牆收到來自客戶端的請求報文,在入站的一瞬間,咱們須要在防火牆的PREROUTING鏈上配置其目標地址爲192.168.0.11,目標端口爲21的報文,把其目標地址更改成172.16.0.12,端口更改成80。(這裏的端口能夠修改也可不修改,這個要看本身的環境,我這裏以要修改端口爲例)由於在入站的最開始就把目標地址給轉換爲後端服務器的地址後,修改後的報文就不會到防火牆的INPUT鏈上去了,它會直接經過FORWARD鏈從POSTROUTING鏈出去,最後報文到達對應的服務器網卡上,服務器收到來自客戶端的請求報文,一看是本身的ip,而後就拆報文,而後響應客戶端,封裝回應報文,此時,服務器會把本身的IP地址封裝成源ip,客戶端的ip封裝成目標ip而後發出去,當響應報文來到防火牆時,防火牆收到服務端的響應報文,一看源地址是服務端的,這個時候它會像SANT同樣,它自己也維護了一張nat會話表,這個表記錄了源ip 源端口 目標ip 目標端口 更改後的目標地址ip 更改後的目標端口等等信息,防火牆一查本身的NAT會話表,一看有一條源地址是192.168.0.10 源端口爲52113 目標地址爲192.168.0.11 目標端口爲21的記錄,而後對比本身剛纔收到的報文,它就會把響應報文修改源地址和源端口,把響應報文的源地址,修改爲以前客戶端請求的目標地址,把響應報文裏的源端口修改爲客戶端以前請求的目標端口,而後再發送給客戶端,當客戶端收到響應報文時,一看目標地址是本身,而後客戶端就開始拆包,從而獲得服務端的響應內容。DNAT和SNAT是相似的,回來的響應報文作源地址轉換時DNAT本身根據記錄的nat會話表更改,這個是NAT自身的鏈接追蹤功能呢,咱們不須要手動配置。也就是說作目標地址轉換咱們只關心把目標地址更換成那個,後續的響應報文會自動的作源地址轉換。
瞭解了DNAT的報文流向,接下來咱們就以上面的TOP圖來準備環境,實現DNAT
在沒有配置防火牆規則時,咱們客戶端直接訪問192.168.0.11看看能不能訪問到後端服務?
提示:在防火牆上沒有配置DNAT規則時,咱們能夠看到客戶端主機上沒有辦法訪問到後端服務的,防火牆是能夠正常訪問後端服務的
在防火牆上添加規則,訪問 192.168.0.11的報文都把其目標地址更改成172.16.0.12
[root@test-centos6-node1 ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:c8:fe:46 brd ff:ff:ff:ff:ff:ff inet 192.168.0.11/24 brd 192.168.0.255 scope global eth0 inet6 fe80::20c:29ff:fec8:fe46/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:c8:fe:50 brd ff:ff:ff:ff:ff:ff inet 172.16.0.11/16 brd 172.16.255.255 scope global eth1 inet6 fe80::20c:29ff:fec8:fe50/64 scope link valid_lft forever preferred_lft forever [root@test-centos6-node1 ~]# iptables -t nat -nvL Chain PREROUTING (policy ACCEPT 3 packets, 180 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 1 packets, 60 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 1 packets, 60 bytes) pkts bytes target prot opt in out source destination [root@test-centos6-node1 ~]# iptables -t nat -A PREROUTING -d 192.168.0.11 -j DNAT --to-destination 172.16.0.12 [root@test-centos6-node1 ~]# iptables -t nat -nvL Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 DNAT all -- * * 0.0.0.0/0 192.168.0.11 to:172.16.0.12 Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination [root@test-centos6-node1 ~]#
測試:用客戶端訪問 192.168.0.11 看看能不能訪問到後端的服務?
提示:能夠看到在防火牆添加規則後,客戶端就能夠訪問到後端的服務了,咱們在防火牆上抓包看看,報文的走向
提示:能夠看到當客戶端向服務端發起請求時,客戶端請求報文到達防火牆的eth0時源ip是192.168.0.10 目標ip是192.168.0.11,當報文到達eth1時,報文的源ip仍是192.168.0.10 目標ip卻變成了172.16.0.12,固然服務端響應報文的到達eth1時,它的源ip是172.16.0.12 目標ip是192.168.0.10,當響應報文從eth1到eth0時,它的源ip變成了192.168.0.11,目標ip變成了192.168.0.10。這就是咱們說的DNAT 它響應報文會根據本身維護的nat會話表裏的數據,來自動做源地址轉換。
三、MASQUERADE:此處理動做用於源地址轉換的場景,在作源地址轉換時,咱們轉換後端源地址常常發生變化,如動態IP,如撥號網絡。在這樣的網絡環境中咱們作源地址轉換就可使用這個動做,它的工做流程是沒作一次源地址轉換它就要去掃描一下可用的IP和端口,而後再作源地址轉換。
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24 -j MASQUERADE
提示:以上規則表示,在POSTROUTING鏈上的nat表上增長一條規則,匹配源地址爲10.0.1.0/24網絡裏的ip地址,且目標地址不是10.0.1.0/24的網段的ip地址時,就作源地址轉換,這個源地址具體轉換成那個,這個就要看報文經過時掃描出來的對外地址是多少就轉換成多少。
四、REDIRECT,此動做用於PREROUTING OUTPUT 鏈上的nat表上,主要用於經過改變目標IP和端口,將接受的包轉發至不一樣端口,一般用於端口映射。
--to-ports port[-port],此選項表示指定要使用的目標端口或端口範圍,若是不指定,目標端口是不會發生變化的,而且這個僅用於協議爲tcp、udp、dccp、sctp
測試,把本機httpd服務監聽端口更改成8080,而後客戶端經過訪問80,在其防火牆上對來訪的80端口的報文加以更改目標端口爲8080
提示:在防火牆上沒有添加任何規則是,咱們客戶端只能經過8080去訪問服務端,如今咱們在防火牆上增長一條規則,讓其來訪80的端口的報文,去訪問8080
[root@test ~]# iptables -t nat -nvL Chain PREROUTING (policy ACCEPT 8 packets, 396 bytes) pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 5 packets, 300 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 4 packets, 336 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 4 packets, 336 bytes) pkts bytes target prot opt in out source destination [root@test ~]# iptables -t nat -A PREROUTING -d 192.168.0.99 -p tcp --dport 80 -j REDIRECT --to-ports 8080 [root@test ~]# iptables -t nat -nvL Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 REDIRECT tcp -- * * 0.0.0.0/0 192.168.0.99 tcp dpt:80 redir ports 8080 Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination [root@test ~]#
測試:用客戶端去訪問192.168.0.99的80端口,看看是否是可以訪問到8080所對應的服務
提示:能夠看到客戶端去訪問80端口和訪問8080端口的服務都是同樣的內容。