天天看點

Iptables 規則用法小結

iptables是組成Linux平台下的包過濾防火牆,與大多數的Linux軟體一樣,這個包過濾防火牆是免費的,它可以代替昂貴的商業防火牆解決方案,完成封包過濾、封包重定向和網絡位址轉換(NAT)等功能。在日常Linux運維工作中,經常會設定iptables防火牆規則,用來加強服務安全。以下對iptables的規則使用做了總結性梳理:

iptables首先需要了解的:

1)規則概念

規則(rules)其實就是網絡管理者預定義的條件,規則一般的定義為“如果資料標頭符合這樣的條件,就這樣處理這個資料包”。規則存儲在核心空間的資訊 包過濾表中,這些規則分别指定了源位址、目的位址、傳輸協定(如TCP、UDP、ICMP)和服務類型(如HTTP、FTP和SMTP)等。

當資料包與規則比對時,iptables就根據規則所定義的方法來處理這些資料包,如放行(accept),拒絕(reject)和丢棄(drop)等。配置防火牆的主要工作是添加,修改和删除等規則。

其中:

比對(match):符合指定的條件,比如指定的 IP 位址和端口。

丢棄(drop):當一個包到達時,簡單地丢棄,不做其它任何處理。

接受(accept):和丢棄相反,接受這個包,讓這個包通過。

拒絕(reject):和丢棄相似,但它還會向發送這個包的源主機發送錯誤消息。這個錯誤消息可以指定,也可以自動産生。

目标(target):指定的動作,說明如何處理一個包,比如:丢棄,接受,或拒絕。

跳轉(jump):和目标類似,不過它指定的不是一個具體的動作,而是另一個鍊,表示要跳轉到那個鍊上。

規則(rule):一個或多個比對及其對應的目标。

2)iptables和netfilter的關系:

Iptables和netfilter的關系是一個很容易讓人搞不清的問題。很多的知道iptables卻不知道 netfilter。其實iptables隻是Linux防火牆的管理工具而已,位于/sbin/iptables。真正實作防火牆功能的是 netfilter,它是Linux核心中實作包過濾的内部結構。

3)iptables的規則表和鍊

表(tables):提供特定的功能,iptables内置了4個表,即filter表、nat表、mangle表和raw表,分别用于實作包過濾,網絡位址轉換、包重構(修改)和資料跟蹤處理。

鍊(chains):是資料包傳播的路徑,每一條鍊其實就是衆多規則中的一個檢查清單,每一條鍊中可以有一 條或數條規則。當一個資料包到達一個鍊時,iptables就會從鍊中第一條規則開始檢查,看該資料包是否滿足規則所定義的條件。如果滿足,系統就會根據 該條規則所定義的方法處理該資料包;否則iptables将繼續檢查下一條規則,如果該資料包不符合鍊中任一條規則,iptables就會根據該鍊預先定 義的預設政策來處理資料包。

Iptables采用“表”和“鍊”的分層結構,在Linux中現在是四張表五個鍊。下面羅列一下這四張表和五個鍊(注意一定要明白這些表和鍊的關系及作用)。

Iptables 規則用法小結

規則表:

    1)filter表——三個鍊:INPUT、FORWARD、OUTPUT

作用:過濾資料包 核心子產品:iptables_filter.

    2)Nat表——三個鍊:PREROUTING、POSTROUTING、OUTPUT

作用:用于網絡位址轉換(IP、端口) 核心子產品:iptable_nat

    3)Mangle表——五個鍊:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD

作用:修改資料包的服務類型、TTL、并且可以配置路由實作QOS核心子產品:iptable_mangle(别看這個表這麼麻煩,咱們設定政策時幾乎都不會用到它)

   4)Raw表——兩個鍊:OUTPUT、PREROUTING

作用:決定資料包是否被狀态跟蹤機制處理 核心子產品:iptable_raw

規則鍊:

   1)INPUT——進來的資料包應用此規則鍊中的政策

   2)OUTPUT——外出的資料包應用此規則鍊中的政策

   3)FORWARD——轉發資料包時應用此規則鍊中的政策

   4)PREROUTING——對資料包作路由選擇前應用此鍊中的規則

(記住!所有的資料包進來的時侯都先由這個鍊處理)

   5)POSTROUTING——對資料包作路由選擇後應用此鍊中的規則

(所有的資料包出來的時侯都先由這個鍊處理)

管理和設定iptables規則:

Iptables 規則用法小結
Iptables 規則用法小結

4)iptables傳輸資料包的過程

Iptables 規則用法小結

   1)當一個資料包進入網卡時,它首先進入PREROUTING鍊,核心根據資料包目的IP判斷是否需要轉送出去。

   2)如果資料包就是進入本機的,它就會沿着圖向下移動,到達INPUT鍊。資料包到了INPUT鍊後,任何程序都會收到它。本機上運作的程式可以發送資料包,這些資料包會經過OUTPUT鍊,然後到達POSTROUTING鍊輸出。

   3)如果資料包是要轉發出去的,且核心允許轉發,資料包就會如圖所示向右移動,經過FORWARD鍊,然後到達POSTROUTING鍊輸出。

如果還是不清楚資料包經過iptables的基本流程,再看下面更具體的流程圖:

Iptables 規則用法小結

從圖中可将iptables資料包封包的處理過程分為三種類型:

1)目的為本機的封包

封包以本機為目的位址時,其經過iptables的過程為:

1.資料包從network到網卡

2.網卡接收到資料包後,進入raw表的PREROUTING鍊。這個鍊的作用是在連接配接跟蹤之前處理封包,能夠設定一條連接配接不被連接配接跟蹤處理。(注:不要在raw表上添加其他規則)

3.如果設定了連接配接跟蹤,則在這條連接配接上處理。

4.經過raw處理後,進入mangle表的PREROUTING鍊。這個鍊主要是用來修改封包的TOS、TTL以及給封包設定特殊的MARK。(注:通常mangle表以給封包設定MARK為主,在這個表裡面,千萬不要做過濾/NAT/僞裝這類的事情)

5.進入nat表的PREROUTING鍊。這個鍊主要用來處理 DNAT,應該避免在這條鍊裡面做過濾,否則可能造成有些封包會漏掉。(注:它隻用來完成源/目的位址的轉換)

6.進入路由決定資料包的處理。例如決定封包是上本機還是轉發或者其他地方。(注:此處假設封包交給本機處理)

7.進入mangle表的 INPUT 鍊。在把封包實際送給本機前,路由之後,我們可以再次修改封包。

8.進入filter表的 INPUT 鍊。在這兒我們對所有送往本機的封包進行過濾,要注意所有收到的并且目的位址為本機的封包都會經過這個鍊,而不管哪個接口進來的或者它往哪兒去。

9. 進過規則過濾,封包交由本地程序或者應用程式處理,例如伺服器或者用戶端程式。

2)本地主機發出封包

資料包由本機發出時,其經過iptables的過程為:

1.本地程序或者應用程式(例如伺服器或者用戶端程式)發出資料包。

2.路由選擇,用哪個源位址以及從哪個接口上出去,當然還有其他一些必要的資訊。

3.進入raw表的OUTPUT鍊。這裡是能夠在連接配接跟蹤生效前處理封包的點,在這可以标記某個連接配接不被連接配接跟蹤處理。

4.連接配接跟蹤對本地的資料包進行處理。

5.進入 mangle 表的 OUTPUT 鍊,在這裡我們可以修改資料包,但不要做過濾(以避免副作用)。

6.進入 nat 表的 OUTPUT 鍊,可以對防火牆自己發出的資料做目的NAT(DNAT) 。

7.進入 filter 表的 OUTPUT 鍊,可以對本地出去的資料包進行過濾。

8.再次進行路由決定,因為前面的 mangle 和 nat 表可能修改了封包的路由資訊。

9.進入 mangle 表的 POSTROUTING 鍊。這條鍊可能被兩種封包周遊,一種是轉發的封包,另外就是本機産生的封包。

10.進入 nat 表的 POSTROUTING 鍊。在這我們做源 NAT(SNAT),建議你不要在這做封包過濾,因為有副作用。即使你設定了預設政策,一些封包也有可能溜過去。

11.進入出去的網絡接口。

3)轉發封包

封包經過iptables進入轉發的過程為:

