iptables的使用 基本用法: 詳細用法說明: 1)table 2)subcommand選項 1》鏈管理 2》查看: 3》規則管理: 3)鏈chain: 4)match,匹配條件 1》基本匹配條件: 2》擴展匹配條件: 1 隱式擴展 :對某一種協議的擴展 1.tcp 協議, m tcp,擴展選項 ...
iptables的使用
基本用法:
iptables [-t table] [subcommand] chain [rulenum] [options...] [match] [target]
iptables [-t 表名] <-A|-I|-D|-R> 鏈名 [規則編號][-i|o 網卡名稱][-p 協議類型][-s 源ip地址][源子網][--sport 源埠號][-d 目標ip地址|目標子網][--dport 目標埠號][-j 處理動作]
詳細用法說明:
1)table
filter:一般的過濾功能,包含input,forward,output。預設選項
nat:用於地址轉換、映射、埠映射等,包含prerouting,postrouting
mangle:用於對特定數據包的修改,包含prerouting,output,forward,input,postrouting
raw:一般是為了不再讓iptables做數據包的連接跟蹤處理,從而提供性能,包含prerouting,output
2)subcommand選項
1》鏈管理
-N :new, 自定義一條新的規則鏈
-X :delete ,刪除自定義的空的規則鏈
-P :Policy ,設置預設策略;對filter 表中的鏈而言,其預設策略有:ACCEPT :接受,DROP :丟棄
-E :重命名自定義鏈;引用計數不為0 的自定義鏈不能夠被重命名,也不能被刪除
2》查看:
-L :list, 列出指定鏈上的所有規則,本選項須置後
-n :numberic ,以數字格式顯示地址和埠號
-v :verbose ,詳細信息
-vv:更詳細
-x :exactly ,顯示計數器結果的精確值, 而非單位轉換後的易讀值
--line-numbers :顯示規則的序號
-S :selected, 以iptables-save命令格式顯示鏈上規則
常用組合:
--vnL
--vvnxL --line-numbers
3》規則管理:
-A :append,追加
-I :insert,插入,要指明插入的規則編號,預設為第一條。
-D :delete,刪除。(1)指明規則序號,(2)指明規則本身
-R :replace ,替換指定鏈上的指定規則編號
-F :flush ,清空指定的規則鏈
-Z :zero ,置零
iptables 的每條規則都有兩個計數器
(1)匹配到的報文的個數
(2)匹配到的所有報文的大小之和
3)鏈chain:
INPUT:通過路由表判斷後目的地是本機,然後進入本機內部資源
OUTPUT:有本機產生的數據向外部轉發
FORWARD:通過路由表判斷後目的地不是本機,然後通過路由轉發到其他地方
PREROUTING:流入的數據包進入路由表之前
POSTROUTING:傳出的數據包到達網卡出口之前
4)match,匹配條件
基本:通用的,parameters
擴展:需載入模塊,match extentions
1》基本匹配條件:
無需載入模塊,由iptables/netfilter 自行提供
[!] -s, --source address[/mask][,...] :源IP 地址或範圍
[!] -d, --destination address[/mask][,...] :目標IP 地址或範圍
[!] -p, --protocol protocol :指定協議,可使用數字如0(all),protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp,mh or “all“ 參看:/etc/protocols
[!] -i, --in-interface name :報文流入的介面;只能應用於數據報文流入環節,只應用於 INPUT 、FORWARD 、PREROUTING 鏈
[!] -o, --out-interface name :報文流出的介面;只能應用於數據報文流出的環節,只應用於 FORWARD 、OUTPUT 、 POSTROUTING 鏈
2》擴展匹配條件:
需要載入擴展模塊(/usr/lib64/xtables/*.so),方可生效,是對某一種功能的擴展,經由擴展模塊引入的匹配機制。
查看幫助:man iptables-extensions
1>隱式擴展 :對某一種協議的擴展
在使用-p 選項指明瞭特定的協議時,無需再用-m 選項指明擴展模塊的擴展機制,不需要手動載入擴展模塊。
-p做協議匹配,協議有:tcp,udp,icmp,icmpv6,ah,esp,sctp,mh,all
1.tcp 協議,-m tcp,擴展選項
[!] --source-port, --sport port[:port] :匹配報文tcp首部源埠,可為埠範圍
[!] --destination-port,--dport port[:port] :匹配報文目標埠,可為範圍
[!] --tcp-flags mask comp:mask需檢查的標誌位列表,用逗號分隔,如 SYN,ACK,FIN,RST,PSH,URG,ALL,NONE.comp在mask列表中必須為1的標誌位列表,無指定則必須為0,用逗號分割
[!] --syn :用於匹配第一次握手。相當於:--tcp-flags SYN,ACK,FIN,RST,SYN
2.udp 協議,-m udp,擴展選項
[!] --source-port, --sport port[:port] :匹配報文udp首部的源埠;可以是埠範圍
[!] --destination-port,--dport port[:port] :匹配報文udp首部的目標埠;可以是埠範圍
3.icmp
ICMP是(Internet Control Message Protocol)Internet控制報文協議。它是TCP/IP協議族的一個子協議,用於在IP主機、路由器之間傳遞控制消息。控制消息是指網路通不通、主機是否可達、路由是否可用等網路本身的消息。這些控制消息雖然並不傳輸用戶數據,但是對於用戶數據的傳遞起著重要的作用。)
-m icmp:專有選項
[!] --icmp-type {type[/code]|typename}:type/code為 0/0 echo-reply表示icmp 應答,type/code為8/0 echo-request表示icmp 請求
2>顯式擴展 :
額外附加的更多的匹配規則,功能性擴展
必須使用-m 選項指明要調用的擴展模塊的擴展機制,要手動載入擴展模塊,即[-m matchname [per-match-options]
-m 模塊名稱
每個模塊會引入新的匹配機制
可以通過rpm -ql iptables 來獲得那些模塊可用,模塊是以.so結尾的。
使用幫助:
man iptables (centos6)
man iptables-extensions(centos7)
1. multiport擴展
以離散方式定義多埠匹配, 最多指定15 個埠
[!] --source-ports,--sports port[,port|,port:port]...:指定多個源埠
[!] --destination-ports,--dports port[,port|,port:port]...:指定多個目標埠
[!] --ports port[,port|,port:port]...:多個非連續的源或目標埠
示例:
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp -m multiport --dports 20:22,80 -j ACCEPT
2. iprange擴展
指明連續的(但一般不是整個網路)ip 地址範圍
[!] --src-range from[-to]:源IP 地址範圍
[!] --dst-range from[-to]:目標IP 地址範圍
示例:
iptables -A INPUT -d 172.16.100.10 -p tcp --dport 80 -m iprange --src-range 172.16.100.5-172.16.100.10 -j DROP
3. mac 擴展
指明源MAC 地址
適用於:PREROUTING, FORWARD,INPUT chains
[!] --mac-source XX:XX:XX:XX:XX:XX
示例:
iptables -A INPUT -s 172.16.0.100 -m mac --mac-source 00:50:56:12:34:56 -j ACCEPT
iptables -A INPUT -s 172.16.0.100 -j REJECT
4. string 擴展
對報文中的應用層數據做字元串模式匹配檢測
--algo {bm|kmp} :字元串匹配檢測演算法,bm :Boyer-Moore,kmp :Knuth-Pratt-Morris
--from offset :開始偏移
--to offset :結束偏移
[!] --string pattern :要檢測的字元串模式
[!] --hex-string pattern :要檢測字元串模式,16 進位格式
示例:
iptables -A OUTPUT -s 172.16.100.10 -d 0/0 -p tcp --sport 80 -m string --algo bm --string “google" -j REJECT
5. 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...]:星期幾
--kerneltz :內核時區,不建議使用,CentOS7 系統預設為UTC
註意:centos6 不支持kerneltz,--localtz 指定本地時區( 預設)
示例:
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP
6. connlimit 擴展
根據每客戶端IP 做併發連接數數量限制,即每個客戶端最多可同時發起的連接數量,通常分別與預設的拒絕或允許策略配合使用,可防止CC(Challenge Collapsar 挑戰黑洞) 攻擊
--connlimit-upto n :匹配,限定併發連接數的上限
--connlimit-above n :匹配,限定併發連接數的下限
示例:
iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
7. limit擴展
基於收發報文的速率做匹配,使用令牌桶過濾器
--limit rate[/second|/minute|/hour|/day]:數率限定
--limit-burst number:突發數率限定
示例:
iptables -I INPUT -d 172.16.100.10 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT
iptables -I INPUT 2 -p icmp -j REJECT
8. state 擴展
狀態檢測擴展,根據“連接追蹤機制”去檢查連接的狀態,較耗資源。
追蹤本機上的請求和響應之間的關係,狀態有如下幾種:
NEW :新發出請求;連接追蹤信息庫中不存在此連接的相關信息條目,因此,將其識別為第一次發出的請求
ESTABLISHED :NEW 狀態之後,連接追蹤信息庫中為其建立的條目失效之前期間內所進行的通信狀態
RELATED :新發起的但與已有連接相關聯的連接,如:ftp 協議中的數據連接與命令連接之間的關係
INVALID :無效的連接,如flag 標記不正確
UNTRACKED :未進行追蹤的連接,如raw
[!] --state:state就是NEW等狀態
示例:
iptables -A INPUT -d 172.16.100.10 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172.16.100.10 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT
1>
以上連接追蹤功能內核會在記憶體中開闢一段專用的空間用於存儲連接的狀態等,由於此段記憶體空間是有限的,因此就必須對連接追蹤功能進行一些調整限制。
有關的內核參數由以下提供:
已經追蹤到的並記錄下來的連接信息庫
/proc/net/nf_conntrack
調整連接追蹤功能所能夠容納的最大連接數量
/proc/sys/net/nf_conntrack_max
不同的協議的連接追蹤時長
/proc/sys/net/netfilter/
註意:CentOS7 需要載入模塊: modprobe nf_conntrack
2>
iptables 的鏈接跟蹤表最大容量為/proc/sys/net/nf_conntrack_max ,各種狀態的超時鏈接會從表中刪除;當模板滿載時,後續連接可能會超時
解決方法兩個:
(1) 加大nf_conntrack_max 值
vi /etc/sysctl.conf
net.nf_conntrack_max = 393216
net.netfilter.nf_conntrack_max = 393216
(2) 降低 nf_conntrack timeout 時間
vi /etc/sysctl.conf
net.netfilter.nf_conntrack_tcp_timeout_established = 300
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
iptables -t nat -L -n
3>
開放被動模式的ftp服務
(1)裝載ftp 連接追蹤的專用模塊:
跟蹤模塊路徑:/lib/modules/kernelversion/kernel/net/netfilter
vim /etc/sysconfig/iptables-config 配置文件
IPTABLES_MODULES=" nf_conntrack_ftp "
modproble nf_conntrack_ftp
(2)放行請求報文:
命令連接:NEW, ESTABLISHED
數據連接:RELATED, ESTABLISHED
iptables –I INPUT -d LocalIP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW -j ACCEPT
(3)放行響應報文:
iptables -I OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT
5)terget,處理動作
-j targetname [per-target-options]:跳轉目標
簡單:
ACCEPT :接受
DROP :丟棄
擴展:
REJECT :明確拒絕,預設
RETURN :返回調用鏈
REDIRECT :埠重定向
LOG :記錄日誌,dmesg
MARK :做防火牆標記
DNAT :目標地址轉換
SNAT :源地址轉換
MASQUERADE :地址偽裝
...
自定義鏈:
LOG:非中斷target, 本身不拒絕和允許, 放在拒絕和允許規則前並將日誌記錄在/var/log/messages 系統日誌中
--log-level level:級別有emerg, alert, crit, error,warning, notice, info or debug
--log-prefix prefix:日誌首碼,用於區別不同的日誌,最多29個字元。
示例:
iptables -I INPUT -s 10.0.1.0/24 -p tcp -m multimport --dports 80,21,22,23 -m state --state NEW -j LOG --log-prefix "new connections: