語法
? ? iptables? ? (選項)? ? (參數(shù))
選項
? ? -t, --table table 對指定的表 table 進行操作右遭, table 必須是 raw沿猜, nat橡类,filter笼蛛,mangle 中的一個。如果不指定此選項弛车,默認(rèn)的是 filter 表齐媒。
? ? # 通用匹配:源地址目標(biāo)地址的匹配
? ? -p:指定要匹配的數(shù)據(jù)包協(xié)議類型;
? ? -s, --source [!] address[/mask] :把指定的一個/一組地址作為源地址帅韧,按此規(guī)則進行過濾里初。當(dāng)后面沒有 mask 時啃勉,address 是一個地址忽舟,比如:192.168.1.1;當(dāng) mask 指定時淮阐,可以表示一組范圍內(nèi)的地址叮阅,比如:192.168.1.0/255.255.255.0。
? ? -d, --destination [!] address[/mask] :地址格式同上泣特,但這里是指定地址為目的地址浩姥,按此進行過濾。
? ? -i, --in-interface [!] <網(wǎng)絡(luò)接口name> :指定數(shù)據(jù)包的來自來自網(wǎng)絡(luò)接口状您,比如最常見的 eth0 勒叠。注意:它只對 INPUT,F(xiàn)ORWARD膏孟,PREROUTING 這三個鏈起作用眯分。如果沒有指定此選項, 說明可以來自任何一個網(wǎng)絡(luò)接口柒桑。同前面類似弊决,"!" 表示取反。
? ? -o, --out-interface [!] <網(wǎng)絡(luò)接口name> :指定數(shù)據(jù)包出去的網(wǎng)絡(luò)接口。只對 OUTPUT飘诗,F(xiàn)ORWARD与倡,POSTROUTING 三個鏈起作用。
? ? # 查看管理命令
? ? -L, --list [chain] 列出鏈 chain 上面的所有規(guī)則昆稿,如果沒有指定鏈纺座,列出表上所有鏈的所有規(guī)則。
? ? # 規(guī)則管理命令
? ? -A, --append chain rule-specification 在指定鏈 chain 的末尾插入指定的規(guī)則貌嫡,也就是說比驻,這條規(guī)則會被放到最后,最后才會被執(zhí)行岛抄。規(guī)則是由后面的匹配來指定别惦。
? ? -I, --insert chain [rulenum] rule-specification 在鏈 chain 中的指定位置插入一條或多條規(guī)則。如果指定的規(guī)則號是1夫椭,則在鏈的頭部插入掸掸。這也是默認(rèn)的情況,如果沒有指定規(guī)則號蹭秋。
? ? -D, --delete chain rule-specification -D, --delete chain rulenum 在指定的鏈 chain 中刪除一個或多個指定規(guī)則扰付。
? ? -R num:Replays替換/修改第幾條規(guī)則
? ? # 鏈管理命令(這都是立即生效的)
? ? -P, --policy chain target :為指定的鏈 chain 設(shè)置策略 target。注意仁讨,只有內(nèi)置的鏈才允許有策略羽莺,用戶自定義的是不允許的。
? ? -F, --flush [chain] 清空指定鏈 chain 上面的所有規(guī)則洞豁。如果沒有指定鏈盐固,清空該表上所有鏈的所有規(guī)則。
? ? -N, --new-chain chain 用指定的名字創(chuàng)建一個新的鏈丈挟。
? ? -X, --delete-chain [chain] :刪除指定的鏈刁卜,這個鏈必須沒有被其它任何規(guī)則引用,而且這條上必須沒有任何規(guī)則曙咽。如果沒有指定鏈名蛔趴,則會刪除該表中所有非內(nèi)置的鏈。
? ? -E, --rename-chain old-chain new-chain :用指定的新名字去重命名指定的鏈例朱。這并不會對鏈內(nèi)部照成任何影響孝情。
? ? -Z, --zero [chain] :把指定鏈,或者表中的所有鏈上的所有計數(shù)器清零洒嗤。
? ? -j, --jump target <指定目標(biāo)> :即滿足某條件時該執(zhí)行什么樣的動作箫荡。target 可以是內(nèi)置的目標(biāo),比如 ACCEPT烁竭,也可以是用戶自定義的鏈菲茬。
? ? -h:顯示幫助信息;
基本參數(shù)
參數(shù)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?作用
-P? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 設(shè)置默認(rèn)策略:iptables -P INPUT (DROP
-F? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 清空規(guī)則鏈
-L? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 查看規(guī)則鏈
-A? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 在規(guī)則鏈的末尾加入新規(guī)則
-I? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? num在規(guī)則鏈的頭部加入新規(guī)則
-D? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?num刪除某一條規(guī)則
-s? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?匹配來源地址IP/MASK,加嘆號"!"表示除這個IP外婉弹。
-d? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?匹配目標(biāo)地址
-i? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?網(wǎng)卡名稱 匹配從這塊網(wǎng)卡流入的數(shù)據(jù)
-o? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 網(wǎng)卡名稱 匹配從這塊網(wǎng)卡流出的數(shù)據(jù)
-p? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 匹配協(xié)議,如tcp,udp,icmp
--dport num? ? ? ? ? ? ? ? ? ? ? ? ? ? 匹配目標(biāo)端口號
--sport num? ? ? ? ? ? ? ? ? ? ? ? ? ? ?匹配來源端口號
命令選項輸入順序
? ? iptables -t 表名 <-A/I/D/R> 規(guī)則鏈名 [規(guī)則號] <-i/o 網(wǎng)卡名> -p 協(xié)議名 <-s 源IP/源子網(wǎng)> --sport 源端口 <-d 目標(biāo)IP/目標(biāo)子網(wǎng)> --dport 目標(biāo)端口 -j 動作
工作機制
規(guī)則鏈名包括(也被稱為五個鉤子函數(shù)(hook functions)):
INPUT鏈 :處理輸入數(shù)據(jù)包睬魂。
OUTPUT鏈 :處理輸出數(shù)據(jù)包。
PORWARD鏈 :處理轉(zhuǎn)發(fā)數(shù)據(jù)包镀赌。
PREROUTING鏈 :用于目標(biāo)地址轉(zhuǎn)換(DNAT)氯哮。
POSTOUTING鏈 :用于源地址轉(zhuǎn)換(SNAT)。
防火墻的策略
防火墻策略一般分為兩種商佛,一種叫通策略喉钢,一種叫堵策略,通策略良姆,默認(rèn)門是關(guān)著的肠虽,必須要定義誰能進。堵策略則是玛追,大門是洞開的税课,但是你必須有身份認(rèn)證,否則不能進痊剖。所以我們要定義韩玩,讓進來的進來,讓出去的出去陆馁,所以通找颓,是要全通,而堵叮贩,則是要選擇击狮。當(dāng)我們定義的策略的時候,要分別定義多條功能妇汗,其中:定義數(shù)據(jù)包中允許或者不允許的策略帘不,filter過濾的功能说莫,而定義地址轉(zhuǎn)換的功能的則是nat選項杨箭。為了讓這些功能交替工作,我們制定出了“表”這個定義储狭,來定義互婿、區(qū)分各種不同的工作功能和處理方式。
我們現(xiàn)在用的比較多個功能有3個:
filter定義允許或者不允許的辽狈,只能做在3個鏈上:INPUT慈参,F(xiàn)ORWARD,OUTPUT
nat定義地址轉(zhuǎn)換的刮萌,也只能做在3個鏈上:PREROUTING驮配,OUTPUT,POSTROUTING
mangle功能:修改報文原數(shù)據(jù),是5個鏈都可以做:PREROUTING壮锻,INPUT琐旁,F(xiàn)ORWARD,OUTPUT猜绣,POSTROUTING
我們修改報文原數(shù)據(jù)就是來修改TTL的灰殴。能夠?qū)崿F(xiàn)將數(shù)據(jù)包的元數(shù)據(jù)拆開,在里面做標(biāo)記/修改內(nèi)容的掰邢。而防火墻標(biāo)記牺陶,其實就是靠mangle來實現(xiàn)的。
小擴展:
對于filter來講一般只能做在3個鏈上:INPUT辣之,F(xiàn)ORWARD掰伸,OUTPUT
對于nat來講一般也只能做在3個鏈上:PREROUTING,OUTPUT怀估,POSTROUTING
而mangle則是5個鏈都可以做:PREROUTING碱工,INPUT,F(xiàn)ORWARD奏夫,OUTPUT怕篷,POSTROUTING
iptables/netfilter(這款軟件)是工作在用戶空間的,它可以讓規(guī)則進行生效的酗昼,本身不是一種服務(wù)廊谓,而且規(guī)則是立即生效的。而我們iptables現(xiàn)在被做成了一個服務(wù)麻削,可以進行啟動蒸痹,停止的。啟動呛哟,則將規(guī)則直接生效叠荠,停止,則將規(guī)則撤銷扫责。
iptables還支持自己定義鏈榛鼎。但是自己定義的鏈,必須是跟某種特定的鏈關(guān)聯(lián)起來的鳖孤。在一個關(guān)卡設(shè)定者娱,指定當(dāng)有數(shù)據(jù)的時候?qū)iT去找某個特定的鏈來處理,當(dāng)那個鏈處理完之后苏揣,再返回黄鳍。接著在特定的鏈中繼續(xù)檢查。
注意:規(guī)則的次序非常關(guān)鍵平匈,誰的規(guī)則越嚴(yán)格框沟,應(yīng)該放的越靠前藏古,而檢查規(guī)則的時候,是按照從上往下的方式進行檢查的忍燥。
表名包括:
raw:高級功能校翔,如:網(wǎng)址過濾。
mangle:數(shù)據(jù)包修改(QOS)灾前,用于實現(xiàn)服務(wù)質(zhì)量防症。
net:地址轉(zhuǎn)換,用于網(wǎng)關(guān)路由器哎甲。
filter:包過濾蔫敲,用于防火墻規(guī)則。
動作包括:
ACCEPT:接收數(shù)據(jù)包炭玫。
DROP:丟棄數(shù)據(jù)包奈嘿。
REDIRECT:重定向、映射吞加、透明代理裙犹。
SNAT:源地址轉(zhuǎn)換。
DNAT:目標(biāo)地址轉(zhuǎn)換衔憨。
MASQUERADE:IP偽裝(NAT)叶圃,用于ADSL。
LOG:日志記錄践图。
實例
清空當(dāng)前的所有規(guī)則和計數(shù)
? ? iptables -F? # 清空所有的防火墻規(guī)則
? ? iptables -X? # 刪除用戶自定義的空鏈
? ? iptables -Z? # 清空計數(shù)
配置允許ssh端口連接
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
? ? # 22為你的ssh端口掺冠, -s 192.168.1.0/24表示允許這個網(wǎng)段的機器來連接,其它網(wǎng)段的ip地址是登陸不了你的機器的码党。 -j ACCEPT表示接受這樣的請求
允許本地回環(huán)地址可以正常使用
iptables -A INPUT -i lo -j ACCEPT
? ? #本地圓環(huán)地址就是那個127.0.0.1德崭,是本機上使用的,它進與出都設(shè)置為允許
iptables -A OUTPUT -o lo -j ACCEPT
設(shè)置默認(rèn)的規(guī)則
? ? iptables -P INPUT DROP # 配置默認(rèn)的不讓進
? ? iptables -P FORWARD DROP # 默認(rèn)的不允許轉(zhuǎn)發(fā)
? ? iptables -P OUTPUT ACCEPT # 默認(rèn)的可以出去
配置白名單
? ? iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT? # 允許機房內(nèi)網(wǎng)機器可以訪問
? ? iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT? # 允許機房內(nèi)網(wǎng)機器可以訪問
? ? iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT # 允許183.121.3.7訪問本機的3380端口
開啟相應(yīng)的服務(wù)端口
? ? iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 開啟80端口,因為web對外都是這個端口
? ? iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT # 允許被ping
? ? iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 已經(jīng)建立的連接得讓它進來
保存規(guī)則到配置文件中
? ? cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak # 任何改動之前先備份揖盘,請保持這一優(yōu)秀的習(xí)慣
iptables-save > /etc/sysconfig/iptables
cat /etc/sysconfig/iptables
列出已設(shè)置的規(guī)則
? ? iptables -L [-t 表名] [鏈名]
四個表名 raw眉厨,nat,filter兽狭,mangle
五個規(guī)則鏈名 INPUT憾股、OUTPUT、FORWARD椭符、PREROUTING荔燎、POSTROUTING
filter表包含INPUT耻姥、OUTPUT销钝、FORWARD三個規(guī)則鏈
? ? iptables -L -t nat? ? ? ? ? ? ? ? ? # 列出 nat 上面的所有規(guī)則
? ? #? ? ? ? ? ? ^ -t 參數(shù)指定,必須是 raw琐簇, nat蒸健,filter座享,mangle 中的一個
? ? iptables -L -t nat? --line-numbers? # 規(guī)則帶編號
iptables -L INPUT
? ? iptables -L -nv? # 查看,這個列表看起來更詳細
清除已有規(guī)則
? ? iptables -F INPUT? # 清空指定鏈 INPUT 上面的所有規(guī)則
? ? iptables -X INPUT? # 刪除指定的鏈似忧,這個鏈必須沒有被其它任何規(guī)則引用渣叛,而且這條上必須沒有任何規(guī)則。
? ? ? ? ? ? ? ? ? ? ? # 如果沒有指定鏈名盯捌,則會刪除該表中所有非內(nèi)置的鏈淳衙。
? ? iptables -Z INPUT? # 把指定鏈,或者表中的所有鏈上的所有計數(shù)器清零饺著。
?添加一條規(guī)則
iptables -A INPUT -s 192.168.1.5 -j DROP
將所有iptables以序號標(biāo)記顯示箫攀,執(zhí)行:
iptables -L -n --line-numbers
root@homestead:~# iptables -L -n --line-number
比如要刪除INPUT里序號為1的規(guī)則,執(zhí)行:
iptables -D INPUT 1
開放指定的端口
? ? iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT? ? ? ? ? ? ? #允許本地回環(huán)接口(即運行本機訪問本機)
? ? iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT? ? #允許已建立的或相關(guān)連的通行
? ? iptables -A OUTPUT -j ACCEPT? ? ? ? #允許所有本機向外的訪問
? ? iptables -A INPUT -p tcp --dport 22 -j ACCEPT? ? #允許訪問22端口
? ? iptables -A INPUT -p tcp --dport 80 -j ACCEPT? ? #允許訪問80端口
? ? iptables -A INPUT -p tcp --dport 21 -j ACCEPT? ? #允許ftp服務(wù)的21端口
? ? iptables -A INPUT -p tcp --dport 20 -j ACCEPT? ? #允許FTP服務(wù)的20端口
? ? iptables -A INPUT -j reject? ? ? #禁止其他未允許的規(guī)則訪問
? ? iptables -A FORWARD -j REJECT? ? #禁止其他未允許的規(guī)則訪問
屏蔽IP
? ? iptables -A INPUT -p tcp -m tcp -s 192.168.0.8 -j DROP? # 屏蔽惡意主機(比如幼衰,192.168.0.8
? ? iptables -I INPUT -s 123.45.6.7 -j DROP? ? ? #屏蔽單個IP的命令
? ? iptables -I INPUT -s 123.0.0.0/8 -j DROP? ? ? #封整個段即從123.0.0.1到123.255.255.254的命令
? ? iptables -I INPUT -s 124.45.0.0/16 -j DROP? ? #封IP段即從123.45.0.1到123.45.255.254的命令
? ? iptables -I INPUT -s 123.45.6.0/24 -j DROP? ? #封IP段即從123.45.6.1到123.45.6.254的命令是
指定數(shù)據(jù)包出去的網(wǎng)絡(luò)接口
? 只對 OUTPUT靴跛,F(xiàn)ORWARD,POSTROUTING三個鏈起作用渡嚣。
iptables -A FORWARD -o eth0
查看已添加的規(guī)則
iptables -L -n -v
啟動網(wǎng)絡(luò)轉(zhuǎn)發(fā)規(guī)則
公網(wǎng)210.14.67.7讓內(nèi)網(wǎng)192.168.188.0/24上網(wǎng)
iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 210.14.67.127
端口映射
本機的 2222端口映射到內(nèi)網(wǎng) 虛擬機的22端口
iptables -t nat -A PREROUTING -d 210.14.67.127 -p tcp --dport 2222? -j DNAT --to-dest 192.168.188.115:22
字符串匹配
比如梢睛,我們要過濾所有TCP連接中的字符串test,一旦出現(xiàn)它我們就終止這個連接识椰,我們可以這么做:
iptables -A INPUT -p tcp -m string --algo kmp --string "test" -j REJECT --reject-with tcp-reset
iptables -L
阻止Windows蠕蟲的攻擊
iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --algo kmp --string "cmd.exe"
防止SYN洪水攻擊
iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT
使用場景實例
? 場景一:開放 tcp 10-22/80端口 開放 icmp其他未被允許的端口禁止訪問绝葡,存在的問題:本機無法訪問本機;本機無法訪問其他主機
? ? iptables -I INPUT -p tcp --dport 80 -j ACCEPT # 允許 tcp 80 端口
? ? iptables -I INPUT -p tcp --dport 10:22 -j ACCEPT # 允許 tcp 10-22 端口
? ? iptables -I INPUT -p icmp -j ACCEPT # 允許icmp
? ? iptables -A INPUT -j REJECT # 添加一條規(guī)則, 不允許所有
? ? # 優(yōu)化場景一
? ? iptables -I INPUT -i lo -j ACCEPT # 允許本機訪問
? ? iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允許訪問外網(wǎng)
? ? iptables -I INPUT -p tcp --dport 80 -s 10.10.188.233 -j ACCEPT # 只允許固定ip訪問80
場景二? ftp:默認(rèn)被動模式(服務(wù)器產(chǎn)生隨機端口告訴客戶端,客戶端主動連接這個端口拉取數(shù)據(jù)) vsftpd:使 ftp支持主動模式(客戶端產(chǎn)生隨機端口通知服務(wù)器,服務(wù)器主動連接這個端口發(fā)送數(shù)據(jù))
?vi /etc/vsftpd/vsftpd.conf # 使用 vsftpd 開啟 ftp 主動模式
port_enable=yes
connect_from_port_20=YES
iptables -I INPUT -p tcp --dport 21 -j ACCEPT
? ? vi /etc/vsftpd/vsftpd.conf # 建議使用 ftp 被動模式
pasv_min_port=50000
pasv_max_port=60000
iptables -I INPUT -p tcp --dport 21 -j ACCEPT
iptables -I INPUT -p tcp --dport 50000:60000 -j ACCEPT
? ? tips:還可以使用 iptables 模塊追蹤來自動開發(fā)對應(yīng)的端口
? 場景三
允許外網(wǎng)訪問: web http -> 80/tcp; https -> 443/tcp mail smtp -> 25/tcp; smtps -> 465/tcp pop3 -> 110/tcp; pop3s -> 995/tcp imap -> 143/tcp
內(nèi)部使用: file nfs -> 123/udp samba -> 137/138/139/445/tcp ftp -> 20/21/tcp remote ssh -> 22/tcp sql mysql -> 3306/tcp oracle -> 1521/tcp
? ? iptables -I INPUT -i lo -j ACCEPT # 允許本機訪問
? ? iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允許訪問外網(wǎng)
? ? iptables -I INPUT -s 10.10.155.0/24 -j ACCEPT # 允許內(nèi)網(wǎng)訪問
? ? iptables -I INPUT -p tcp -m multiport --dports 80,1723 -j ACCEPT # 允許端口, 80 -> http, 1723 -> vpn
? ? iptables -A INPUT -j REJECT # 添加一條規(guī)則, 不允許所有
? ? iptables-save # 保存設(shè)置到配置文件
? ?場景四??nat轉(zhuǎn)發(fā)
?iptables -t nat -L # 查看 nat 配置
iptables -t nat -A POST_ROUTING -s 10.10.177.0/24 -j SNAT --to 10.10.188.232 # SNAT
?vi /etc/sysconfig/network # 配置網(wǎng)關(guān)
iptables -t nat -A POST_ROUTING -d 10.10.188.232 -p tcp --dport 80 -j DNAT --to 10.10.177.232:80 # DNAT
? ? 場景五??防CC攻擊
? ? iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j REJECT # 限制并發(fā)連接訪問數(shù)
? ? iptables -I INPUT -m limit --limit 3/hour --limit-burst 10 -j ACCEPT # limit模塊; --limit-burst 默認(rèn)為5