6.進入路由決定資料包的處理。例如決定封包是上本機還是轉發或者其他地方。(注:此處假設封包進行轉發)

7.進入 mangle 表的 FORWARD 鍊,這裡也比較特殊,這是在第一次路由決定之後,在進行最後的路由決定之前,我們仍然可以對資料包進行某些修改。

8.進入 filter 表的 FORWARD 鍊,在這裡我們可以對所有轉發的資料包進行過濾。需要注意的是:經過這裡的資料包是轉發的,方向是雙向的。

9.進入 mangle 表的 POSTROUTING 鍊,到這裡已經做完了所有的路由決定,但資料包仍然在本地主機,我們還可以進行某些修改。

10.進入 nat 表的 POSTROUTING 鍊,在這裡一般都是用來做 SNAT ,不要在這裡進行過濾。

接下來說下iptables規則設定用法

1)iptables的基本文法格式

iptables [-t 表名] 指令選項 [鍊名] [條件比對] [-j 目标動作或跳轉]

說明:

表名、鍊名:用于指定iptables指令所操作的表和鍊;

指令選項:用于指定管理iptables規則的方式(比如:插入、增加、删除、檢視等;

條件比對:用于指定對符合什麼樣 條件的資料包進行處理;

目标動作或跳轉:用于指定資料包的處理方式(比如允許通過、拒絕、丢棄、跳轉(Jump)給其它鍊處理。

2)iptables指令的管理控制選項

-A 在指定鍊的末尾添加(append)一條新的規則

-D 删除(delete)指定鍊中的某一條規則,可以按規則序号和内容删除

-I 在指定鍊中插入(insert)一條新的規則,預設在第一行添加

-R 修改、替換(replace)指定鍊中的某一條規則,可以按規則序号和内容替換

-L 列出(list)指定鍊中所有的規則進行檢視(預設是filter表,如果列出nat表的規則需要添加-t,即iptables -t nat -L)

-E 重命名使用者定義的鍊,不改變鍊本身

-F 清空(flush)

-N 建立(new-chain)一條使用者自己定義的規則鍊

-X 删除指定表中使用者自定義的規則鍊(delete-chain)

-P 設定指定鍊的預設政策(policy)

-Z 将所有表的所有鍊的位元組和資料包計數器清零

-n 使用數字形式(numeric)顯示輸出結果

-v 檢視規則表詳細資訊(verbose)的資訊

-V 檢視版本(version)

-h 擷取幫助(help)

3)防火牆處理資料包的四種方式ACCEPT 允許資料包通過

DROP 直接丢棄資料包,不給任何回應資訊

REJECT 拒絕資料包通過,必要時會給資料發送端一個響應的資訊。

LOG在/var/log/messages檔案中記錄日志資訊,然後将資料包傳遞給下一條規則

4)iptables防火牆規則的儲存與恢複

iptables-save把規則儲存到檔案中,再由目錄rc.d下的腳本(/etc/rc.d/init.d/iptables)自動裝載

使用指令iptables-save來儲存規則。

一般用:

iptables-save > /etc/sysconfig/iptables

生成儲存規則的檔案/etc/sysconfig/iptables,

也可以用:

service iptables save

它能把規則自動儲存在/etc/sysconfig/iptables中。

當計算機啟動時,rc.d下的腳本将用指令iptables-restore調用這個檔案,進而就自動恢複了規則。

5)iptables防火牆常用的政策梳理

設定預設鍊政策

ptables的filter表中有三種鍊:INPUT, FORWARD和OUTPUT。

預設的鍊政策是ACCEPT,可以将它們設定成DROP,如下指令就将所有包都拒絕了:

iptables -P INPUT DROP

iptables -P FORWARD DROP

iptables -P OUTPUT DROP

---------------------------------------------------------------------------------------------------------------------------

其實,在運維工作中最常用的兩個規則就是白名單規則和NAT轉發規則:

1)白名單規則

在linux終端指令行裡操作時,如果不是預設的filter表時,需要指定表;

如果在/etc/sysconfig/iptables檔案裡設定,就在對應表的配置區域内設定;

上面兩種方式設定效果是一樣的!

