1? 概述
iptables命令中,需要根據(jù)匹配的條件作出相應(yīng)的動(dòng)作,本文將結(jié)合例子,講解匹配條件
匹配條件分為基本和擴(kuò)展的條件
基本:通用的,PARAMETERS,無(wú)需加載模塊,由iptables/netfilter自行提供
擴(kuò)展:需要加載擴(kuò)展模塊(/usr/lib64/xtables/*.so),方可生效。其中擴(kuò)展分為顯示擴(kuò)展和隱式擴(kuò)展
2實(shí)驗(yàn)環(huán)境準(zhǔn)備:
.Centos7:
因?yàn)樵赾entos7上,firewalld和iptables是二選一,這里禁用默認(rèn)的firewalld,啟用iptables
systemctl? stop firewalld.service
systemctl? disable firewalld.service
.Centos6:
centos6上執(zhí)行以下兩個(gè)語(yǔ)句,關(guān)掉默認(rèn)的防火墻策略,而不是直接禁用防火墻。可以用自定義的防火墻策略
service iptables? stop;
chkconfig??? iptables?off;
3基本匹配條件:
無(wú)需加載模塊,由iptables/netfilter自行提供
iptables命令本身就帶有這些功能,不需要添加模塊。
定義防火墻要注意,不要制定錯(cuò)誤的策略,把自己拒絕了。
[!] -s, --sourceaddress[/mask][,...]:源IP地址或范圍
這里可以用!感嘆號(hào)表示取反,如下語(yǔ)句表示僅允許192.168.32.65這個(gè)ip,其他的ip都拒絕了。注意,以下的語(yǔ)句如果192.168.32.65不是本機(jī)ip的話,則此次連接就會(huì)被拒絕。這個(gè)要注意。
iptables -A INPUT ! -s 192.168.32.65 -j REJECT
表示除了192.168.32.0/24的網(wǎng)段不拒絕,其他網(wǎng)段都拒絕
iptables -A INPUT ! -s192.168.32.0/24 -j REJECT
[!] -d, --destinationaddress[/mask][,...]:目標(biāo)IP地址或范圍
[!] -p, --protocol protocol:指定協(xié)議,可使用數(shù)字如0(all)
protocol: tcp, udp, icmp,icmpv6,udplite,esp, ah, sctp, mh?? or“all“參看:/etc/protocols
[!] -i, --in-interface name:報(bào)文流入的接口;只能應(yīng)用于數(shù)據(jù)
報(bào)文流入環(huán)節(jié),只應(yīng)用于INPUT、FORWARD、PREROUTING鏈
#以下策略表示eth0拒絕icmp協(xié)議,即禁ping
iptables -A INPUT -i eth0 -p icmp -j REJECT
[!] -o, --out-interface name:報(bào)文流出的接口;只能應(yīng)用于數(shù)據(jù)報(bào)文流出的環(huán)節(jié),只應(yīng)用于FORWARD、OUTPUT、POSTROUTING鏈
4擴(kuò)展匹配條件:
需要加載擴(kuò)展模塊(/usr/lib64/xtables/*.so),方可生效
.查看幫助maniptables-extensions
4.1隱式擴(kuò)展:
在使用-p選項(xiàng)指明了特定的協(xié)議時(shí),無(wú)需再用-m選項(xiàng)指明擴(kuò)展模塊的擴(kuò)展機(jī)制,不需要手動(dòng)加載擴(kuò)展模塊。
.tcp協(xié)議的擴(kuò)展選項(xiàng)
[!] --source-port, --sportport[:port]:匹配報(bào)文源端口,可為端口范圍
[!] --destination-port,--dport? port[:port]:匹配報(bào)文目標(biāo)端口,可為范圍
[!] --tcp-flags mask comp
例子:禁止tcp協(xié)議的80端口被訪問(wèn)
iptables -A INPUT -p tcp--dport 80 -j REJECT
mask需檢查的標(biāo)志位列表,用,分隔
例如SYN,ACK,FIN,RST
comp在mask列表中必須為1的標(biāo)志位列表,無(wú)指定則必須為0,用,分隔
tcp協(xié)議的擴(kuò)展選項(xiàng)
.示例:
--tcp-flags SYN,ACK,FIN,RST SYN表示要檢查的標(biāo)志位為SYN,ACK,FIN,RST四個(gè),其中SYN必須為1,余下的必須為0
#以下例子表示要檢查SYN,ACK,FIN,RST四位,其中SYN,ACK必須為1,F(xiàn)IN,RST必須為0.
--tcp-flags SYN,ACK,FIN,RST SYN,ACK
#表示檢查所有的位都為1,這個(gè)是不正常的報(bào)文,可能是黑客構(gòu)造的問(wèn)題報(bào)文
--tcp-flags ALL ALL
#表示檢查所有的位都為0,這個(gè)也是不正常報(bào)文
--tcp_flagsALL NONE
.[!] --syn:用于匹配第一次握手
相當(dāng)于:--tcp-flagsSYN,ACK,FIN,RST SYN
.udp協(xié)議的擴(kuò)展選項(xiàng)
[!] --source-port, --sportport[:port]:匹配報(bào)文的源端口;可以是端口范圍
port[:port]:這里的端口是多個(gè)端口,但是必須是連續(xù)的端口
[!]--destination-port,--dportport[:port]:匹配報(bào)文的目標(biāo)端口;可以是端口范圍
.icmp協(xié)議的擴(kuò)展選項(xiàng)
[!] --icmp-type{type[/code]|typename}
type/code
0/0 echo-reply????? icmp應(yīng)答
#以下命令禁止了主機(jī)去ping其他主機(jī),因?yàn)檫@樣該機(jī)器就不能收到其他主機(jī)發(fā)回來(lái)的應(yīng)答的ping包。
iptables -A INPUT -p icmp--icmp-type 0 -j REJECT
8/0 echo-request icmp請(qǐng)求
#如以下命令拒絕了ping的請(qǐng)求包,該主機(jī)就禁止別的主機(jī)來(lái)ping,因?yàn)榘裵ing的請(qǐng)求包都拒絕了
iptables -A INPUT -p icmp--icmp-type 8 -j REJECT
4.2顯式擴(kuò)展:
必須使用-m選項(xiàng)指明要調(diào)用的擴(kuò)展模塊的擴(kuò)展機(jī)制,要手動(dòng)加載擴(kuò)展模塊,[-mmatchname? [per-match-options]]
.使用幫助,查看顯示擴(kuò)展的選項(xiàng)
CentOS 6: man iptables
CentOS 7: man iptables-extensions
.1、multiport擴(kuò)展
注意要加上-m,表示要調(diào)用multiport這個(gè)模塊
以離散方式定義多端口匹配,最多指定15個(gè)端口
[!] --source-ports,--sportsport[,port|,port:port]...:指定多個(gè)源端口
#以下例子表示拒絕源主機(jī)是172.18.50.75的機(jī)器的80和21端口的包。控制本主機(jī)訪問(wèn)指定主機(jī)的指定端口
iptables -A INPUT -s172.18.50.75? -p tcp -m multiport--sports 80,21 -j REJECT
[!]--destination-ports,--dports??port[,port|,port:port]...:指定多個(gè)目標(biāo)端口,這個(gè)配置是禁止別的主機(jī)來(lái)訪問(wèn)本主機(jī)的這些端口。控制別的主機(jī)來(lái)訪問(wèn)本主機(jī)的指定端口
[!] --portsport[,port|,port:port]...多個(gè)源或目標(biāo)端口
#示例一:
# -s 172.16.0.0/16表示禁止172.16.0.0/16這個(gè)網(wǎng)段的主機(jī)來(lái)訪問(wèn)
iptables-A INPUT -s 172.16.0.0/16 -d172.16.100.10 -p tcp? -m multiport--dports? 20:22,80 -j ACCEPT
#例子二
iptables -A INPUT -s172.18.50.73 -p tcp -m multiport --dports 80,22 -j REJECT
.2、iprange擴(kuò)展
指明連續(xù)的(但一般不是整個(gè)網(wǎng)絡(luò))ip地址范圍
[!] --src-range from[-to]源IP地址范圍
#以下語(yǔ)句本機(jī)將拒絕來(lái)自172.18.50.60-172.18.50.80的ssh連接和80端口的訪問(wèn)
iptables -A INPUT -miprange --src-range 172.18.50.60-172.18.50.80 -p tcp -m multiport --dports22,80 -j REJECT
[!] --dst-range from[-to]目標(biāo)IP地址范圍
#以下將本機(jī)將拒絕去往172.18.50.60-172.18.50.80ssh連接80端口的訪問(wèn)
iptables -A INPUT -miprange --dst-range 172.18.50.60-172.18.50.80 -p tcp -m multiport --dports22,80 -j REJECT
#表示來(lái)自172.16.100.5-172.16.100.10的ip訪問(wèn)172.16.100.10這臺(tái)主機(jī)的80端口都拒絕
iptables -A INPUT -d 172.16.100.10-p tcp --dport 80 -m iprange?--src-range172.16.100.5-172.16.100.10 -j DROP
.3、mac擴(kuò)展
指明源MAC地址
適用于:PREROUTING,FORWARD,INPUTchains
[!] --mac-source XX:XX:XX:XX:XX:XX
示例:
#拒絕源ip172.16.0.100的網(wǎng)卡mac為00:50:56:12:34:56的訪問(wèn)
iptables -A INPUT -s 172.16.0.100 -mmac --mac-source 00:50:56:12:34:56
-j ACCEPT
#拒絕來(lái)自源ip:172.16.0.100的所有訪問(wèn)
iptables-A INPUT -s 172.16.0.100 -jREJECT
.4、string擴(kuò)展
對(duì)報(bào)文中的應(yīng)用層數(shù)據(jù)做字符串模式匹配檢測(cè)
--algo {bm|kmp}:字符串匹配檢測(cè)算法
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
--from offset開(kāi)始偏移
--to offset結(jié)束偏移
[!] --string pattern:要檢測(cè)的字符串模式,只能處理明文數(shù)據(jù)
[!] --hex-string pattern:要檢測(cè)字符串模式,16進(jìn)制格式
示例:
#禁止去往目的地是172.18.50.75的80端口中包含有sunny的數(shù)據(jù)包
iptables -A OUTPUT -d172.18.50.75 -p tcp --sport 80 -m string --algo bm --string "sunny"-j REJECT
#禁止來(lái)自172.18.50.75的80端口返回的包中有sunny字符串的包
iptables -A INPUT -s172.18.50.75 -p tcp --sport 80 -m string --algo bm --string "sunny"-j REJECT
.5、time擴(kuò)展
根據(jù)將報(bào)文到達(dá)的時(shí)間與指定的時(shí)間范圍進(jìn)行匹配
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]日期
--datestopYYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss]時(shí)間
--timestop hh:mm[:ss]
[!] --monthdays day[,day...]每個(gè)月的幾號(hào)
[!] --weekdays day[,day...]星期幾
--kerneltz:內(nèi)核時(shí)區(qū),本地時(shí)間,不建議使用,CentOS7系統(tǒng)默認(rèn)為UTC,所以需要轉(zhuǎn)換時(shí)間,差八個(gè)小時(shí)
注意:centos6不支持kerneltz,--localtz指定本地時(shí)區(qū)(默認(rèn)),centos6默認(rèn)使用本地時(shí)間
注意:默認(rèn)情況下,centos7用的是UTC時(shí)間(世界協(xié)調(diào)時(shí)間:UniversalTime Coordinated),而中國(guó)主機(jī)一般都是用CST時(shí)間(China Standard TimeUT8:00),UTC時(shí)間比CST時(shí)間晚八個(gè)小時(shí),所以在centos7上通過(guò)iptables來(lái)定義時(shí)間范圍時(shí),如果系統(tǒng)使用CST時(shí)間,就要減去8個(gè)小時(shí),如要定義時(shí)間為9:00--18:00,那么用iptables定義的時(shí)間應(yīng)該是1:00--10:00
centos6默認(rèn)則是使用的是當(dāng)?shù)貢r(shí)間,即在中國(guó)就是使用CST時(shí)間,不需要減去8小時(shí)進(jìn)行轉(zhuǎn)換
示例:
centos6上以下這配置表示CST時(shí)間9:00--12:55。不允許其他主機(jī)訪問(wèn)80端口
centos7上以下這配置表示UTC時(shí)間9:00--12:55,要轉(zhuǎn)換為CST時(shí)間,需要加上8小時(shí),即表示CST時(shí)間17:00--20:55期間不允許訪問(wèn)80端口
iptables -A INPUT -m time--timestart 09:00 --timestop 12:55 -p tcp --dport 80 -j REJECT
在centos6上,以下語(yǔ)句表示星期3,5,6這三天CST時(shí)間9:00--12:55期間不允許其他主機(jī)訪問(wèn)80端口
iptables -R INPUT 1 -mtime --weekdays Wed,Fr,Sa --timestart 09:00 --timestop 12:55 -p tcp --dport 80-j REJECT
.6、connlimit擴(kuò)展
根據(jù)每客戶端IP做并發(fā)連接數(shù)數(shù)量匹配,可防止CC(ChallengeCollapsar挑戰(zhàn)黑洞)攻擊
--connlimit-upton:連接的數(shù)量小于等于n時(shí)匹配,小于或者等于多少的這個(gè)數(shù)字一般是允許的
--connlimit-above n:連接的數(shù)量大于n時(shí)匹配,一般大于多少的時(shí)候是拒絕
通常分別與默認(rèn)的拒絕或允許策略配合使用
示例:
#表示同一個(gè)主機(jī)ip來(lái)連接時(shí),只允許一個(gè)ip的ssh進(jìn)行連接,當(dāng)同一ip超過(guò)一個(gè)ssh連接的時(shí)候拒絕ssh連接.但是如果客戶端不是復(fù)制出來(lái)的時(shí)候,那么就不會(huì)拒絕
iptables -A INPUT -p tcp--dport 22 -m connlimit --connlimit-above 1 -j REJECT
#以下語(yǔ)句表示訪問(wèn)80端口的并發(fā)數(shù)超過(guò)15的時(shí)候,就拒絕訪問(wèn),可以用ab -c 15-n 1000 http://172.18.50.65/這個(gè)命令進(jìn)行測(cè)試,當(dāng)并發(fā)數(shù)大于15的時(shí)候就會(huì)拒絕訪問(wèn)
iptables -A INPUT -p tcp--dport 80 -m connlimit --connlimit-above 15 -j REJECT
.7、limit擴(kuò)展
基于收發(fā)報(bào)文的速率做匹配
令牌桶過(guò)濾器
--limit rate[/second|/minute|/hour|/day]表示每分鐘或者每秒允許通過(guò)多少
--limit-burst number:表示前面幾個(gè)包不限制,超過(guò)多少的時(shí)候開(kāi)始限制
兩個(gè)選項(xiàng)要一起使用
示例:
#以下語(yǔ)句表示前5個(gè)包icmp的請(qǐng)求包不限制,超過(guò)5個(gè)包后,每分鐘只運(yùn)行3個(gè),
iptables -A INPUT -d 172.16.100.10-p icmp?--icmp-type 8 -m limit --limit3/minute --limit-burst 5 -j ACCEPT
#插入第2條記錄,拒絕所有的icmp請(qǐng)求包
iptables -A INPUT 2 -p icmp -j REJECT
以上兩條規(guī)則要一起加。默認(rèn)的行為就拒絕
.8、state擴(kuò)展
根據(jù)”連接追蹤機(jī)制“去檢查連接的狀態(tài),較耗資源
.conntrack機(jī)制:追蹤本機(jī)上的請(qǐng)求和響應(yīng)之間的關(guān)系
.狀態(tài)有如下幾種:
這里的狀態(tài)跟蹤和tcp的狀態(tài)是不一樣的概念。
一般做防火墻策略時(shí),新發(fā)起的請(qǐng)求拒絕,但是已經(jīng)是連接狀態(tài)的包是被允許的。而且一般把允許已經(jīng)連接的策略放在前面。
NEW:新發(fā)出請(qǐng)求;連接追蹤信息庫(kù)中不存在此連接的相關(guān)信息條目,因此,將其識(shí)別為第一次發(fā)出的請(qǐng)求
ESTABLISHED:NEW狀態(tài)之后,連接追蹤信息庫(kù)中為其建立的條目失效之前期間內(nèi)所進(jìn)行的通信狀態(tài)
RELATED:新發(fā)起的但與已有連接相關(guān)聯(lián)的連接,如:ftp協(xié)議中的數(shù)據(jù)連接與命令連接之間的關(guān)系
INVALID:無(wú)效的連接,如flag標(biāo)記不正確
UNTRACKED:未進(jìn)行追蹤的連接,如raw表中關(guān)閉追蹤
.[!] --state state
.示例:
iptables? -A INPUT -d 172.16.100.10 -p tcp? -m? multiport --dports22,80 -m state --stateNEW,ESTABLISHED -j ACCEPT
一般把正在建立連接的防火墻策略放在前面。這樣不好影響正在連接的用戶,而且效率高。常用的要放在前面。
iptables? -A OUTPUT -s 172.16.100.10 -p tcp? -m multiport --sports 22,80 -m state --stateESTABLISHED -j ACCEPT
.已經(jīng)追蹤到的并記錄下來(lái)的連接信息庫(kù)
/proc/net/nf_conntrack
.調(diào)整連接追蹤功能所能夠容納的最大連接數(shù)量,這個(gè)數(shù)值可以更改
/proc/sys/net/nf_conntrack_max
.不同的協(xié)議的連接追蹤時(shí)長(zhǎng)
/proc/sys/net/netfilter/
.注意:CentOS7需要加載模塊:modprobe? nf_conntrack
.iptables的鏈接跟蹤表最大容量為/proc/sys/net/nf_conntrack_max,各種狀態(tài)的超時(shí)鏈接會(huì)從表中刪除;當(dāng)模板滿載時(shí),后續(xù)連接可能會(huì)超時(shí)
.解決方法兩個(gè):
(1)加大nf_conntrack_max值,編輯/etc/sysctl.conf這個(gè)文件,寫入.nf_conntrack_max = 200000將改為20000.重啟網(wǎng)絡(luò)服務(wù)后生效
vi /etc/sysctl.conf
net.nf_conntrack_max= 393216
net.netfilter.nf_conntrack_max=393216
(2)降低nf_conntrack? timeout時(shí)間
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
net.netfilter.nf_conntrack_tcp_timeout_fin_wait=120
iptables? -t nat?-L -n
9、開(kāi)放被動(dòng)模式的ftp服務(wù)例子
.(1)裝載ftp連接追蹤的專用模塊:
一般不定義OUTPUT,否則很可能會(huì)把自己主機(jī)出去的連接拒絕。
跟蹤模塊路徑:/lib/modules/kernelversion/kernel/net/netfilter
vim /etc/sysconfig/iptables-config #配置文件
IPTABLES_MODULES="nf_conntrack_ftp"
modprobe? nf_conntrack_ftp
檢查:lsmod | grep ftp查看是否成功加載模塊,nf_conntrack_ftp這個(gè)模塊如果不加載,將不能識(shí)別ftp服務(wù),不能進(jìn)行跟蹤,導(dǎo)致策略失敗
.(2)放行請(qǐng)求報(bào)文:
命令連接:NEW,ESTABLISHED
數(shù)據(jù)連接:RELATED,ESTABLISHED
iptables? –IINPUT -d LocalIP? -p tcp? -m state --state ??RELATED,ESTABLISHED -j ACCEPT
iptbles? -A INPUT -d LocalIP? -p tcp--dport?21 -m state --state NEW -j ACCEPT
例子
iptables -A INPUT -m state--state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp--dport 21 -m state --state NEW -j ACCEPT
.(3)放行響應(yīng)報(bào)文:
#這一步可以不操作
iptables? -I OUTPUT?-s LocalIP? -p tcp-m state --state? ESTABLISHED -j ACCEPT
開(kāi)放被動(dòng)模式的ftp服務(wù)示例
yum install vsftpd
systemctl start vsftpd
modprobe nf_conntrack_ftp
iptables -F
iptables -A INPUT -m state--state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp--dport 21 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -mstate --state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP