IPTABLES
基於內核的防火牆,裏面有raw,mangle,net,filter四個表,它們的優先級依次降低,也就是raw最高,匹配的時候是從raw開始的。
1, iptables有四張表
raw,mangle,net,filter
2,規則鏈-chain
存放防火牆規則的地方
默認有五種規則鏈:
→ PREROUTING:路由選擇之前處理
→ FORWARD:處理轉發的數據包
→ INPUT:處理入站的數據包
→ POSTROUTING:路由選擇之後處理
3,表和規則鏈對應的關係:
filter :INPUT,FORWARD, OUTPUT
nat : PREROUTING(DNAT), POSTROUTING(SNAT),OUTPUT
mangle : PREROUTING, POSTROUTING, FORWARD, INPUT,OUTPUT
raw : PREROUTING, OUTPUT
4,數據報文流程:
跟本機內部進程通信:
進入:PREROUTING,INPUT
出去:OUTPUT, POSTROUTING
5,基本語法:
iptables [-t TABLE] COMMANDCHAIN CRETIRIA -j TARGET
iptables [ -t 表名 ] 選項 [ 鏈名 ] [ 條件 ] [ -j 目標操作 ]
鏈:
-F:flush, 清空規則鏈;
-N:new, 自建一條鏈
-X: delete, 刪除一條自定義的空鏈
-Z:zero,計數器歸零
-P:policy,設置默認策略,對filter表來講,默認規則爲ACCEPT或DROP
-E:重命名自定義鏈
表:-t TABLE:
nat, mangle, raw, filter
不指定表的時候默認爲filter
不指定鏈,默認爲對應表的所有鏈
除非設置默認策略,否則必須指定匹配條件
選項/鏈名/目標操作用大寫字母,其餘都小寫
鏈中的規則:
-A 在鏈尾增加一條規則
-I 在鏈頭增加一條規則,或者指定序號增加
-D 刪除鏈內指定序號(或內容)的一條規則
-R 替換一條規則
查詢:
-L
-n:數字格式顯示主機地址和端口;
-v:詳細格式,-vv,-vvv
--line-numbers:顯示規則編號
pkts bytes target prot opt in out source destination
包數 字節數 目標 協議 流入的接口 流出的接口 源地址 目標地址
-x: exactly,不要對計數器的計數結果做單位換算,而顯示其精確值
匹配條件:
通用匹配
-s 地址:指定報文源IP地址匹配的範圍;可以是IP,也可以是網絡地址;可使用!取反;--src, --source
-d 地址:指定報文目標IP地址匹配的範圍;--dst,--destination
-p 協議:指定匹配報文的協議類型,一般有三種tcp, udp和icmp;
-iINTERFACE: 數據報文流入的接口;PREROUTING,INPUT, FORWARD
-o INTERFACE: 數據報文流出的接口;OUTPUT,FORWARD, POSTROUITING
擴展匹配
隱式擴展:當使用-p{tcp|udp|icmp}中的一種時,可以直接使用擴展專用選項;
-ptcp:
--sport PORT[-PORT]: 指定源端口
--dport PORT[-PORT]: 指定目標端口
--tcp-flags
-pudp:
--sport
--dport
-p icmp [-m icmp]
--icmp-type
0:echo-reply, ping響應
8:echo-request, ping請求
顯式擴展:必須明確說明使用哪個模塊進行擴展,而後才能使用其擴展專用選項;
-mstate –state
multiport: 多端口匹配
可用於匹配非連續或連續端口;最多指定15個端口;
--source-ports, --sportsport[,port,port:port]
--destination-ports,--dports
--ports
例:
# iptables -I INPUT -d 172.16.31.30 -p tcp -m multiport--dports 22,80 -j ACCEPT
# iptables -IOUTPUT -s 172.16.31.30 -p tcp -m multiport --sports 22,80 -j ACCEPT
iprange: 匹配指定範圍內的地址;匹配一段連續的地址而非整個網絡時有用;
取反([!]) --src-ragneIP[-IP]
取反([!]) --dst-range
例:# iptables -A INPUT -d 172.16.31.30 -p tcp --dport 23-m iprange --src-range 172.16.31.30-172.16.31.100 -j ACCEPT
# iptables -AOUTPUT -s 172.16.31.30 -p tcp --sport 23 -m iprange --dst-range 172.16.31.1-172.16.31.100-j ACCEPT
string:字符串匹配,能夠檢測報文應用層中的字符串
--algo {kmp|bm}
--string"STRING"
--hex-string"HEX_STRING": HEX_STRING爲編碼成16進制格式的字串;
例:# iptables -I OUTPUT -m string --algo kmp --string"hello" -j DROP
time: 基於時間做訪問控制
--datestartYYYY[-MM][-DD[Thh[:mm[:ss]]]]
--datestop
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
--weekdays day[,day]
Mon, Tue,
例:# iptables -I INPUT -d 172.16.31.30 -p tcp --dport 80-m time --timestart 08:00 --timestop 18:00 --weekdays Mon,Tue,Thu,Fri -j REJECT
connlimit: 連接數限制,對每IP所能夠發起併發連接數做限制
[!] --connlimit-above [n]
例:iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22 -mconnlimit --connlimit-above 2 -j DROP
limit: 速率限制
--limitn[/second|/minute|/hour|/day]
--limit-burst n
例:# iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT
state: 狀態檢查
--state
例:iptables -A INPUT -m state--state NEW -p tcp ! --syn -j DROP
iptables狀態跟蹤
NEW,請求建立連接的包、完全陌生的包
ESTABLISHED,將要或已經建立連接的包
RELATED,與已知某個連接相關聯的包
INVALID,無對應連接,以及連接無效的包
UNTRACKED,未跟蹤狀態的包
SNAT源地址轉換
做完路由選擇後,針對來自局域網、即將從外網接口發出去的數據包,將其源IP地址修改爲公網地址
例:# iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -o eth1 -j SNAT --to-source 1.1.1.1
MASQUERADE --- 地址僞裝
外網接口的IP地址不固定的情況
將SNAT規則改爲MASQUERADE
對於ADSL撥號連接
例:iptables -t nat -A POSTROUTING -s 172.16.0.0/24 -o eth1 -jMASQUERADE
DNAT目標地址轉換
例:宣佈WEB
# iptables-t nat -A PREROUTING -i eth1 -d 1.1.1.1 -p tcp --dport 80 -j DNAT--to-destination 172.16.31.30
開機後自動加載已保存的規則
# iptables-save > /etc/sysconfig/iptables