比如開通本機的22端口,允許192.168.1.0網段的伺服器通路(-t filter表配置可以省略,預設就是這種表的配置)

[root@linux-node1 ~]# iptables -A INPUT -s 192.168.1.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

或者

[root@linux-node1 ~]# iptables -t filter -A INPUT -s 192.168.1.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

開通本機的80端口,隻允許192.168.1.150機器通路(32位掩碼表示單機,單機指定時可以不加掩碼)

[root@linux-node1 ~]# iptables -t filter -A INPUT -s 192.168.1.150/32 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

然後儲存規則,重新開機iptables

[root@linux-node1 ~]# service iptables save

[root@linux-node1 ~]# service iptables restart

或者在/etc/sysconfig/iptables檔案裡設定如下(其實上面在終端指令行裡設定并save和restart防火牆後,就會自動儲存規則到/etc/sysconfig/iptables這個檔案中的):

[root@bastion-IDC ~]# cat /etc/sysconfig/iptables

......

*filter

:INPUT ACCEPT [442620:173026884]

:FORWARD ACCEPT [118911:23993940]

:OUTPUT ACCEPT [8215384:539509656]

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

-A INPUT -p icmp -j ACCEPT

-A INPUT -i lo -j ACCEPT

-A INPUT -s 192.168.1.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

-A INPUT -s 192.168.1.150/32 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

[root@bastion-IDC ~]# service iptables restart

2)NAT轉發設定

比如通路本機(192.168.1.7)的8088端口轉發到192.168.1.160的80端口;通路本機的33066端口轉發到192.168.1.161的3306端口

準備工作:

本機打開ip_forword路由轉發功能;192.168.1.160/161的内網網關要和本機網關一緻!如果沒有内網網關,就将網關設定成本機内網ip,并且關閉防火牆(防火牆要是打開了,就設定對應端口允許本機通路)

[root@kvm-server conf]# iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8088 -j DNAT --to-destination 192.168.1.160:80

[root@kvm-server conf]# iptables -t nat -A POSTROUTING -d 192.168.1.160/32 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.1.7

[root@kvm-server conf]# iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 8088 -j ACCEPT

[root@kvm-server conf]# iptables -t nat -A PREROUTING -p tcp -m tcp --dport 33066 -j DNAT --to-destination 192.168.1.161:3306

[root@kvm-server conf]# iptables -t nat -A POSTROUTING -d 192.168.1.161/32 -p tcp -m tcp --sport 3306 -j SNAT --to-source 192.168.1.7

[root@kvm-server conf]# iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 33066 -j ACCEPT

[root@kvm-server conf]# service iptables save

[root@kvm-server conf]# service iptables restart

或者在/etc/sysconfig/iptables檔案裡設定如下

*nat

:PREROUTING ACCEPT [60:4250]

:INPUT ACCEPT [31:1973]

:OUTPUT ACCEPT [3:220]

:POSTROUTING ACCEPT [3:220]

-A PREROUTING -p tcp -m tcp --dport 8088 -j DNAT --to-destination 192.168.1.160:80                              //PREROUTING規則都放在上面

-A PREROUTING -p tcp -m tcp --dport 33066 -j DNAT --to-destination 192.168.1.161:3306

-A POSTROUTING -d 192.168.1.160/32 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.1.7             //POSTROUTING規則都放在下面

-A POSTROUTING -d 192.168.1.161/32 -p tcp -m tcp --sport 3306 -j SNAT --to-source 192.168.1.7

.....

:INPUT ACCEPT [16:7159]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [715:147195]

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

-A INPUT -p icmp -j ACCEPT

-A INPUT -i lo -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 8088 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 33066 -j ACCEPT

[root@bastion-IDC ~]# iptables -L                      //列出設定的規則,預設列出的是filter表下的規則

[root@bastion-IDC ~]# iptables -L -t nat            //如果列出nat表下規則,就加-t參數

--------------------------------------------------------------------------------------------------------------------------

删除INPUT鍊的第一條規則

iptables -D INPUT 1

拒絕進入防火牆的所有ICMP協定資料包

iptables -I INPUT -p icmp -j REJECT

允許防火牆轉發除ICMP協定以外的所有資料包

iptables -A FORWARD -p ! icmp -j ACCEPT

