1 iptables介紹
iptables的文章很多,作者的寫法也都不一樣,下面的內容從好幾篇文章總結而來
1.1 用途
iptables是Linux下的防火牆軟件,用於實現Linux下的網絡訪問控制,即針對網絡包(packet)進行檢測、轉發、丟棄、修改、流控等控制。
1.2 工作層次
主要在L2、L3、L4層。
1.3 工作空間
規則配置在用戶空間(由/sbin/iptables配置,iptables規則信息在/etc/sysconfig/iptables)
規則執行在內核空間(由內核模塊netfilter執行)
1.4 iptables的主要功能
包過濾(packet filtering)
連接跟蹤(connection track)
網絡地址轉換(NAT)
重整包頭(Mangling packet header fields)
2 iptables的工作模型
2.1 參考資料
iptables的權威資料是“man iptables”。
學習iptables最重要的是理解iptables的工作原理,下文旨在總體上把握iptables的工作模型,然后給出部分典型應用,對具體參數的用法不作過多闡述。實際應用中,用到哪一部分再去仔細閱讀權威資料的相關部分,然后去實踐調試,即可達到目的。
2.2 命令模型
注:該表較寬,切換到WEB版式視圖查看。
| 命令 |
控制點 |
匹配條件 |
執行動作 |
||||||||
| 表(控制類型) |
鏈(控制點) |
規則號 |
通用匹配 |
擴展匹配 |
|||||||
| --sport P1[-P2] |
|||||||||||
| -L |
[chain] -n -x |
tcp |
--dport P1[-P2] |
||||||||
| -S |
[chain] -v |
--tcp-flags SYN,ACK,FIN,RST |
REDIRECT |
||||||||
| -F |
[chain] |
--syn |
RETURN |
||||||||
| -Z |
[chain][n]] |
udp |
--sport P1[-P2] |
MARK |
|||||||
| -P |
chain target |
-S IP/net |
--dport P1[-P2] |
LOG |
--log-prefix |
||||||
| [-t filter] |
-A |
INPUT |
-d IP/net |
icmp |
--icmp-type {8|0} |
ACCEPT |
|||||
| iptables |
-t nat |
-I |
OUTPUT |
rulenum |
-p {tcp|udp|icmp} |
-m |
multiports |
--dports PORT[,PORT,...] |
-j |
DROP |
|
| -t mangle |
-R |
FORWARD |
-i if -o of |
--ports PORT[,PORT,...] |
REJECT |
||||||
| -t raw |
-X |
PREROUTING |
iprange |
--src-range IP1-IP2 |
自定義鏈 |
||||||
| POSTROUTING |
--dst-range IP1-IP2 |
SNAT |
--to-source |
||||||||
| -D |
chain rulenum |
string |
--string STR --algo {kmp|bm} |
DNAT |
--to-destination |
||||||
| -N |
自定義鏈 |
--hex-string |
MASQUERADE |
--to-port |
|||||||
| -E |
舊名 新名 |
connlimit |
--conlimit-above [n] |
TPROXY |
--on-port |
||||||
| limit |
--limit rate --limit-burst b |
||||||||||
| state |
--state NEW,ESTABLISHED,RELATED |
||||||||||
-m :擴展匹配, 擴展匹配的模塊見2.5介紹
如: 匹配tcp目的端口123: -p tcp -m tcp --dport 123, 當有通用匹配參數-p {tcp|udp|icmp}時,可不加“-m {tcp|udp|icmp}”,即:-p tcp -m tcp --dport 123 ==> -p tcp --dport 123
理解iptables對包的控制,就要掌握控制的三個要素:
1、在哪里?——控制點,對應table+chain+rule
2、對哪些?——匹配條件,對應match
3、怎么做?——執行動作,對應target
2.3 表和鏈(控制點)
包在表和鏈中的流轉圖,如下圖所示。
5種鏈:PREROUTING、INPUT、OUTPUT、FORWAD、POSTROUTING
4種表:優先級raw > mangle > nat > filter
【請求-響應流程】
如本機收到一個HTTP請求,然后發送一個HTTP響應,根據流轉圖可知流程為:
raw.PREROUTING -> mangle.PREROUTING -> nat.PREROUTING
-> mangle.INPUT -> filter.INPUT
-> raw.OUTPUT -> mangle.OUTPUT -> nat.OUTPUT -> filter.OUTPUT
-> mangle.POSTROUTING -> nat.POSTROUTING
【轉發流程】
如本機作為代理/路由器來轉發包,根據流轉圖可知流程為:
raw.PREROUTING -> mangle.PREROUTING -> nat.PREROUTING
-> mangle.FORWARD -> filter.FORWARD
-> mangle.POSTROUTING -> nat.POSTROUTING
【如何理解表和鏈】
1、“table”、“chain”的命名讓人有些費解,理解時可先不管其原本含義。
2、參照上圖來理解表和鏈代表的控制點。
3、鏈對應包的流轉階段:如PREROUTING指從網卡進入系統的最開始階段。
4、表對應包的控制/操作類型:
| 表 |
操作 |
| raw |
不進行連接跟蹤(conntrack),常-j NOTRACK |
| mangle |
修改包頭字段 |
| nat |
NAT轉換 |
| filter |
允許或禁止 |
2.4 規則rule與策略 policy(鏈尾動作)
設定規則時,要指定所在的表和鏈,如iptables -t nat -A PREROUTING …。
鏈內可有多條規則,內置鏈的最后有一個策略,即鏈尾動作。

