1? 概述
iptables命令中庐橙,需要根據匹配的條件作出相應的動作羞海,本文將結合例子粒没,講解匹配條件
匹配條件分為基本和擴展的條件
基本:通用的,PARAMETERS藻懒,無需加載模塊剔猿,由iptables/netfilter自行提供
擴展:需要加載擴展模塊(/usr/lib64/xtables/*.so),方可生效嬉荆。其中擴展分為顯示擴展和隱式擴展
2實驗環(huán)境準備:
.Centos7:
因為在centos7上归敬,firewalld和iptables是二選一,這里禁用默認的firewalld员寇,啟用iptables
systemctl? stop firewalld.service
systemctl? disable firewalld.service
.Centos6:
centos6上執(zhí)行以下兩個語句弄慰,關掉默認的防火墻策略第美,而不是直接禁用防火墻蝶锋。可以用自定義的防火墻策略
service iptables? stop;
chkconfig??? iptables?off什往;
3基本匹配條件:
無需加載模塊扳缕,由iptables/netfilter自行提供
iptables命令本身就帶有這些功能,不需要添加模塊别威。
定義防火墻要注意躯舔,不要制定錯誤的策略,把自己拒絕了省古。
[!] -s, --sourceaddress[/mask][,...]:源IP地址或范圍
這里可以用!感嘆號表示取反粥庄,如下語句表示僅允許192.168.32.65這個ip,其他的ip都拒絕了豺妓。注意惜互,以下的語句如果192.168.32.65不是本機ip的話,則此次連接就會被拒絕琳拭。這個要注意训堆。
iptables -A INPUT ! -s 192.168.32.65 -j REJECT
表示除了192.168.32.0/24的網段不拒絕,其他網段都拒絕
iptables -A INPUT ! -s192.168.32.0/24 -j REJECT
[!] -d, --destinationaddress[/mask][,...]:目標IP地址或范圍
[!] -p, --protocol protocol:指定協(xié)議白嘁,可使用數字如0(all)
protocol: tcp, udp, icmp,icmpv6,udplite,esp, ah, sctp, mh?? or“all“參看:/etc/protocols
[!] -i, --in-interface name:報文流入的接口坑鱼;只能應用于數據
報文流入環(huán)節(jié),只應用于INPUT絮缅、FORWARD鲁沥、PREROUTING鏈
#以下策略表示eth0拒絕icmp協(xié)議,即禁ping
iptables -A INPUT -i eth0 -p icmp -j REJECT
[!] -o, --out-interface name:報文流出的接口耕魄;只能應用于數據報文流出的環(huán)節(jié)黍析,只應用于FORWARD、OUTPUT屎开、POSTROUTING鏈
4擴展匹配條件:
需要加載擴展模塊(/usr/lib64/xtables/*.so)阐枣,方可生效
.查看幫助maniptables-extensions
4.1隱式擴展:
在使用-p選項指明了特定的協(xié)議時马靠,無需再用-m選項指明擴展模塊的擴展機制,不需要手動加載擴展模塊蔼两。
.tcp協(xié)議的擴展選項
[!] --source-port, --sportport[:port]:匹配報文源端口,可為端口范圍
[!] --destination-port,--dport? port[:port]:匹配報文目標端口,可為范圍
[!] --tcp-flags mask comp
例子:禁止tcp協(xié)議的80端口被訪問
iptables -A INPUT -p tcp--dport 80 -j REJECT
mask需檢查的標志位列表甩鳄,用,分隔
例如SYN,ACK,FIN,RST
comp在mask列表中必須為1的標志位列表,無指定則必須為0额划,用,分隔
tcp協(xié)議的擴展選項
.示例:
--tcp-flags SYN,ACK,FIN,RST SYN表示要檢查的標志位為SYN,ACK,FIN,RST四個妙啃,其中SYN必須為1,余下的必須為0
#以下例子表示要檢查SYN,ACK,FIN,RST四位俊戳,其中SYN,ACK必須為1揖赴,FIN,RST必須為0.
--tcp-flags SYN,ACK,FIN,RST SYN,ACK
#表示檢查所有的位都為1,這個是不正常的報文抑胎,可能是黑客構造的問題報文
--tcp-flags ALL ALL
#表示檢查所有的位都為0燥滑,這個也是不正常報文
--tcp_flagsALL NONE
.[!] --syn:用于匹配第一次握手
相當于:--tcp-flagsSYN,ACK,FIN,RST SYN
.udp協(xié)議的擴展選項
[!] --source-port, --sportport[:port]:匹配報文的源端口;可以是端口范圍
port[:port]:這里的端口是多個端口阿逃,但是必須是連續(xù)的端口
[!]--destination-port,--dportport[:port]:匹配報文的目標端口铭拧;可以是端口范圍
.icmp協(xié)議的擴展選項
[!] --icmp-type{type[/code]|typename}
type/code
0/0 echo-reply????? icmp應答
#以下命令禁止了主機去ping其他主機,因為這樣該機器就不能收到其他主機發(fā)回來的應答的ping包恃锉。
iptables -A INPUT -p icmp--icmp-type 0 -j REJECT
8/0 echo-request icmp請求
#如以下命令拒絕了ping的請求包搀菩,該主機就禁止別的主機來ping,因為把ping的請求包都拒絕了
iptables -A INPUT -p icmp--icmp-type 8 -j REJECT
4.2顯式擴展:
必須使用-m選項指明要調用的擴展模塊的擴展機制破托,要手動加載擴展模塊肪跋,[-mmatchname? [per-match-options]]
.使用幫助,查看顯示擴展的選項
CentOS 6: man iptables
CentOS 7: man iptables-extensions
.1土砂、multiport擴展
注意要加上-m州既,表示要調用multiport這個模塊
以離散方式定義多端口匹配,最多指定15個端口
[!] --source-ports,--sportsport[,port|,port:port]...:指定多個源端口
#以下例子表示拒絕源主機是172.18.50.75的機器的80和21端口的包∥林ィ控制本主機訪問指定主機的指定端口
iptables -A INPUT -s172.18.50.75? -p tcp -m multiport--sports 80,21 -j REJECT
[!]--destination-ports,--dports??port[,port|,port:port]...:指定多個目標端口易桃,這個配置是禁止別的主機來訪問本主機的這些端口⌒烤悖控制別的主機來訪問本主機的指定端口
[!] --portsport[,port|,port:port]...多個源或目標端口
#示例一:
# -s 172.16.0.0/16表示禁止172.16.0.0/16這個網段的主機來訪問
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擴展
指明連續(xù)的(但一般不是整個網絡)ip地址范圍
[!] --src-range from[-to]源IP地址范圍
#以下語句本機將拒絕來自172.18.50.60-172.18.50.80的ssh連接和80端口的訪問
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]目標IP地址范圍
#以下將本機將拒絕去往172.18.50.60-172.18.50.80ssh連接80端口的訪問
iptables -A INPUT -miprange --dst-range 172.18.50.60-172.18.50.80 -p tcp -m multiport --dports22,80 -j REJECT
#表示來自172.16.100.5-172.16.100.10的ip訪問172.16.100.10這臺主機的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擴展
指明源MAC地址
適用于:PREROUTING,FORWARD贸宏,INPUTchains
[!] --mac-source XX:XX:XX:XX:XX:XX
示例:
#拒絕源ip172.16.0.100的網卡mac為00:50:56:12:34:56的訪問
iptables -A INPUT -s 172.16.0.100 -mmac --mac-source 00:50:56:12:34:56
-j ACCEPT
#拒絕來自源ip:172.16.0.100的所有訪問
iptables-A INPUT -s 172.16.0.100 -jREJECT
.4造寝、string擴展
對報文中的應用層數據做字符串模式匹配檢測
--algo {bm|kmp}:字符串匹配檢測算法
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
--from offset開始偏移
--to offset結束偏移
[!] --string pattern:要檢測的字符串模式,只能處理明文數據
[!] --hex-string pattern:要檢測字符串模式吭练,16進制格式
示例:
#禁止去往目的地是172.18.50.75的80端口中包含有sunny的數據包
iptables -A OUTPUT -d172.18.50.75 -p tcp --sport 80 -m string --algo bm --string "sunny"-j REJECT
#禁止來自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擴展
根據將報文到達的時間與指定的時間范圍進行匹配
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]日期
--datestopYYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss]時間
--timestop hh:mm[:ss]
[!] --monthdays day[,day...]每個月的幾號
[!] --weekdays day[,day...]星期幾
--kerneltz:內核時區(qū),本地時間鲫咽,不建議使用签赃,CentOS7系統(tǒng)默認為UTC谷异,所以需要轉換時間,差八個小時
注意:centos6不支持kerneltz锦聊,--localtz指定本地時區(qū)(默認)歹嘹,centos6默認使用本地時間
注意:默認情況下,centos7用的是UTC時間(世界協(xié)調時間:UniversalTime Coordinated)孔庭,而中國主機一般都是用CST時間(China Standard TimeUT8:00)尺上,UTC時間比CST時間晚八個小時,所以在centos7上通過iptables來定義時間范圍時圆到,如果系統(tǒng)使用CST時間怎抛,就要減去8個小時,如要定義時間為9:00--18:00芽淡,那么用iptables定義的時間應該是1:00--10:00
centos6默認則是使用的是當地時間马绝,即在中國就是使用CST時間,不需要減去8小時進行轉換
示例:
centos6上以下這配置表示CST時間9:00--12:55吐绵。不允許其他主機訪問80端口
centos7上以下這配置表示UTC時間9:00--12:55迹淌,要轉換為CST時間河绽,需要加上8小時己单,即表示CST時間17:00--20:55期間不允許訪問80端口
iptables -A INPUT -m time--timestart 09:00 --timestop 12:55 -p tcp --dport 80 -j REJECT
在centos6上,以下語句表示星期3,5,6這三天CST時間9:00--12:55期間不允許其他主機訪問80端口
iptables -R INPUT 1 -mtime --weekdays Wed,Fr,Sa --timestart 09:00 --timestop 12:55 -p tcp --dport 80-j REJECT
.6耙饰、connlimit擴展
根據每客戶端IP做并發(fā)連接數數量匹配,可防止CC(ChallengeCollapsar挑戰(zhàn)黑洞)攻擊
--connlimit-upton:連接的數量小于等于n時匹配纹笼,小于或者等于多少的這個數字一般是允許的
--connlimit-above n:連接的數量大于n時匹配,一般大于多少的時候是拒絕
通常分別與默認的拒絕或允許策略配合使用
示例:
#表示同一個主機ip來連接時苟跪,只允許一個ip的ssh進行連接廷痘,當同一ip超過一個ssh連接的時候拒絕ssh連接.但是如果客戶端不是復制出來的時候,那么就不會拒絕
iptables -A INPUT -p tcp--dport 22 -m connlimit --connlimit-above 1 -j REJECT
#以下語句表示訪問80端口的并發(fā)數超過15的時候件已,就拒絕訪問笋额,可以用ab -c 15-n 1000 http://172.18.50.65/這個命令進行測試,當并發(fā)數大于15的時候就會拒絕訪問
iptables -A INPUT -p tcp--dport 80 -m connlimit --connlimit-above 15 -j REJECT
.7篷扩、limit擴展
基于收發(fā)報文的速率做匹配
令牌桶過濾器
--limit rate[/second|/minute|/hour|/day]表示每分鐘或者每秒允許通過多少
--limit-burst number:表示前面幾個包不限制兄猩,超過多少的時候開始限制
兩個選項要一起使用
示例:
#以下語句表示前5個包icmp的請求包不限制,超過5個包后鉴未,每分鐘只運行3個枢冤,
iptables -A INPUT -d 172.16.100.10-p icmp?--icmp-type 8 -m limit --limit3/minute --limit-burst 5 -j ACCEPT
#插入第2條記錄,拒絕所有的icmp請求包
iptables -A INPUT 2 -p icmp -j REJECT
以上兩條規(guī)則要一起加铜秆。默認的行為就拒絕
.8淹真、state擴展
根據”連接追蹤機制“去檢查連接的狀態(tài),較耗資源
.conntrack機制:追蹤本機上的請求和響應之間的關系
.狀態(tài)有如下幾種:
這里的狀態(tài)跟蹤和tcp的狀態(tài)是不一樣的概念连茧。
一般做防火墻策略時核蘸,新發(fā)起的請求拒絕巍糯,但是已經是連接狀態(tài)的包是被允許的。而且一般把允許已經連接的策略放在前面客扎。
NEW:新發(fā)出請求鳞贷;連接追蹤信息庫中不存在此連接的相關信息條目,因此虐唠,將其識別為第一次發(fā)出的請求
ESTABLISHED:NEW狀態(tài)之后搀愧,連接追蹤信息庫中為其建立的條目失效之前期間內所進行的通信狀態(tài)
RELATED:新發(fā)起的但與已有連接相關聯(lián)的連接,如:ftp協(xié)議中的數據連接與命令連接之間的關系
INVALID:無效的連接疆偿,如flag標記不正確
UNTRACKED:未進行追蹤的連接咱筛,如raw表中關閉追蹤
.[!] --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
.已經追蹤到的并記錄下來的連接信息庫
/proc/net/nf_conntrack
.調整連接追蹤功能所能夠容納的最大連接數量处铛,這個數值可以更改
/proc/sys/net/nf_conntrack_max
.不同的協(xié)議的連接追蹤時長
/proc/sys/net/netfilter/
.注意:CentOS7需要加載模塊:modprobe? nf_conntrack
.iptables的鏈接跟蹤表最大容量為/proc/sys/net/nf_conntrack_max饲趋,各種狀態(tài)的超時鏈接會從表中刪除;當模板滿載時撤蟆,后續(xù)連接可能會超時
.解決方法兩個:
(1)加大nf_conntrack_max值奕塑,編輯/etc/sysctl.conf這個文件,寫入.nf_conntrack_max = 200000將改為20000.重啟網絡服務后生效
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
net.netfilter.nf_conntrack_tcp_timeout_fin_wait=120
iptables? -t nat?-L -n
9家肯、開放被動模式的ftp服務例子
.(1)裝載ftp連接追蹤的專用模塊:
一般不定義OUTPUT龄砰,否則很可能會把自己主機出去的連接拒絕。
跟蹤模塊路徑:/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這個模塊如果不加載换棚,將不能識別ftp服務,不能進行跟蹤反镇,導致策略失敗
.(2)放行請求報文:
命令連接:NEW,ESTABLISHED
數據連接: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)放行響應報文:
#這一步可以不操作
iptables? -I OUTPUT?-s LocalIP? -p tcp-m state --state? ESTABLISHED -j ACCEPT
開放被動模式的ftp服務示例
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