說明:使用“!”可以将條件取反

拒絕轉發來自192.168.1.10主機的資料,允許轉發來自192.168.0.0/24網段的資料

iptables -A FORWARD -s 192.168.1.11 -j REJECT

iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT

說明:注意一定要把拒絕的放在前面不然就不起作用了!

丢棄從外網接口(eth1)進入防火牆本機的源位址為私網位址的資料包

iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP

iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP

iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

封堵網段(192.168.1.0/24),兩小時後解封

# iptables -I INPUT -s 10.20.30.0/24 -j DROP

# iptables -I FORWARD -s 10.20.30.0/24 -j DROP

# at now 2 hours at> iptables -D INPUT 1 at> iptables -D FORWARD 1

說明:這個政策可以借助crond計劃任務來完成,就再好不過了

隻允許管理者從202.13.0.0/16網段使用SSH遠端登入防火牆主機

iptables -A INPUT -s 202.13.0.0/16 -p tcp -m tcp -m state --state NEW --dport 22  -j ACCEPT

說明:這個用法比較适合對裝置進行遠端管理時使用,比如位于分公司中的SQL伺服器需要被總公司的管理者管理時

通常在伺服器上會對某一服務端口的通路做白名單限制,比如(其他端口設定和下面一緻):

運作本機的3306端口(mysql服務)被通路

iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 3306 -j ACCEPT

或者隻運作本機的3306端口被192.168.1.0/24網段機器通路

iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp -m state --state NEW --dport 3306 -j ACCEPT

允許本機開放從TCP端口20-1024提供的應用服務

iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 20:1024 -j ACCEPT

允許轉發來自192.168.0.0/24區域網路段的DNS解析請求資料包

iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT

iptables -A FORWARD -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT

屏蔽指定的IP位址

以下規則将屏蔽BLOCK_THIS_IP所指定的IP位址通路本地主機:

BLOCK_THIS_IP="x.x.x.x"

iptables -A INPUT -i eth0 -s "$BLOCK_THIS_IP" -j DROP

(或者僅屏蔽來自該IP的TCP資料包)

iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP

屏蔽環回(loopback)通路

iptables -A INPUT -i lo -j DROP

iptables -A OUTPUT -o lo -j DROP

屏蔽來自外部的ping,即禁止外部機器ping本機

iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

iptables -A OUTPUT -p icmp --icmp-type echo-reply -j DROP

屏蔽從本機ping外部主機,禁止本機ping外部機器

iptables -A OUTPUT -p icmp --icmp-type echo-request -j DROP

iptables -A INPUT -p icmp --icmp-type echo-reply -j DROP

禁止其他主機ping本機,但是允許本機ping其他主機(禁止别人ping本機,也可以使用echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all)

iptables -I INPUT -p icmp --icmp-type echo-request -j DROP

iptables -I INPUT -p icmp --icmp-type echo-reply -j ACCEPT

iptables -I INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT

禁止轉發來自MAC位址為00:0C:29:27:55:3F的和主機的資料包

iptables -A FORWARD -m mac --mac-source 00:0c:29:27:55:3F -j DROP

說明:iptables中使用“-m 子產品關鍵字”的形式調用顯示比對。咱們這裡用“-m mac –mac-source”來表示資料包的源MAC位址

允許防火牆本機對外開放TCP端口20、21、25、110以及被動模式FTP端口1250-1280

iptables -A INPUT -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT

注意:這裡用“-m multiport --dport”來指定多個目的端口

iptables -A INPUT -p tcp -m tcp -m multiport --dports 22,80,443,1250-1280 -m state --state NEW -j ACCEPT

也可以将這幾個端口分開設定多行:

iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 22 -j ACCEPT

iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 80 -j ACCEPT

iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 443 -j ACCEPT

iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 1250:1280 -j ACCEPT

禁止轉發源IP位址為192.168.1.20-192.168.1.99的TCP資料包

iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP

此處用“-m iprange --src-range”指定IP範圍

1)過濾源位址範圍:

iptables -A INPUT -m iprange --src-range 192.168.1.2-192.168.1.7 -j DROP

2)過濾目标位址範圍:

iptables -A INPUT -m iprange --dst-range 192.168.1.2-192.168.1.7 -j DROP

3)針對端口通路的過濾。下面表示除了192.168.1.5-192.168.1.10之間的ip能通路192.168.1.67機器的80端口以外,其他ip都不可以通路!

iptables -A INPUT -d 192.168.1.67 -p tcp --dport 80 -m iprange --src-range 192.168.1.5-192.168.1.10 -j ACCEPT

禁止轉發與正常TCP連接配接無關的非--syn請求資料包

iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP

說明:“-m state”表示資料包的連接配接狀态,“NEW”表示與任何連接配接無關的

拒絕通路防火牆的新資料包,但允許響應連接配接或與已有連接配接相關的資料包

iptables -A INPUT -p tcp -m state --state NEW -j DROP

iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

說明:“ESTABLISHED”表示已經響應請求或者已經建立連接配接的資料包,“RELATED”表示與已建立的連接配接有相關性的,比如FTP資料連接配接等

防止DoS攻擊

iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT

-m limit: 啟用limit擴充,限制速度。

--limit 25/minute: 允許最多每分鐘25個連接配接

--limit-burst 100: 當達到100個連接配接後,才啟用上述25/minute限制

--icmp-type 8 表示 Echo request——回應要求(Ping請求)。下面表示本機ping主機192.168.1.109時候的限速設定:

iptables -I INPUT -d 192.168.1.109 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT

允許路由

如果本地主機有兩塊網卡,一塊連接配接内網(eth0),一塊連接配接外網(eth1),那麼可以使用下面的規則将eth0的資料路由到eht1:

iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

IPtables中可以靈活的做各種網絡位址轉換(NAT)

網絡位址轉換主要有兩種:SNAT和DNAT

1)SNAT是source network address translation的縮寫,即源位址目标轉換。

比如,多個PC機使用ADSL路由器共享上網,每個PC機都配置了内網IP。PC機通路外部網絡的時候,路由器将資料包的報頭中的源位址替換成路由器的ip,當外部網絡的伺服器比如網站web伺服器接到通路請求的時候,它的日志記錄下來的是路由器的ip位址,而不是pc機的内網ip,這是因為,這個伺服器收到的資料包的報頭裡邊的“源位址”,已經被替換了。是以叫做SNAT,基于源位址的位址轉換

2)DNAT是destination network address translation的縮寫,即目标網絡位址轉換。

典型的應用是,有個web伺服器放在内網中,配置了内網ip,前端有個防火牆配置公網ip,網際網路上的通路者使用公網ip來通路這個網站。

當通路的時候,用戶端發出一個資料包,這個資料包的報頭裡邊,目标位址寫的是防火牆的公網ip,防火牆會把這個資料包的報頭改寫一次,将目标位址改寫成web伺服器的内網ip,然後再把這個資料包發送到内網的web伺服器上。這樣,資料包就穿透了防火牆,并從公網ip變成了一個對内網位址的通路了。即DNAT,基于目标的網絡位址轉換

以下規則将會把本機192.168.1.17來自422端口的流量轉發到22端口,這意味着來自422端口的SSH連接配接請求與來自22端口的請求等效。

1)啟用DNAT轉發

iptables -t nat -A PREROUTING -p tcp -d 192.168.1.17 --dport 422 -j DNAT --to-destination 192.168.1.17:22

2)允許連接配接到422端口的請求

iptables -t filter -A INPUT -p tcp -m tcp -m state --state NEW --dport 422 -j ACCEPT

3)儲存規則

# service iptables save

# service iptables restart

假設現在本機外網網關是58.68.250.1,那麼把HTTP請求轉發到内部的一台伺服器192.168.1.20的8888端口上,規則如下:

iptables -t nat -A PREROUTING -p tcp -i eth0 -d 58.68.250.1 --dport 8888 -j DNAT --to 192.168.1.20:80

iptables -A FORWARD -p tcp -i eth0 -d 192.168.0.2 --dport 80 -j ACCEPT

iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

service iptables restart

或者或本機内網ip是192.168.1.10,那麼把HTTP請求轉發到内部的一台伺服器192.168.1.20的8888端口上,規則如下:

