
LOG,此處理動作用于記錄日志,它可以幫我們哪些封包來請求過我們伺服器,并通過日志的形式記錄到日志檔案中。預設情況LOG處理動作将日志記錄在/var/log/messages系統日志中(事實上它是把日志交給rsyslog,如果我們沒有更改rsyslog的配置,預設是記錄到/var/log/messages);它是非中斷處理動作,也就是說它本身不做允許或拒絕操作,為了能比對更多的封包,我們可以把此處理動作規則放在那些允許和拒絕規則之前,這樣一來就可以記錄來訪我們伺服器的封包在允許或拒絕之前的所有封包,友善日後分析日志。
前文我們講了iptables的擴充比對,一些常用的擴充子產品以及它的專有選項的使用和說明,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/12285152.html;今天我們來說說iptables的處理動作;iptables的處理動作分基本處理動作和擴充處理動作,基本處理動作有ACCEPT和DROP 這兩個動作很好了解,一個表示放行操作,一個表示丢棄操作。擴充處理動作有REJECT,這個動作表示拒絕,通常情況下建議都用DROP 去丢棄不想通過的封包,REJECT這個處理動作,它表示明确的拒絕,并且它會給拒絕的封包一個回應消息;RETURN表示傳回,RETURN常用于自定義鍊上,用于傳回主鍊。接下來我們一一來介紹LOG、SNAT、DNAT、MASQUERADE、REDIRECT這些擴充處理動作的用法,以及一些常用選項的說明;
基本處理動作這裡就不多說了,無外乎就是放行和丢棄操作。想必大家都會用,這裡着重介紹擴充處理動作的用法,廢話不多說,下面我們來看看擴充處理動作的用法。
1、LOG,此處理動作用于記錄日志,它可以幫我們哪些封包來請求過我們伺服器,并通過日志的形式記錄到日志檔案中。預設情況LOG處理動作将日志記錄在/var/log/messages系統日志中(事實上它是把日志交給rsyslog,如果我們沒有更改rsyslog的配置,預設是記錄到/var/log/messages);它是非中斷處理動作,也就是說它本身不做允許或拒絕操作,為了能比對更多的封包,我們可以把此處理動作規則放在那些允許和拒絕規則之前,這樣一來就可以記錄來訪我們伺服器的封包在允許或拒絕之前的所有封包,友善日後分析日志。
--log-level level ,此選項表示定義日志的級别,這個日志級别同rsyslog的日志級别類似,日志級别有debug、info、notice、warning、error、crit、alert、emerg,有關日志級别的說明請參考https://www.cnblogs.com/qiuhom-1874/p/12091118.html
--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端口的封包
[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端口的封包日志,這是為什麼呢?防火牆規則寫的不對嗎?我們來看看我們防火牆規則是否比對到封包?
提示:我們檢視防火牆規則,我們剛才寫的規則是比對到有規則呀,但是/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的封包
2、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會話表裡的資料,來自動作源位址轉換。
3、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位址時,就做源位址轉換,這個源位址具體轉換成那個,這個就要看封包通過時掃描出來的對外位址是多少就轉換成多少。
4、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端口的服務都是一樣的内容。
作者:Linux-1874
出處:https://www.cnblogs.com/qiuhom-1874/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利.