前序
iptables的起源發(fā)展防火墻的工作原理等這里我們就不在復(fù)述。這里主要記錄下日常運維過程中關(guān)于iptables的命令,參數(shù)及實際運用。
鏈路管理命令
iptables -F 清除預(yù)設(shè)表filter中的所有規(guī)則鏈的規(guī)則
iptables -X 清除預(yù)設(shè)表filter中使用者自定鏈中的規(guī)則
iptables -P :設(shè)置默認策略的
iptables -Z:清空鏈,及鏈中默認規(guī)則的計數(shù)器
iptables -N:NEW 支持用戶新建一個鏈
iptables -L -n 查看規(guī)則
鏈表規(guī)則管理命令
-A:追加,在當(dāng)前鏈的最后新增一個規(guī)則
-I num : 插入,把當(dāng)前規(guī)則插入為第幾條。
-I 3 :插入為第三條
-o 指定數(shù)據(jù)包傳出的那個網(wǎng)絡(luò)接口。經(jīng)常與OUTPUT鏈配合
-p 指定規(guī)則使用的協(xié)議
常用 tcp,udp,icmp,all
-s 指定來源ip或者網(wǎng)絡(luò),可以整個段,可以單個ip
例如 192.168.31.0/24 192.168.31.2
規(guī)則前加 !表示取反 例如:
iptables -A INPUT -i eth0 -p tcp --dport=80 -s 192.168.31.0/24 -j ACCEPT
這表示允許192.168.31.0網(wǎng)段的機器通過eth0網(wǎng)卡訪問本機80端口
iptables -A INPUT -i eth0 -p tcp --dport=80 -s !192.168.31.0/24 -j ACCEPT
這就表示不允許了 因為!取反
-d 與-s類似功能
-j 需要執(zhí)行的動作
主要有ACCEPT,DROP,REJECT,REDIRECT
-i 指定數(shù)據(jù)包進入的那個網(wǎng)卡。
如 eth0,lo 此參數(shù)一般配合INPUT鏈?zhǔn)褂?
-m 指定使用的模塊
例如: multiport(啟用多端口擴展)
state(狀態(tài)監(jiān)測)
limit(限制)
mac(網(wǎng)卡物理地址)
.......
-R num:Replays替換/修改第幾條規(guī)則
格式:iptables -R 3 …………
-D num:刪除,明確指定刪除第幾條規(guī)則
設(shè)置預(yù)置規(guī)則
-P 指定鏈策略
-t 指定鏈表
例如允許所有數(shù)據(jù)流出
iptables -P OUTPUT ACCEPT (不指定-t 默認為filter表)
--sport與--dport
--sport 限制來源的端口號
tcp連接實際是兩個端口建立連接。
所以來源端口號就是別人訪問你這個服務(wù)時他的端口號
--dport 恰恰相反.也就是你服務(wù)的端口號。所以我們基本使用的都是dport
狀態(tài)檢測
-m state --state <狀態(tài)>
有數(shù)種狀態(tài),狀態(tài)有:
- INVALID:無效的封包,例如數(shù)據(jù)破損的封包狀態(tài)
- ESTABLISHED:已經(jīng)聯(lián)機成功的聯(lián)機狀態(tài);
- NEW:想要新建立聯(lián)機的封包狀態(tài);
- RELATED:表示這個封包是與我們主機發(fā)送出去的封包有關(guān), 可能是響應(yīng)封包或者是聯(lián)機成功之后的傳送封包!這個狀態(tài)很常被設(shè)定,因為設(shè)定了他之后,只要未來由本機發(fā)送出去的封包,即使我們沒有設(shè)定封包的 INPUT 規(guī)則,該有關(guān)的封包還是可以進入我們主機, 可以簡化相當(dāng)多的設(shè)定規(guī)則。
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -P OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
一般當(dāng)我們需要建立一些臨時規(guī)則時 一般會在開頭加上這3句
這樣的作用:
不影響現(xiàn)有的傳入數(shù)據(jù)。而且也不用擔(dān)心開放了之前拒絕的端口
不影響流出數(shù)據(jù)
不影響本地Lo環(huán)路數(shù)據(jù)(訪問本地127.0.0.1)
常用的規(guī)則配置:
允許192.168.31.0網(wǎng)段訪問80端口
iptables -A INPUT -p tcp --dport 80 -s 192.168.31.0/24 -j ACCEPT
不允許
iptables -A INPUT -p tcp --dport 80 -s !192.168.31.0/24 -j ACCEPT
或
iptables -A INPUT -p tcp --dport 80 -s 192.168.31.0/24 -j DROP
只允許 mac地址為aa:bb:cc:dd:ee:ff 的機器訪問本地ssh端口
iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff -p tcp --dport 22 -j ACCEPT
將80端口重定向到8080端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
443端口限流,每秒最多150個連接(防ddos)
iptables -A INPUT -i eth0 -p tcp --dport 443 -m limit --limit 150/s --limit-burst 150 -j ACCEPT
防SYN_FLOOD
iptables -N syn-flood (新建一條鏈)
iptables -A INPUT -p tcp --syn -j syn-flood
iptables -A syn-flood -p tcp -m limit --limit 2/s --limit-burst 50 -j RETURN
iptables -A syn-flood -j DROP
單個ip最大并發(fā)數(shù)50
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j REJECT
對訪問本機的22端口進行限制,每個ip每小時只能連接5次,超過的拒接,1小時候重新計算次數(shù)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --rcheck --seconds 3600 --hitcount 5 -j DROP
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --set -j ACCEPT
(上面recent規(guī)則只適用于默認規(guī)則為DROP中,如果要適用默認ACCEPT的規(guī)則,需要--set放前面 并且無-j ACCEPT)
預(yù)防cc攻擊
tcpdump -tnn dst port 80 -c 100 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -n -r |head -20
查找發(fā)包最多的ip
iptables -I INPUT -s ip -j REJECT
封掉