準備工作:本機打開ip_forword路由轉發功能;192.168.1.20的内網網關要和本機網關保持一緻!如果沒有内網網關,就将網關位址設定成本機内網ip,并且關閉防火牆(防火牆要是打開了,就設定對應端口允許本機通路)

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 20022 -j DNAT --to-destination 192.168.1.150:22

iptables -t nat -A POSTROUTING -d 192.168.1.150/32 -p tcp -m tcp --sport 22 -j SNAT --to-source 192.168.1.8

iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 20022 -j ACCEPT

MASQUERADE,位址僞裝,在iptables中有着和SNAT相近的效果,但也有一些差別:

1)使用SNAT的時候,出口ip的位址範圍可以是一個,也可以是多個,例如:

     1)如下指令表示把所有10.8.0.0網段的資料包SNAT成192.168.5.3的ip然後發出去

iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3

     2)如下指令表示把所有10.8.0.0網段的資料包SNAT成192.168.5.3/192.168.5.4/192.168.5.5等幾個ip然後發出去

iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3-192.168.5.5

這就是SNAT的使用方法,即可以NAT成一個位址,也可以NAT成多個位址。但是,對于SNAT,不管是幾個位址,必須明确的指定要SNAT的ip!

假如目前系統用的是ADSL動态撥号方式,那麼每次撥号,出口ip192.168.5.3都會改變,而且改變的幅度很大,不一定是192.168.5.3到192.168.5.5範圍内的位址。這個時候如果按照現在的方式來配置iptables就會出現問題了,因為每次撥号後,伺服器位址都會變化,而iptables規則内的ip是不會随着自動變化的,每次位址變化後都必須手工修改一次iptables,把規則裡邊的固定ip改成新的ip,這樣是非常不好用的!

2)MASQUERADE就是針對上述場景而設計的,它的作用是,從伺服器的網卡上,自動擷取目前ip位址來做NAT。

比如下邊的指令:

iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE

如此配置的話,不用指定SNAT的目标ip了。

不管現在eth0的出口獲得了怎樣的動态ip,MASQUERADE會自動讀取eth0現在的ip位址然後做SNAT出去

這樣就實作了很好的動态SNAT位址轉換

再看看幾個運維執行個體設定:

1)限制本機的web伺服器在周一不允許通路;

     新請求的速率不能超過100個每秒;

     web伺服器包含了admin字元串的頁面不允許通路:

     web 伺服器僅允許響應封包離開本機;

設定如下:

周一不允許通路

iptables -A INPUT -p tcp --dport 80 -m time ! --weekdays Mon -j ACCEPT

iptables -A OUTPUT -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT

新請求速率不能超過100個每秒

iptables -A INPUT -p tcp --dport 80 -m limit --limit 100/s -j ACCEPT

web包含admin字元串的頁面不允許通路,源端口:dport

iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string 'admin' -j REJECT

web伺服器僅允許響應封包離開主機,放行端口(目标端口):sport

2)在工作時間,即周一到周五的8:30-18:00,開放本機的ftp服務給 192.168.1.0網絡中的主機通路;

    資料下載下傳請求的次數每分鐘不得超過 5 個;

iptables -A INPUT -p tcp --dport 21 -s 192.168.1.0/24 -m time ! --weekdays 6,7 -m time --timestart 8:30 --timestop 18:00 -m connlimit --connlimit-above 5 -j ACCET

3)開放本機的ssh服務給192.168.1.1-192.168.1.100 中的主機;

     新請求建立的速率一分鐘不得超過2個;

    僅允許響應封包通過其服務端口離開本機;

iptables -A INPUT -p tcp --dport 22 -m iprange --src-rang 192.168.1.1-192.168.1.100 -m limit --limit 2/m -j ACCEPT

iptables -A OUTPUT -p tcp --sport 22 -m iprange --dst-rang 192.168.1.1-192.168.1.100 -m state --state ESTABLISHED -j ACCEPT

4)拒絕 TCP 标志位全部為 1 及全部為 0 的封包通路本機;

iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

5)允許本機 ping 别的主機;但不開放别的主機 ping 本機;

或者下面禁ping操作:

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

*************** 當你發現自己的才華撐不起野心時,就請安靜下來學習吧!***************