一、基本匹配條件:
基本匹配條件:內建
基本匹配條件:無需加載任何模塊,由iptables/netfilter自行提供;
- [!] -s, --source address[/mask][,...]:檢查報文中的源IP地址是否符合此處指定的地址或范圍,加!是取反;
[root@bogon ~]# iptables -t filter -A INPUT -s 192.168.0.0/16 -d 192.168.1.11 -p tcp -j ACCEPT#允許來自192.168的原地址訪問本機tcp服務
[root@bogon ~]# iptables -A OUTPUT -s192.168.1.11 -d 192.168.0.0/16 -p tcp -j ACCEPT#允許本機來訪問192.168的目的地址的主機tcp服務
- [!] -d, --destination address[/mask][,...]:檢查報文中的目標IP地址是否符合此處指定的地址或范圍,加!是取反;
所有地址:0.0.0.0/0 - [!] -p, --protocol protocol:指定協議
protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or "all"
{tcp|udp|icmp}
[root@bogon ~]# iptables -A INPUT -d 192.168.1.11 -p icmp -j ACCEPT #允許icmp協議ping進來
[root@bogon ~]# iptables -A OUTPUT -s 192.168.1.11 -p icmp -j ACCEPT#允許icmp協議有ping返回值
- [!] -i, --in-interface name:數據報文流入的接口;只能應用于數據報文流入的環節,只能應用于PREROUTING,INPUT和FORWARD鏈;
- [!] -o, --out-interface name:數據報文流出的接口;只能應用于數據報文流出的環節,只能應用于FORWARD、OUTPUT和POSTROUTING鏈;
處理動作:-j targetname [per-target-options]
ACCEPT
DROP
REJECT
二、匹配條件中的擴展匹配條件:
- 隱式擴展:在使用-p選項指明了特定的協議時,無需再同時使用-m選項指明擴展模塊的擴展機制;
- 顯式擴展:必須使用-m選項指明要調用的擴展模塊的擴展機制;
1、隱式擴展
- 隱式擴展:不需要手動加載擴展模塊;因為它們是對協議的擴展,所以,但凡使用-p指明了協議,就表示已經指明了要擴展的模塊;
tcp協議:
- [!] --source-port, --sport port[:port]:匹配報文的源端口;可以是端口范圍;
[root@bogon ~]# iptables -I INPUT -s 192.168.1.0/16 -d 192.168.1.11 -p tcp --dport 22 -j ACCEPT #指定原地址范圍可以訪問本機的22號端口
[root@bogon ~]# iptables -I OUTPUT -s 192.168.1.11 -d 192.168.1.0/16 -p tcp --sport 22 -j ACCEPT#
[root@bogon ~]# iptables -A INPUT -d 192.168.1.11 -j -REJECT#如果不能被上面兩條匹配,主機拒絕任何訪問
[root@bogon ~]# iptables -A OUTPUT -s 192.168.1.11 -j -REJECT
[root@bogon ~]# iptables -P INPUT ACCEPT
[root@bogon ~]# iptables -P OUTPUT ACCEPT
- [!] --destination-port,--dport port[:port]:匹配報文的目標端口;可以是端口范圍;
- [!] --tcp-flags mask comp
mask is the flags which we should examine, written as a comma-separated list,
例如 SYN,ACK,FIN,RST
comp is a comma-separated list of flags which must be set,
例如SYN
例如:“--tcp-flags SYN,ACK,FIN,RST SYN”表示,要檢查的標志位為SYN,ACK,FIN,RST四個,其中SYN必須為1,余下的必須為0;
[!] --syn:用于匹配第一次握手,相當于”--tcp-flags SYN,ACK,FIN,RST SYN“;
udp協議
- [!] --source-port, --sport port[:port]:匹配報文的源端口;可以是端口范圍;
- [!] --destination-port,--dport port[:port]:匹配報文的目標端口;可以是端口范圍;
[root@bogon ~]# iptables -I INPUT -d 192.168.1.11 -p udp --dport 137:138 -j ACCEPT #開放可以訪問本機udp的137到138端口
[root@bogon ~]# iptables -I OUTPUT -s 192.168.1.11 -p udp --sport 137:138 -j ACCEPT #本機udp的137到138端口可出站
icmp協議:
- [!] --icmp-type {type[/code]|typename}
echo-request:8 #ping出去,回顯請求
echo-reply:0 #ping響應
設置本機可以ping其他主機,其他主機不能ping本機
[root@bogon ~]# iptables -A INPUT -i eth0 -j REJECT#設置網卡,規則之外都拒絕
[root@bogon ~]# iptables -A OUTPUT -i eth0 -j REJECT
[root@bogon ~]# iptables -I OUTPUT -s 192.168.1.1 -p icmp --icmp-type 8 -j ACCEPT#設置出站ping報文
[root@bogon ~]# iptables -I INPUT 2 -d 192.168.1.1 -p icmp --icmp-type 0/0 -j ACCEPT#設置入站ping響應報文
如果允許其他主機ping則進站為8,出站為0。
2、顯式擴展
- 顯式擴展:必須要手動加載擴展模塊, [-m matchname [per-match-options]];
- 顯式擴展:必須使用-m選項指明要調用的擴展模塊的擴展機制;
(1)、multiport多端口匹配
以離散或連續的 方式定義多端口匹配條件,最多15個,支持協議tcp, udp, udplite, dccp and sctp;
- [!] --source-ports,--sports port[,port|,port:port]...:指定多個源端口;
- [!] --destination-ports,--dports port[,port|,port:port]...:指定多個目標端口;
[root@bogon ~]# iptables -R INPUT -d 192.168.1.11 -p tcp -m multiport --dports 22,80,139,445,3306 -j ACCEPT#修改入站打開多端口
[root@bogon ~]# iptables -R OUTPUT -s 192.168.1.11 -p tcp -m multiport --sports 22,80,139,445,3306 -j ACCEPT#修改出站打開多端口
(2)、iprange連接追蹤匹配
以連續地址塊的方式來指明多IP地址匹配條件;
- [!] --src-range from[-to]
- [!] --dst-range from[-to]
[root@bogon ~]# iptables -I INPUT 3 -d 192.168.1.11 -p tcp --dports 23 -m iprange --src-range 192.168.1.60-192.168.1.70 -j REJECT#設置一個連續的地址范圍內可以訪問本機23端口
[root@bogon ~]# iptables -I OUTPUT 3 -s 192.168.1.11 -p tcp --sports 23 -m iprange --src-range 192.168.1.60-192.168.1.70 -j REJECT
(3)、time擴展:基于時間區間做訪問控制
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
- [!] --weekdays day[,day...]
- [!] --monthdays day[,day...]
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--kerneltz:使用內核配置的時區而非默認的UTC;
[root@bogon ~]# iptables -I OUTPUT 4 -s 192.168.1.11 -p udp --dports 123,323 -j REJECT#開啟出站123,323端口
[root@bogon ~]# iptables -I INPUT 4 -d 192.168.1.11 -p udp --sports 123,323 -j REJECT#開啟入站123,323端
[root@bogon ~]# iptables -R INPUT 4 -d 192.168.1.11 -p tcp --dport 23 -m iprange --src-reange 192.168.1.60-192.16.1.70 -m time --timestart 10:00:00 --timestop 16:00:00 --weekdays 1,2,3,4,5 --kerneltz -j ACCEPT#設定時間為每周1-5的10點到16點允許60-70的ip地址主機入站訪問23端口
[root@bogon ~]# iptables -R OUTPUT 4 -s 192.168.1.11 -p tcp --sport 23 -m iprange --dsp-reange 192.168.1.60-192.16.1.70 -m time --timestart 10:00:00 --timestop 16:00:00 --weekdays 1,2,3,4,5 --kerneltz -j ACCEPT#設定時間為每周1-5的10點到16點允許60-70的ip地址主機訪問23端口出站響應
注意:centos6不用指明--kerneltz
(4)、string字符串匹配(只能對明文編碼匹配)
--algo {bm|kmp}
[!] --string pattern
[!] --hex-string pattern
--from offset
--to offset
[root@bogon ~]# iptables -I OUTPUT -s 192.168.1.11 -m string --algo kmp --string "holle" -j REJECT#出站報文出現holle字符串,則不能發送
(5)、connlimit 單個客戶端最多并發數量匹配
--connlimit-upto n #小于n允許
--connlimit-above n #大于n拒絕
[root@bogon ~]# iptables -I INPUT -s 192.168.10/16 -d 192.168.1.11 -p tcp --dport 3306 -j ACCEPT#開放入站訪問3306端口
[root@bogon ~]# iptables -I OUTPUT -d 192.168.10/16 -s 192.168.1.11 -p tcp --sport 3306 -j ACCEPT#開放訪問3306端口出站響應
[root@bogon ~]# iptables -R INPUT -s 192.168.10/16 -d 192.168.1.11 -p tcp --dport 3306 -m connlimit --connlimit-upto 2 -j ACCEPT#開放入站訪問3306端口,每個ip只能連接2次
(6)、limit 基于限制發包速率做限制
專用選項:利用令牌桶算法
--limit rate[/second|/minute|/hour|/day] 單位時間的速率
--limit-burst number 最大收集多少令牌
[root@bogon ~]# iptables -I INPUT 6 -d 192.168.1.11 -p icmp --icmp-type 8 -m liit-burst 5 --limit 20/minute -j ACCEPT#入站限制5個令牌,每分鐘20個發包速率
[root@bogon ~]# iptables -I OUTPUT 6 -s 192.168.1.11 -p icmp --icmp-type 0 -j ACCEPT#出站不限制速率
限制本機某tcp服務接收新請求的速率:--syn, -m limit
三、state擴展:追蹤報文
啟用連接追蹤模板記錄連接,并根據連接匹配連接狀態的擴展;
- [!] --state state 指明那些狀態
INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED.
NEW: 新連接請求;
ESTABLISHED:已建立的連接;
INVALID:無法識別的連接;
RELATED:相關聯的連接,當前連接是一個新請求,但附屬于某個已存在的連接;
UNTRACKED:未追蹤的連接;
1.state擴展:
內核模塊裝載:
nf_conntrack
nf_conntrack_ipv4
追蹤到的連接:/proc/net/nf_conntrack
調整可記錄的連接數量最大值:/proc/sys/net/nf_conntrack_max
超時時長:/proc/sys/net/netfilter/timeout
[root@bogon ~]# iptables -F #清空規則
[root@bogon ~]# iptables -A INPUT -d 192.168.1.11 -p tcp -m multiport ---dports 22:23,80,139,445,3306 -m state --state NEW -j ACCEPT#新建tcp連接放行入站訪問22,23,80,139,445,3306端口
[root@bogon ~]# iptables -I INPUT 2 -d 192.168.1.11 -p udp --dport 137:138 -m state --state NEW -j ACCEPT#新建udp連接放行入站訪問137,138端口
[root@bogon ~]# iptables -I OUTPUT 2 -s 192.168.1.11 -p udp -m --multiport ---dport 123,323 -m state --state NEW -j ACCEPT#允許123,323出站響應
[root@bogon ~]# iptables -I INPUT -d 192.168.1.11 -m state --state ESTABLISHED -j ACCEPT#允許已建立的入站連接訪問所有端口
[root@bogon ~]# iptables -I OUTPUT -s 192.168.1.11 -m state --state ESTABLISHED -j ACCEPT#允許已建立的出站連接訪問所有端口響應
[root@bogon ~]# iptables -A INPUT -d192.168.1.11 -j REJECT#默認入站規則為拒絕
[root@bogon ~]# iptables -A INPUT -s192.168.1.11 -j REJECT#默認出站為拒絕
[root@bogon ~]# iptables -vnL #查詢規則
測試連接
RELATED狀態的追蹤:
需要手動裝載狀態的追蹤模塊:nf_conntrack_ftp
[root@bogon ~]#modprobe nf_conntrack_ftp #手動裝載狀態的追蹤模塊
[root@bogon ~]#lsmod #查詢模塊
[root@bogon ~]# iptables -R INPUT 3 -d 192.168.1.11 -p tcp -m multiport --dports 21:23,80,139,445,3306 -m state --state NEW -j ACCEPT#修改第三條tcp連接放行入站訪問
[root@bogon ~]# iptables -R INPUT 1 -d 192.168.1.11 -m state --state ESTABLISHED,RELATED -j ACCEPT#修改第一條允許已建立的入站連接訪問所有端口
2.處理動作(跳轉目標):
-j targetname [per-target-options]
簡單target:
ACCEPT, DROP擴展target:
REJECT
--reject-with type:拒絕類型LOG日志
--log-level
--log-prefix
[root@bogon ~]# iptables -I INPUT 3 -d 192.168.1.11 -p tcp --dport 23 -m state --state NEW -j LOG --log-prefix"access telnet"#保存入站的23端口訪問日志前綴為access telnet
默認日志保存于/var/log/messages
3.自定義鏈做為target(處理動作):
[root@bogon ~]# iptables -N in_ping_rules#自定義一個ping處理動作
[root@bogon ~]# iptables -A in_ping_rules -d 192.168.1.11 -p icmp --icmp-type8 -j ACCEPT #設定本機可以ping其他主機
[root@bogon ~]# iptables -I in_ping_rules -d 192.168.1.11 -s 192.168.1.12 -p icmp -j REJECT #禁止68主機ping本機
#加入INPUT表里才能生效
[root@bogon ~]# iptables -I INPUT 5 -d 192.168.1.11 -p icmp -j in_ping_rules#在INPUT表中第五行加入引用自定義處理動作
- 一個主鏈可以調用多個自定義鏈,要想刪除自定義鏈,必須先清空自定義鏈
[root@bogon ~]# iptables -F in_ping_rules#清空規則
[root@bogon ~]# iptables -vnL#查詢
[root@bogon ~]# iptables -X in_ping_rules#刪除
RETURN:返回調用者;
四、保存和載入規則:
- 保存:iptables-save > /PATH/TO/SOME_RULE_FILE
- 重載:iptabls-restore < /PATH/FROM/SOME_RULE_FILE
-n, --noflush:不清除原有規則
-t, --test:僅分析生成規則集,但不提交 - CentOS 6:
- 保存規則:
service iptables save
保存規則于/etc/sysconfig/iptables文件,覆蓋保存;
重載規則:
service iptables restart
默認重載/etc/sysconfig/iptables文件中的規則
配置文件:/etc/sysconfig/iptables-config
- CentOS 7:
(1) 自定義Unit File,進行iptables-restore;
(2) firewalld服務;
(3) 自定義腳本;
五、規則優化的思路:
使用自定義鏈管理特定應用的相關規則,模塊化管理規則;
(1) 優先放行雙方向狀態為ESTABLISHED的報文;
(2) 服務于不同類別的功能的規則,匹配到報文可能性更大的放前面;
(3) 服務于同一類別的功能的規則,匹配條件較嚴格的放在前面;
(4) 設置默認策略:白名單機制
(a) iptables -P,不建議;
(b) 建議在規則的最后定義規則做為默認策略;