天天看點

iptables

iptables防火牆規則整理

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

iptables由兩部分組成: 

1.framework:netfilter hooks function鈎子函數,實作網絡過濾器的基本架構。 

2.rule utils:iptables 規則管理工具

總體說來,iptables就是由“四表五鍊”組成。 

四表:

filter:過濾,防火牆

nat :network address translation 網絡位址轉換

mangle:拆解封包,作出修改,封裝封包

raw: 關閉nat表上啟用的連結追蹤機制

五鍊:

PREROUTING 資料包進入路由之前

INPUT 目的位址為本機

FORWARD 實作轉發

OUTPUT 原位址為本機,向外發送

POSTROUTING 發送到網卡之前

<a href="https://s2.51cto.com/wyfs02/M01/07/75/wKiom1nKCOaTRK7SAADROJlJ-cs392.jpg" target="_blank"></a>

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

一、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中現在是四張表五個鍊。下面羅列一下這四張表和五個鍊。

<a href="https://s5.51cto.com/wyfs02/M00/A6/27/wKioL1nKC9CBg5YkAAE0Flvwx5Y128.png" target="_blank"></a>

規則表:

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

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

    2)Nat表——三個鍊:PREROUTING、POSTROUTING、INPUT、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資料包封包的處理過程分為三種類型:

流入本機通路某程序的資料封包:

PREROUTING --&gt; INPUT

由本機某程序發送出去的資料封包:

PREROUTING --&gt; OUTPUT --&gt; POSTROUTING

經由本機轉發的資料封包:

PREROUTING --&gt; FORWARD --&gt; POSTROUTING

二、接下來說下iptables,chain規則設定用法及擴充比對條件

1)iptables的基本文法格式

iptables [-t table] COMMAND CHAIN [-m matchname [per-match-options]] -j targetname [per-target-options]

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

說明:

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

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

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

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

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

 鍊的操作指令:

-P:policy,政策,定義指定鍊的預設政策;一般有兩種選擇,即:ACCEPT或DROP;

-N:new chain,建立一條自定義的規則鍊;隻有被内建鍊上的規則調用才能使自定義規則鍊上的規則生效;-j chain_name

-X:drop chain,删除被内建鍊引用次數為0的自定義鍊;

-F:flush,清除指定鍊上的所有規則;

-E:重命名被内建鍊引用次數為0的自定義鍊;

 規則的操作指令:

-A:append,追加,在指定的鍊的尾部追加一條規則;

-I [#]:insert,插入,在指定的位置插入一條規則,省略了數字表示将規則插入到鍊的第一條;

-D [#]:delete,删除,删除指定的規則

-R:replace,替換,用指定的規則去替換目标鍊中的原有規則;不能僅修改規則中的某一部分,而是整條規則完全替換;

 檢視規則的指令:

-L:list,列出指定表指定鍊上的所有規則;

-n:numeric,将規則中的資訊數字化顯示,主要指:主機名和端口号;

-v:verbose,顯示詳細格式的資訊,還有-vv,-vvv;

-x:exactly,精确的顯示計數器的結果;

  --line-numbers:顯示規則鍊中的規則編号;

 每條規則都有兩個計數器:

1.比對的封包的個數;

2.比對的封包的總的位元組數;

  重置規則計數器(将計數器計數歸零):

-Z:zero,将指定表指定鍊上的規則的計數器置0;

3)chain

1.内建鍊:

2.自定義鍊:

  基本比對條件:

預設情況下,多個條件之間是邏輯"與"的關系;

!:指對比對的條件取反;有除了...之意;

[!] -s, --source address[/mask][,...]

檢查封包中的源IP位址是否符合此條件指定的位址或範圍;

[!] -d, --destination address[/mask][,...]

檢查封包中的目标IP位址是否符合此條件指定的位址或範圍;

[!] -p, --protocol protocol

檢查封裝封包的協定是否符合此條件指定的協定;

protocol:tcp, udp, ip, icmp, arp, ...

隻要是TCP/IP協定棧中,傳輸層和網絡層的協定均可;

   tcp:

[!] --source-port,--sport port[:port]

[!] --destination-port,--dport port[:port]

指明此次比對的源端口或目的端口;

[!] --tcp-flags mask comp

mask:要檢查的标志位的清單,各标志位之間使用逗号分隔;

comp:必須置1的标志位清單,其餘的在mask清單中的标志位必須為0;

TCP協定首部中的标志位:SYN,FIN,ACK,RST,PSH,URG

如:--tcp-flags SYN,ACK,FIN,RST SYN  相當于 --syn

   udp:

  icmp:

[!] --icmp-type {type[/code]|typename}

 8: echo-request

 0: echo-reply

[!] -i, --in-interface name

檢查資料封包入站的接口是否對應此條件中指定的接口;

[!] -o, --out-interface name

檢查資料封包出站的接口是否對應此條件中指定的接口;

注意:在INPUT鍊上指定出站接口沒有意義;在OUTPUT鍊上指定入站接口沒有意義;

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

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

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

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

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

    iptables-save把規則儲存到檔案中,再由目錄rc.d下的腳本(/etc/rc.d/init.d/iptables)自動裝載使用指令iptables-save來儲存規則。一般用:iptables-save &gt; /etc/sysconfig/iptables生成儲存規則的檔案/etc/sysconfig/iptables,也可以用:service iptables save它能把規則自動儲存在/etc/sysconfig/iptables中。

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

6)擴充比對條件:

  隐式擴充:

    -p tcp  

  顯示擴充:

1.multiport擴充:

 以離散或連續的方式定義多個端口比對條件:

  [!] --source-ports,--sports port[,port|,port:port]...

  [!] --destination-ports,--dports port[,port|,port:port]...

  [!] --ports port[,port|,port:port]...

 21,22,23,80,1000:2000

 示例:

~]# iptables -I INPUT -d 172.16.72.1 -s 172.16.0.0/16 -p tcp -m multiport --dports 21,22,23,80 -j ACCEPT

2.iprange擴充:

  以連續的IP位址範圍指明連續的多個位址的比對條件;

  [!] --src-range from[-to]

  [!] --dst-range from[-to]

  172.16.50.1-172.16.72.254

 ~]# iptables -I INPUT 4 -m iprange --src-range 172.16.0.1-172.16.72.254 -p tcp -m multiport --dports 21,22,80 -j ACCEPT

3.string擴充:

 對封包中的應用層資料做字元串比對檢測;

 --algo {bm|kmp}:選擇處理字元串的算法;

 [!] --string pattern:指明要檢查比對的字元串;

  ~]# iptables -A OUTPUT -s 172.16.72.1 -d 172.16.0.0/16 -m string --string "admin" --algo kmp -j DROP

     4.time擴充:

 根據封包到達的時間與指定的時間範圍進行比對度檢測;

 --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

 --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

 --timestart hh:mm[:ss]

 --timestop hh:mm[:ss]

 [!] --monthdays day[,day...]

 [!] --weekdays day[,day...]

 ~]# iptables -I INPUT -d 172.16.72.1 -p tcp -m multiport --dports 21,23,80 -m time --timestart 09:00:00 --timestop 17:00:00 --weekdays Sat,Sun --kerneltz -j ACCEPT

5.connlimit擴充:

 根據每個用戶端IP做并發連接配接數的比對;

 --connlimit-upto n:連接配接數數量小于等于n,此時規則應設定為允許;

 --connlimit-above n:連接配接數數量大于n,此時規則應設定為拒絕;

 ~]# iptables -I INPUT -d 172.16.72.1 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT

6.limit擴充:

 基于收發封包的速率進行比對;

 --limit rate[/second|/minute|/hour|/day]

 --limit-burst number

 ~]# iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 8 -j ACCEPT

 7.state擴充:

 狀态檢測:基于連接配接追蹤機制實作;conntrack

 狀态:

  INVALID:無法識别的狀态;無效狀态;

  ESTABLISHED:已建立連接配接的狀态;連接配接态;

  NEW:尚未建立連接配接的狀态,新連接配接态;

  RELATED:與其他已建立的連接配接相關聯的狀态;關聯态或衍生态;

  UNTRACKED:未追蹤的連接配接;

  追蹤到的連接配接儲存的位置:

 /proc/net/nf_conntrack

  能夠被追蹤到的最大連接配接數的定義:

 /proc/sys/net/nf_conntrack_max

 注意:此最大連接配接數的數值,建議必要時可以調整到足夠大;

  不同協定的連接配接追蹤的逾時時間:

 /proc/sys/net/netfilter/*timeout

~]# iptables -I INPUT -d 172.16.72.1 -m state --state ESTABLISHED,RELATED -j ACCEPT

~]# iptables -I INPUT 2 -d 172.16.72.1 -p tcp -m multiport --dports 21,22,23,80,3306 -m state --state NEW -j ACCEPT

~]# iptables -A INPUT -j DROP

     注意:預設的規則或最後一條規則拒絕所有主機通路;

~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT

     ~]# iptables -A OUTPUT -j DROP

 放行FTP被動模式的資料連接配接:

 1.裝載追蹤FTP協定的子產品:

 # modprobe nf_conntrack_ftp

 也可以編輯vim /etc/sysconfig/iptables-config

 IPTABLES_MODULES="nf_conntrack_ftp"

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

三、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變成了一個對内網位址的通路了。

SNAT:

 --to-source [ipaddr[-ipaddr]][:port[-port]]

   注意:在RHEL系或CentOS系作業系統上,SNAT中指定ipaddr必須為目前主機已經配置的IP位址;

  示例:

    ~]# iptables -t nat -R POSTROUTING 1 -s 192.168.100.0/24 -j SNAT --to-source 172.16.72.50

  MASQUERADE

--to-ports port[-port]

    ~]# iptables -t nat -R POSTROUTING 1 -s 192.168.100.0/24 -j MASQUERADE

DNAT:

 --to-destination [ipaddr[-ipaddr]][:port[-port]]

   ~]# iptables -t nat -A PREROUTING -d 172.16.72.50 -j DNAT --to-destination 192.168.100.2

   ~]# iptables -t nat -A PREROUTING -d 172.16.72.50 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.2:8077

REDIRECT:端口重定向

  --to-ports port[-port]

  ~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8077

  LOG:

   僅僅是開啟核心對比對的資料包做額外的日志記錄;

--log-level level

--log-prefix prefix

--log-ip-options

      本文轉自Vincent一馬 51CTO部落格,原文連結:http://blog.51cto.com/mazhenbo/1983394,如需轉載請自行聯系原作者

繼續閱讀