1. 程式人生 > >Linux防火牆之iptables常用擴充套件處理動作

Linux防火牆之iptables常用擴充套件處理動作

  前文我們講了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埠的服務都是一樣的內