【包在鏈內的匹配流程】:
進入鏈后從第一條規則開始,依次匹配。
若包與規則不匹配,則與鏈中下一條規則進行匹配。
若匹配到一條規則就執行該規則的target動作(允許、拒絕、改寫包頭、NAT等),然后按該動作的“后續操作”(NextRule、NextChain、NextPacket、Return)繼續。
如果包與鏈中的任何規則都不匹配,即到達鏈尾,則執行該鏈的策略(鏈尾動作)。
2.5 match(匹配條件)
可分為通用匹配和擴展匹配(隱式和顯示),其差異僅體現在指定參數的方式上,在功能本質上是統一的。
| 匹配類型 |
說明 |
參數方式 |
| 通用匹配 |
最常用的匹配條件,僅包括入站網卡、出站網卡、源IP、目的IP、協議等條件 |
直接給出參數(-s, -d, -i, -o, -p) |
| 擴展匹配 |
每種匹配方式對應一個模塊,以-m來設置 |
-m <匹配模塊> <模塊參數> 例:-m tcp --dport 80 |
| 隱式擴展匹配 |
當有通用匹配參數-p {tcp|udp|icmp}時,可不加“-m {tcp|udp|icmp}”,直接給出相關協議的參數,此為隱式匹配,實際上就是擴展匹配的一種省略“-m”的簡化寫法。 |
tcp:--sport --dport --tcp-flags udp:--sport --dport icmp:--icmp-type 例:-p tcp [-m tcp] --dport 80 |
SuSE12sp1自帶的iptables 1.4.21,共有60種擴展匹配,列舉常用的18種如下:
| 擴展匹配 |
說明 |
| addrtype |
地址類型:本地、廣播等 |
| comment |
注釋 |
| connlimit |
連接數 |
| icmp |
ICMP協議 |
| length |
IP凈荷長度 |
| limit |
流量(以包個數計) |
| mac |
MAC地址 |
| mark |
標志(U32整形數) |
| multiport |
多端口 |
| sctp |
SCTP協議 |
| socket |
內核socket |
| state |
TCP連接狀態(NEW、ESTABLISHED、RELATED、INVALID) |
| string |
字符串 |
| tcp |
TCP協議 |
| tcpmss |
建鏈時的TCP最大凈荷參數 |
| time |
時間 |
| u32 |
包數據看做是U32數組 |
| udp |
UDP協議 |
iptables -m tcp --help
可以查看tcp模塊 詳情, 其他模塊 類似
2.6 target(執行動作)
target就是iptables規則匹配之后執行的動作,分三類:
1、內置target(3個:ACCEPT/DROP/RETURN)
2、自定義鏈target
3、擴展target(40個)
target的“后續操作”是指執行完其本身動作后的下一步操作,分為以下4種:
1、【NextRule】匹配本鏈的下一條規則,若已到達本鏈末尾,則執行本鏈Policy。
2、【NextChain】結束本鏈(不受本鏈Policy約束),進入下一鏈。
3、【NextPacket】終止本包處理,繼續處理一下個包。
4、【Return】自定義鏈中的-j RETURN返回調用鏈,內置鏈中的-j RETURN執行內置鏈中的Policy。
內置target和常用擴展target如下:
| target |
本次操作 |
后續操作 |
| -j ACCEPT(內置) |
允許 |
NextChain |
| -j RETURN(內置) |
Return |
|
| -j DROP(內置) |
丟棄,無回應 |
NextPacket |
| -j REJECT |
丟棄,給出ICMP回應 |
NextPacket |
| -j SNAT |
SNAT |
NextChain |
| -j MASQUERADE |
源IP修改為網卡IP(SNAT特例) |
NextChain |
| -j DNAT |
DNAT |
NextChain |
| -j REDIRECT |
重定向到另一個端口(DNAT特例) |
NextRule |
| -j MARK |
打標記 |
NextRule |
| -j LOG |
寫日志/var/log/message |
NextRule |
| -j TPROXY |
轉發到本機端口 |
NextChain |
下面的web鏈接的介紹也很詳細
https://www.cnblogs.com/davidwang456/p/3540837.html
