iptables配置文件
直接改iptables配置就可以了:vim /etc/sysconfig/iptables。
1、關(guān)閉所有的 INPUT FORWARD OUTPUT 只對(duì)某些端口開(kāi)放。
下面是命令實(shí)現(xiàn):
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
再用命令 iptables -L -n 查看 是否設(shè)置好, 好看到全部 DROP 了
這樣的設(shè)置好了,我們只是臨時(shí)的, 重啟服務(wù)器還是會(huì)恢復(fù)原來(lái)沒(méi)有設(shè)置的狀態(tài)
還要使用 service iptables save 進(jìn)行保存
看到信息 firewall rules?防火墻的規(guī)則 其實(shí)就是保存在 /etc/sysconfig/iptables
可以打開(kāi)文件查看 vi /etc/sysconfig/iptables
2、
下面我只打開(kāi)22端口,看我是如何操作的,就是下面2個(gè)語(yǔ)句(一下為命令行模式)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
再查看下 iptables -L -n 是否添加上去, 看到添加了
Chain INPUT (policy DROP)
target???? prot opt source?????????????? destination
ACCEPT???? tcp -- 0.0.0.0/0??????????? 0.0.0.0/0?????????? tcp dpt:22
Chain FORWARD (policy DROP)
target???? prot opt source?????????????? destination
Chain OUTPUT (policy DROP)
target???? prot opt source?????????????? destination
ACCEPT???? tcp -- 0.0.0.0/0??????????? 0.0.0.0/0?????????? tcp spt:22
現(xiàn)在Linux服務(wù)器只打開(kāi)了22端口,用putty.exe測(cè)試一下是否可以鏈接上去。
可以鏈接上去了,說(shuō)明沒(méi)有問(wèn)題。
最后別忘記了保存 對(duì)防火墻的設(shè)置
通過(guò)命令:service iptables save 進(jìn)行保存
重啟iptables
service iptables save && service iptables restart
關(guān)閉防火墻
chkconfig iptables off && service iptables stop
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
針對(duì)這2條命令進(jìn)行一些講解吧
-A 參數(shù)就看成是添加一條 INPUT 的規(guī)則
-p 指定是什么協(xié)議 我們常用的tcp 協(xié)議,當(dāng)然也有udp 例如53端口的DNS
到時(shí)我們要配置DNS用到53端口 大家就會(huì)發(fā)現(xiàn)使用udp協(xié)議的
而 --dport 就是目標(biāo)端口 當(dāng)數(shù)據(jù)從外部進(jìn)入服務(wù)器為目標(biāo)端口
反之 數(shù)據(jù)從服務(wù)器出去 則為數(shù)據(jù)源端口 使用 --sport
-j 就是指定是 ACCEPT 接收 或者 DROP 不接收
3、禁止某個(gè)IP訪問(wèn)
1臺(tái)Linux服務(wù)器,2臺(tái)windows xp 操作系統(tǒng)進(jìn)行訪問(wèn)
Linux服務(wù)器ip 192.168.1.99
xp1 ip: 192.168.1.2
xp2 ip: 192.168.1.8
下面看看我2臺(tái)xp 都可以訪問(wèn)的
192.168.1.2 這是 xp1 可以訪問(wèn)的,
192.168.1.8 xp2 也是可以正常訪問(wèn)的。
那么現(xiàn)在我要禁止 192.168.1.2 xp1 訪問(wèn), xp2 正常訪問(wèn),
下面看看演示
通過(guò)命令 iptables -A INPUT -p tcp -s 192.168.1.2 -j DROP
這里意思就是 -A 就是添加新的規(guī)則, 怎樣的規(guī)則呢? 由于我們?cè)L問(wèn)網(wǎng)站使用tcp的,
我們就用 -p tcp , 如果是 udp 就寫(xiě)udp,這里就用tcp了, -s就是 來(lái)源的意思,
ip來(lái)源于 192.168.1.2 ,-j 怎么做 我們拒絕它 這里應(yīng)該是 DROP
好,看看效果。好添加成功。下面進(jìn)行驗(yàn)證 一下是否生效
一直出現(xiàn)等待狀態(tài) 最后 該頁(yè)無(wú)法顯示 ,這是 192.168.1.2 xp1 的訪問(wèn)被拒絕了。
再看看另外一臺(tái) xp 是否可以訪問(wèn), 是可以正常訪問(wèn)的 192.168.1.8 是可以正常訪問(wèn)的
4、如何刪除規(guī)則
首先我們要知道 這條規(guī)則的編號(hào),每條規(guī)則都有一個(gè)編號(hào)
通過(guò) iptables -L -n --line-number 可以顯示規(guī)則和相對(duì)應(yīng)的編號(hào)
num target???? prot opt source?????????????? destination
1??? DROP?????? tcp -- 0.0.0.0/0??????????? 0.0.0.0/0?????????? tcp dpt:3306
2??? DROP?????? tcp -- 0.0.0.0/0??????????? 0.0.0.0/0?????????? tcp dpt:21
3??? DROP?????? tcp -- 0.0.0.0/0??????????? 0.0.0.0/0?????????? tcp dpt:80
多了 num 這一列, 這樣我們就可以 看到剛才的規(guī)則對(duì)應(yīng)的是 編號(hào)2
那么我們就可以進(jìn)行刪除了
iptables -D INPUT 2
刪除INPUT鏈編號(hào)為2的規(guī)則。
再?iptables -L -n 查看一下?已經(jīng)被清除了。
5、過(guò)濾無(wú)效的數(shù)據(jù)包
假設(shè)有人進(jìn)入了服務(wù)器,或者有病毒木馬程序,它可以通過(guò)22,80端口像服務(wù)器外傳送數(shù)據(jù)。
它的這種方式就和我們正常訪問(wèn)22,80端口區(qū)別。它發(fā)向外發(fā)的數(shù)據(jù)不是我們通過(guò)訪問(wèn)網(wǎng)頁(yè)請(qǐng)求
而回應(yīng)的數(shù)據(jù)包。
下面我們要禁止這些沒(méi)有通過(guò)請(qǐng)求回應(yīng)的數(shù)據(jù)包,統(tǒng)統(tǒng)把它們堵住掉。
iptables 提供了一個(gè)參數(shù) 是檢查狀態(tài)的,下面我們來(lái)配置下 22 和 80 端口,防止無(wú)效的數(shù)據(jù)包。
iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
可以看到和我們以前使用的:
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
多了一個(gè)狀態(tài)判斷。
同樣80端口也一樣, 現(xiàn)在刪掉原來(lái)的2條規(guī)則,
iptables -L -n --line-number??? 這個(gè)是查看規(guī)則而且?guī)暇幪?hào)。我們看到編號(hào)就可以
刪除對(duì)應(yīng)的規(guī)則了。
iptables -D OUTPUT 1???? 這里的1表示第一條規(guī)則。
當(dāng)你刪除了前面的規(guī)則, 編號(hào)也會(huì)隨之改變??吹搅税伞?/p>
好,我們刪除了前面2個(gè)規(guī)則,22端口還可以正常使用,說(shuō)明沒(méi)問(wèn)題了
下面進(jìn)行保存,別忘記了,不然的話重啟就會(huì)還原到原來(lái)的樣子。
service iptables save??? 進(jìn)行保存。
Saving firewall rules to /etc/sysconfig/iptables:????????? [ OK ]
其實(shí)就是把剛才設(shè)置的規(guī)則寫(xiě)入到 /etc/sysconfig/iptables 文件中。
6、DNS端口53設(shè)置
下面我們來(lái)看看如何設(shè)置iptables來(lái)打開(kāi)DNS端口,DNS端口對(duì)應(yīng)的是53
大家看到我現(xiàn)在的情況了吧,只開(kāi)放22和80端口, 我現(xiàn)在看看能不能解析域名。
host www.google.com??? 輸入這個(gè)命令后,一直等待,說(shuō)明DNS不通
出現(xiàn)下面提示 :
;; connection timed out; no servers could be reached
ping 一下域名也是不通
[root@localhost ~ping www.google.com
ping: unknown host www.google.com
我這里的原因就是 iptables 限制了53端口。
有些服務(wù)器,特別是Web服務(wù)器減慢,DNS其實(shí)也有關(guān)系的,無(wú)法發(fā)送包到DNS服務(wù)器導(dǎo)致的。
下面演示下如何使用 iptables 來(lái)設(shè)置DNS 53這個(gè)端口,如果你不知道 域名服務(wù)端口號(hào),你
可以用命令 : grep domain /etc/services
[root@localhost ~grep domain /etc/services
domain????????? 53/tcp????????????????????????? # name-domain server
domain????????? 53/udp
domaintime????? 9909/tcp??????????????????????? # domaintime
domaintime????? 9909/udp??????????????????????? # domaintime
看到了吧, 我們一般使用 udp 協(xié)議。
好了, 開(kāi)始設(shè)置。。。
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
這是我們 ping 一個(gè)域名,數(shù)據(jù)就是從本機(jī)出去,所以我們先設(shè)置 OUTPUT,
我們按照ping這個(gè)流程來(lái)設(shè)置。
然后 DNS 服務(wù)器收到我們發(fā)出去的包,就回應(yīng)一個(gè)回來(lái)
iptables -A INPUT -p udp --sport 53 -j ACCEPT
同時(shí)還要設(shè)置
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --sport 53 -j ACCEPT
好了, 下面開(kāi)始測(cè)試下, 可以用 iptables -L -n 查看設(shè)置情況,確定沒(méi)有問(wèn)題就可以測(cè)試了
[root@localhost ~iptables -L -n
Chain INPUT (policy DROP)
target???? prot opt source?????????????? destination
ACCEPT???? tcp -- 0.0.0.0/0??????????? 0.0.0.0/0?????????? tcp dpt:22
ACCEPT???? tcp -- 0.0.0.0/0??????????? 0.0.0.0/0?????????? tcp dpt:80
ACCEPT???? udp -- 0.0.0.0/0??????????? 0.0.0.0/0?????????? udp spt:53
ACCEPT???? udp -- 0.0.0.0/0??????????? 0.0.0.0/0?????????? udp dpt:53
Chain FORWARD (policy DROP)
target???? prot opt source?????????????? destination
Chain OUTPUT (policy DROP)
target???? prot opt source?????????????? destination
ACCEPT???? tcp -- 0.0.0.0/0??????????? 0.0.0.0/0?????????? tcp spt:22 state ESTABLISHED
ACCEPT???? tcp -- 0.0.0.0/0??????????? 0.0.0.0/0?????????? tcp spt:80 state ESTABLISHED
ACCEPT???? udp -- 0.0.0.0/0??????????? 0.0.0.0/0?????????? udp dpt:53
ACCEPT???? udp -- 0.0.0.0/0??????????? 0.0.0.0/0?????????? udp spt:53
可以測(cè)試一下 是否 DNS 可以通過(guò)iptables 了。
[root@localhost ~host www.google.com
www.google.com is an alias for www.l.google.com.
www.l.google.com is an alias for www-china.l.google.com.
www-china.l.google.com has address 64.233.189.104
www-china.l.google.com has address 64.233.189.147
www-china.l.google.com has address 64.233.189.99
正??梢越馕?google 域名。
ping 方面可能還要設(shè)置些東西。
用 nslookup 看看吧
[root@localhost ~nslookup
> www.google.com
Server:???????? 192.168.1.1
Address:??????? 192.168.1.1#53
Non-authoritative answer:
www.google.com canonical name = www.l.google.com.
www.l.google.com??????? canonical name = www-china.l.google.com.
Name:?? www-china.l.google.com
Address: 64.233.189.147
Name:?? www-china.l.google.com
Address: 64.233.189.99
Name:?? www-china.l.google.com
Address: 64.233.189.104
說(shuō)明本機(jī)DNS正常, iptables 允許53這個(gè)端口的訪問(wèn)。
7、iptables對(duì)ftp的設(shè)置
現(xiàn)在我開(kāi)始對(duì)ftp端口的設(shè)置,按照我們以前的視頻,添加需要開(kāi)放的端口
ftp連接端口有2個(gè) 21 和 20 端口,我現(xiàn)在添加對(duì)應(yīng)的規(guī)則。
[root@localhost rootiptables -A INPUT -p tcp --dport 21 -j ACCEPT
[root@localhost rootiptables -A INPUT -p tcp --dport 20 -j ACCEPT
[root@localhost rootiptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
[root@localhost rootiptables -A OUTPUT -p tcp --sport 20 -j ACCEPT
好,這樣就添加完了,我們用瀏覽器訪問(wèn)一下ftp,出現(xiàn)超時(shí)。
所以我剛才說(shuō) ftp 是比較特殊的端口,它還有一些端口是 數(shù)據(jù)傳輸端口,
例如目錄列表, 上傳 ,下載 文件都要用到這些端口。
而這些端口是 任意 端口。。。 這個(gè) 任意 真的比較特殊。
如果不指定什么一個(gè)端口范圍, iptables 很難對(duì)任意端口開(kāi)放的,
如果iptables允許任意端口訪問(wèn), 那和不設(shè)置防火墻沒(méi)什么區(qū)別,所以不現(xiàn)實(shí)的。
那么我們的解決辦法就是 指定這個(gè)數(shù)據(jù)傳輸端口的一個(gè)范圍。
下面我們修改一下ftp配置文件。
我這里使用vsftpd來(lái)修改演示,其他ftp我不知道哪里修改,大家可以找找資料。
[root@localhost rootvi /etc/vsftpd.conf
在配置文件的最下面 加入
pasv_min_port=30001
pasv_max_port=31000
然后保存退出。
這兩句話的意思告訴vsftpd, 要傳輸數(shù)據(jù)的端口范圍就在30001到31000 這個(gè)范圍內(nèi)傳送。
這樣我們使用 iptables 就好辦多了,我們就打開(kāi) 30001到31000 這些端口。
[root@localhost rootiptables -A INPUT -p tcp --dport 30001:31000 -j ACCEPT
[root@localhost rootiptables -A OUTPUT -p tcp --sport 30001:31000 -j ACCEPT
[root@localhost rootservice iptables save
最后進(jìn)行保存, 然后我們?cè)儆脼g覽器范圍下 ftp。可以正常訪問(wèn)
用個(gè)賬號(hào)登陸上去,也沒(méi)有問(wèn)題,上傳一些文件上去看看。
看到了吧,上傳和下載都正常。。 再查看下 iptables 的設(shè)置
[root@localhost rootiptables -L -n
Chain INPUT (policy DROP)
target???? prot opt source?????????????? destination
ACCEPT???? tcp -- 0.0.0.0/0??????????? 0.0.0.0/0????????? tcp dpt:22
ACCEPT???? tcp -- 0.0.0.0/0??????????? 0.0.0.0/0????????? tcp dpt:21
ACCEPT???? tcp -- 0.0.0.0/0??????????? 0.0.0.0/0????????? tcp dpt:20
ACCEPT???? tcp -- 0.0.0.0/0??????????? 0.0.0.0/0????????? tcp dpts:30001:31000
Chain FORWARD (policy DROP)
target???? prot opt source?????????????? destination
Chain OUTPUT (policy DROP)
target???? prot opt source?????????????? destination
ACCEPT???? tcp -- 0.0.0.0/0??????????? 0.0.0.0/0????????? tcp spt:22
ACCEPT???? tcp -- 0.0.0.0/0??????????? 0.0.0.0/0????????? tcp spt:21
ACCEPT???? tcp -- 0.0.0.0/0??????????? 0.0.0.0/0????????? tcp spt:20
ACCEPT???? tcp -- 0.0.0.0/0??????????? 0.0.0.0/0????????? tcp spts:30001:31000
這是我為了演示ftp特殊端口做的簡(jiǎn)單規(guī)則,大家可以添加一些對(duì)數(shù)據(jù)包的驗(yàn)證
例如 -m state --state ESTABLISHED,RELATED 等等要求更加高的驗(yàn)證
例子1:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#如上例,添加一條入站規(guī)則:對(duì)進(jìn)來(lái)的包的狀態(tài)進(jìn)行檢測(cè)。已經(jīng)建立tcp連接的包以及該連接相關(guān)的包允許通過(guò)!
#ESTABLISHED:已建立的鏈接狀態(tài)。RELATED:該數(shù)據(jù)包與本機(jī)發(fā)出的數(shù)據(jù)包有關(guān)。
例子2:
iptables -A INPUT -i lo -j ACCEPT
#-i 參數(shù)是指定接口,這里的接口是lo ,lo就是Loopback(本地環(huán)回接口),意思就允許本地環(huán)回接口在INPUT表的所有數(shù)據(jù)通信。
例子3:
-A INPUT -j REJECT --reject-with icmp-host-prohibited搜索
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
# 這兩條的意思是在INPUT表和FORWARD表中拒絕所有其他不符合上述任何一條規(guī)則的數(shù)據(jù)包。并且發(fā)送一條host prohibited的消息給被拒絕的主機(jī)。(一般不發(fā)送,就不添加這兩條)
以下是iptables相關(guān)命令和參數(shù):
ilter?這個(gè)規(guī)則表是預(yù)設(shè)規(guī)則表,擁有?INPUT、FORWARD?和?OUTPUT?三個(gè)規(guī)則鏈,這個(gè)規(guī)則表顧名思義是用來(lái)進(jìn)行封包過(guò)濾的理動(dòng)作(例如:DROP、?LOG、?ACCEPT?或?REJECT),我們會(huì)將基本規(guī)則都建立在此規(guī)則表中。
主要包含:命令表?????
? ? ? ? ? ? ? 用來(lái)增加(-A、-I)刪除(-D)修改(-R)查看(-L)規(guī)則等;
? ? ? ? ? ? ? 常用參數(shù)???用來(lái)指定協(xié)議(-p)、源地址(-s)、源端口(--sport)、目的地址(-d)、目的端口(--dport)、
? ? ? ? ? ? ? 進(jìn)入網(wǎng)卡(-i)、出去網(wǎng)卡(-o)等設(shè)定包信息(即什么樣的包);? 用來(lái)描述要處理包的信息。
? ? ? ? ? ? ? 常用處理動(dòng)作????用?? -j???來(lái)指定對(duì)包的處理(ACCEPT、DROP、REJECT、REDIRECT等)。
1、常用命令列表:??常用命令(-A追加規(guī)則、-D刪除規(guī)則、-R修改規(guī)則、-I插入規(guī)則、-L查看規(guī)則)
命令?-A,?--append
范例?iptables?-A?INPUT?...
說(shuō)明?新增規(guī)則(追加方式)到某個(gè)規(guī)則鏈(這里是INPUT規(guī)則鏈)中,該規(guī)則將會(huì)成為規(guī)則鏈中的最后一條規(guī)則。
命令?-D,?--delete
范例?iptables?-D?INPUT?--dport?80?-j?DROP
????? iptables?-D?INPUT?1
說(shuō)明?從某個(gè)規(guī)則鏈中刪除一條規(guī)則,可以輸入完整規(guī)則,或直接指定規(guī)則編號(hào)加以刪除。
命令?-R,?--replace
范例?iptables?-R?INPUT?1?-s?192.168.0.1?-j?DROP
說(shuō)明?取代現(xiàn)行規(guī)則,規(guī)則被取代后并不會(huì)改變順序。(1是位置)
命令?-I,?--insert
范例?iptables?-I?INPUT?1?--dport?80?-j?ACCEPT
說(shuō)明?插入一條規(guī)則,原本該位置(這里是位置1)上的規(guī)則將會(huì)往后移動(dòng)一個(gè)順位。
命令?-L,?--list
范例?iptables?-L?INPUT
說(shuō)明?列出某規(guī)則鏈中的所有規(guī)則。
命令?-F,?--flush
范例?iptables?-F?INPUT
說(shuō)明?刪除某規(guī)則鏈(這里是INPUT規(guī)則鏈)中的所有規(guī)則。
命令?-Z,?--zero
范例?iptables?-Z?INPUT
說(shuō)明?將封包計(jì)數(shù)器歸零。封包計(jì)數(shù)器是用來(lái)計(jì)算同一封包出現(xiàn)次數(shù),是過(guò)濾阻斷式攻擊不可或缺的工具。
命令?-N,?--new-chain
范例?iptables?-N?allowed
說(shuō)明?定義新的規(guī)則鏈。
命令?-X,?--delete-chain
范例?iptables?-X?allowed
說(shuō)明?刪除某個(gè)規(guī)則鏈。
命令?-P,?--policy
范例?iptables?-P?INPUT?DROP
說(shuō)明?定義過(guò)濾政策。?也就是未符合過(guò)濾條件之封包,預(yù)設(shè)的處理方式。
命令?-E,?--rename-chain
范例?iptables?-E?allowed?disallowed
說(shuō)明?修改某自訂規(guī)則鏈的名稱(chēng)。
2、常用封包比對(duì)參數(shù):(-p協(xié)議、-s源地址、-d目的地址、--sport源端口、--dport目的端口、-i?進(jìn)入網(wǎng)卡、-o?出去網(wǎng)卡)
參數(shù)???????????-p,?--protocol(指定協(xié)議)
范例?iptables?-A?INPUT?-p?tcp?(指定協(xié)議)????? -p all?? 所有協(xié)議,? -p !tcp 去除tcp外的所有協(xié)議。
說(shuō)明?比對(duì)通訊協(xié)議類(lèi)型是否相符,可以使用?!?運(yùn)算子進(jìn)行反向比對(duì),例如:-p?!?tcp?,
意思是指除?tcp?以外的其它類(lèi)型,包含udp、icmp?...等。如果要比對(duì)所有類(lèi)型,則可以使用?all?關(guān)鍵詞,例如:-p?all。
參數(shù)??????????-s,?--src,?--source??????????????????(指定源地址,指定源端口--sport)
例如:?iptables?-A?INPUT?-s?192.168.1.1
說(shuō)明?用來(lái)比對(duì)封包的來(lái)源?IP,可以比對(duì)單機(jī)或網(wǎng)絡(luò),比對(duì)網(wǎng)絡(luò)時(shí)請(qǐng)用數(shù)字來(lái)表示屏蔽,
例如:-s?192.168.0.0/24,比對(duì)?IP?時(shí)可以使用?!?運(yùn)算子進(jìn)行反向比對(duì),
例如:-s?!?192.168.0.0/24。
參數(shù)??????? ?-d,?--dst,?--destination???????????(指定目的地址,指定目的端口--dport)
例如:?iptables?-A?INPUT?-d?192.168.1.1
說(shuō)明?用來(lái)比對(duì)封包的目的地?IP,設(shè)定方式同上。
參數(shù)?????????-i,?--in-interface(指定入口網(wǎng)卡)????? -i? eth+?? 所有網(wǎng)卡
例如:?iptables?-A?INPUT?-i?eth0
說(shuō)明?用來(lái)比對(duì)封包是從哪片網(wǎng)卡進(jìn)入,可以使用通配字符?+?來(lái)做大范圍比對(duì),
例如:-i?eth+?表示所有的?ethernet?網(wǎng)卡,也以使用?!?運(yùn)算子進(jìn)行反向比對(duì),
例如:-i?!?eth0。
參數(shù)????????-o,?--out-interface(指定出口網(wǎng)卡)
例如:?iptables?-A?FORWARD?-o?eth0
說(shuō)明?用來(lái)比對(duì)封包要從哪片網(wǎng)卡送出,設(shè)定方式同上。
參數(shù)????????--sport,?--source-port?(源端口)
例如:?iptables?-A?INPUT?-p?tcp?--sport?22
說(shuō)明?用來(lái)比對(duì)封包的來(lái)源端口號(hào),可以比對(duì)單一埠,或是一個(gè)范圍,
例如:--sport?22:80,表示從?22?到?80?端口之間都算是符合件,
如果要比對(duì)不連續(xù)的多個(gè)埠,則必須使用?--multiport?參數(shù),詳見(jiàn)后文。比對(duì)埠號(hào)時(shí),可以使用?!?運(yùn)算子進(jìn)行反向比對(duì)。
參數(shù)????????--dport,?--destination-port(目的端口)
例如:?iptables?-A?INPUT?-p?tcp?--dport?22
說(shuō)明?用來(lái)比對(duì)封包的目的端口號(hào),設(shè)定方式同上。
參數(shù)???????--tcp-flags? (只過(guò)濾TCP中的一些包,比如SYN包,ACK包,F(xiàn)IN包,RST包等等)
例如:?iptables?-p?tcp?--tcp-flags?SYN,FIN,ACK?SYN
說(shuō)明? 比對(duì)?TCP?封包的狀態(tài)旗號(hào),參數(shù)分為兩個(gè)部分,第一個(gè)部分列舉出想比對(duì)的旗號(hào),
?????????? 第二部分則列舉前述旗號(hào)中哪些有被設(shè),未被列舉的旗號(hào)必須是空的。TCP?狀態(tài)旗號(hào)包括:SYN(同步)、ACK(應(yīng)答)、
FIN(結(jié)束)、RST(重設(shè))、URG(緊急)PSH(強(qiáng)迫推送)?等均可使用于參數(shù)中,除此之外還可以使用關(guān)鍵詞?ALL?和?
NONE?進(jìn)行比對(duì)。比對(duì)旗號(hào)時(shí),可以使用?!?運(yùn)算子行反向比對(duì)。
參數(shù)?--syn
例如:?iptables?-p?tcp?--syn
說(shuō)明?用來(lái)比對(duì)是否為要求聯(lián)機(jī)之?TCP?封包,與?iptables?-p?tcp?--tcp-flags?SYN,
FIN,ACK?SYN?的作用完全相同,如果使用?!運(yùn)算子,可用來(lái)比對(duì)非要求聯(lián)機(jī)封包。
參數(shù)?-m?multiport?--source-port
例如:?iptables?-A?INPUT?-p?tcp?-m?multiport?--source-port?22,53,80,110
說(shuō)明?用來(lái)比對(duì)不連續(xù)的多個(gè)來(lái)源埠號(hào),一次最多可以比對(duì)?15?個(gè)埠,可以使用?!?
運(yùn)算子進(jìn)行反向比對(duì)。
參數(shù)?-m?multiport?--destination-port
例如:?iptables?-A?INPUT?-p?tcp?-m?multiport?--destination-port?22,53,80,110
說(shuō)明?用來(lái)比對(duì)不連續(xù)的多個(gè)目的地埠號(hào),設(shè)定方式同上。
參數(shù)?-m?multiport?--port
例如:?iptables?-A?INPUT?-p?tcp?-m?multiport?--port?22,53,80,110
說(shuō)明?這個(gè)參數(shù)比較特殊,用來(lái)比對(duì)來(lái)源埠號(hào)和目的埠號(hào)相同的封包,設(shè)定方式同上。
注意:在本范例中,如果來(lái)源端口號(hào)為?80目的地埠號(hào)為?110,這種封包并不算符合條件。
參數(shù)?--icmp-type
例如:?iptables?-A?INPUT?-p?icmp?--icmp-type?8
說(shuō)明?用來(lái)比對(duì)?ICMP?的類(lèi)型編號(hào),可以使用代碼或數(shù)字編號(hào)來(lái)進(jìn)行比對(duì)。
請(qǐng)打?iptables?-p?icmp?--help?來(lái)查看有哪些代碼可用。
參數(shù)?-m?limit?--limit
例如:?iptables?-A?INPUT?-m?limit?--limit?3/hour
說(shuō)明?用來(lái)比對(duì)某段時(shí)間內(nèi)封包的平均流量,上面的例子是用來(lái)比對(duì):每小時(shí)平均流量是
否超過(guò)一次?3?個(gè)封包。?除了每小時(shí)平均次外,也可以每秒鐘、每分鐘或每天平均一次,
默認(rèn)值為每小時(shí)平均一次,參數(shù)如后:?/second、?/minute、/day。?除了進(jìn)行封數(shù)量的
比對(duì)外,設(shè)定這個(gè)參數(shù)也會(huì)在條件達(dá)成時(shí),暫停封包的比對(duì)動(dòng)作,以避免因駭客使用洪水
攻擊法,導(dǎo)致服務(wù)被阻斷。
參數(shù)?--limit-burst
范例?iptables?-A?INPUT?-m?limit?--limit-burst?5
說(shuō)明?用來(lái)比對(duì)瞬間大量封包的數(shù)量,上面的例子是用來(lái)比對(duì)一次同時(shí)涌入的封包是否超
過(guò)?5?個(gè)(這是默認(rèn)值),超過(guò)此上限的封將被直接丟棄。使用效果同上。
參數(shù)?-m?mac?--mac-source
范例?iptables?-A?INPUT?-m?mac?--mac-source?00:00:00:00:00:01
說(shuō)明?用來(lái)比對(duì)封包來(lái)源網(wǎng)絡(luò)接口的硬件地址,這個(gè)參數(shù)不能用在?OUTPUT?和?Postrouting規(guī)則煉上,這是因?yàn)榉獍统龅骄W(wǎng)后,才能由網(wǎng)卡驅(qū)動(dòng)程序透過(guò)?ARP?通訊協(xié)議查出目的地的?MAC?地址,所以?iptables?在進(jìn)行封包比對(duì)時(shí),并不知道封包會(huì)送到個(gè)網(wǎng)絡(luò)接口去。
參數(shù)?--mark
范例?iptables?-t?mangle?-A?INPUT?-m?mark?--mark?1
說(shuō)明?用來(lái)比對(duì)封包是否被表示某個(gè)號(hào)碼,當(dāng)封包被比對(duì)成功時(shí),我們可以透過(guò)?MARK?處理動(dòng)作,將該封包標(biāo)示一個(gè)號(hào)碼,號(hào)碼最不可以超過(guò)?4294967296。
參數(shù)?-m?owner?--uid-owner
范例?iptables?-A?OUTPUT?-m?owner?--uid-owner?500
說(shuō)明?用來(lái)比對(duì)來(lái)自本機(jī)的封包,是否為某特定使用者所產(chǎn)生的,這樣可以避免服務(wù)器使用?
root?或其它身分將敏感數(shù)據(jù)傳送出,可以降低系統(tǒng)被駭?shù)膿p失??上н@個(gè)功能無(wú)法比對(duì)出
來(lái)自其它主機(jī)的封包。
參數(shù)?-m?owner?--gid-owner
范例?iptables?-A?OUTPUT?-m?owner?--gid-owner?0
說(shuō)明?用來(lái)比對(duì)來(lái)自本機(jī)的封包,是否為某特定使用者群組所產(chǎn)生的,使用時(shí)機(jī)同上。
參數(shù)?-m?owner?--pid-owner
范例?iptables?-A?OUTPUT?-m?owner?--pid-owner?78
說(shuō)明?用來(lái)比對(duì)來(lái)自本機(jī)的封包,是否為某特定行程所產(chǎn)生的,使用時(shí)機(jī)同上。
參數(shù)?-m?owner?--sid-owner
范例?iptables?-A?OUTPUT?-m?owner?--sid-owner?100
說(shuō)明?用來(lái)比對(duì)來(lái)自本機(jī)的封包,是否為某特定聯(lián)機(jī)(Session?ID)的響應(yīng)封包,使用時(shí)
機(jī)同上。
參數(shù)?-m?state?--state
范例?iptables?-A?INPUT?-m?state?--state?RELATED,ESTABLISHED
說(shuō)明?用來(lái)比對(duì)聯(lián)機(jī)狀態(tài),聯(lián)機(jī)狀態(tài)共有四種:INVALID、ESTABLISHED、NEW?和?RELATED。
INVALID?表示該封包的聯(lián)機(jī)編號(hào)(Session?ID)無(wú)法辨識(shí)或編號(hào)不正確。
ESTABLISHED?表示該封包屬于某個(gè)已經(jīng)建立的聯(lián)機(jī)。
NEW?表示該封包想要起始一個(gè)聯(lián)機(jī)(重設(shè)聯(lián)機(jī)或?qū)⒙?lián)機(jī)重導(dǎo)向)。
RELATED?表示該封包是屬于某個(gè)已經(jīng)建立的聯(lián)機(jī),所建立的新聯(lián)機(jī)。例如:FTP-DATA?聯(lián)機(jī)必定是源自某個(gè)?FTP?聯(lián)機(jī)。
3、常用的處理動(dòng)作:?(-j??指定對(duì)滿足條件包的處理,常用動(dòng)作有ACCEPT接受報(bào)、DROP丟棄報(bào)、REJECT丟棄報(bào)并通知對(duì)方、REDIRECT重定向包等)
-j?? 參數(shù)用來(lái)指定要進(jìn)行的處理動(dòng)作,常用的處理動(dòng)作包括:ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK,分別說(shuō)明如下:
ACCEPT????將封包放行,進(jìn)行完此處理動(dòng)作后,將不再比對(duì)其它規(guī)則,直接跳往下一個(gè)規(guī)則鏈(natostrouting)。
REJECT????攔阻該封包,并傳送封包通知對(duì)方,可以傳送的封包有幾個(gè)選擇:ICMP?port-unreachable、ICMP?echo-reply?或是?tcp-reset(這個(gè)封包會(huì)要求對(duì)方關(guān)閉聯(lián)機(jī)),進(jìn)行完此處理動(dòng)作后,將不再比對(duì)其它規(guī)則,直接中斷過(guò)濾程序。
例如:iptables?-A?FORWARD?-p?TCP?--dport?22?-j?REJECT--reject-with?tcp-reset
DROP?丟棄封包不予處理,進(jìn)行完此處理動(dòng)作后,將不再比對(duì)其它規(guī)則,直接中斷過(guò)濾程序。
REDIRECT將封包重新導(dǎo)向到另一個(gè)端口(PNAT),進(jìn)行完此處理動(dòng)作后,將會(huì)繼續(xù)比對(duì)其它規(guī)則。
?????????????????????? 這個(gè)功能可以用來(lái)實(shí)作通透式porxy?或用來(lái)保護(hù)?web?服務(wù)器。
例如:iptables?-tnat-A?PREROUTING?-p?tcp?--dport?80?-j?REDIRECT--to-ports?8080
MASQUERADE改寫(xiě)封包來(lái)源?IP?為防火墻?NIC?IP,可以指定?port?對(duì)應(yīng)的范圍,進(jìn)行完此處理動(dòng)作后,直接跳往下一個(gè)規(guī)則(mangleostrouting)。這個(gè)功能與?SNAT?略有不同,當(dāng)進(jìn)行?IP?偽裝時(shí),不需指定要偽裝成哪個(gè)?IP,IP?會(huì)從網(wǎng)卡直接讀,當(dāng)使用撥接連線時(shí),IP?通常是由?ISP?公司的?DHCP?服務(wù)器指派的,這個(gè)時(shí)候?MASQUERADE?特別有用。
例如:iptables?-tnat-A?POSTROUTING?-p?TCP?-j?MASQUERADE?--to-ports?1024-31000
LOG??將封包相關(guān)訊息紀(jì)錄在?/var/log?中,詳細(xì)位置請(qǐng)查閱?/etc/syslog.conf?組態(tài)檔,進(jìn)行完此處理動(dòng)作后,將會(huì)繼續(xù)比對(duì)其規(guī)則。
????????????????例如:iptables?-A?INPUT?-p?tcp?-j?LOG?--log-prefix?"INPUT?packets"
SNAT改寫(xiě)封包來(lái)源?IP?為某特定?IP?或?IP?范圍,可以指定?port?對(duì)應(yīng)的范圍,進(jìn)行完此處理動(dòng)作后,將直接跳往下一個(gè)規(guī)則(mangleostrouting)。
例如:iptables?-tnat-A?POSTROUTING?-p?tcp-o?eth0?-j?SNAT?--to-source?194.236.50.155-194.236.50.160:1024-32000
DNAT改寫(xiě)封包目的地?IP?為某特定?IP?或?IP?范圍,可以指定?port?對(duì)應(yīng)的范圍,進(jìn)行完此處理動(dòng)作后,將會(huì)直接跳往下一個(gè)規(guī)煉(filter:input?或?filter:forward)。
例如:iptables?-tnat?-A?PREROUTING?-p?tcp?-d?15.45.23.67?--dport?80?-j?DNAT--to-destination?192.168.1.1-192.168.1.10:80-100
MIRROR?鏡射封包,也就是將來(lái)源?IP?與目的地?IP?對(duì)調(diào)后,將封包送回,進(jìn)行完此處理動(dòng)作后,將會(huì)中斷過(guò)濾程序。
QUEUE中斷過(guò)濾程序,將封包放入隊(duì)列,交給其它程序處理。透過(guò)自行開(kāi)發(fā)的處理程序,可以進(jìn)行其它應(yīng)用,
????????????????????? 例如:計(jì)算聯(lián)機(jī)費(fèi)......等。
RETURN?結(jié)束在目前規(guī)則煉中的過(guò)濾程序,返回主規(guī)則煉繼續(xù)過(guò)濾,如果把自訂規(guī)則煉看成是一個(gè)子程序,那么這個(gè)動(dòng)作,就相當(dāng)提早結(jié)束子程序并返回到主程序中。
MARK將封包標(biāo)上某個(gè)代號(hào),以便提供作為后續(xù)過(guò)濾的條件判斷依據(jù),進(jìn)行完此處理動(dòng)作后,將會(huì)繼續(xù)比對(duì)其它規(guī)則。
?????????????? 例如:iptables?-t?mangle?-A?PREROUTING?-p?tcp?--dport?22?-j?MARK?--set-mark?2
四.拓展模塊?
1.按來(lái)源MAC地址匹配
# iptables -t filter -A FORWARD?-m --mac-source 00:02:b2:03:a5:f6?-j DROP
拒絕轉(zhuǎn)發(fā)來(lái)自該MAC地址的數(shù)據(jù)包
2.按多端口或連續(xù)端口匹配
?20:表示20以后的所有端口
?20:100表示20到100的端口
:20?表示20之前的所有端口
-m multiport [--prots, --sports,--dports]
例子:
# iptables -A INPUT -p tcp -m multiport --dports 21,20,25,53,80 -j ACCEPT 【多端口匹配】
#?iptables -A INPUT -p tcp --dport 20: -j ACCEPT
# iptables -A INPUT -p tcp --sport 20:80 -j ACCEPT
# iptables -A INPUT -p tcp --sport :80 -j ACCEPT
3.還可以按數(shù)據(jù)包速率和狀態(tài)匹配
-m limit --limit匹配速率 如: -m limit --limit 50/s -j ACCEPT
-m state --state 狀態(tài) 如: -m state --state INVALID,RELATED -j ACCEPT
4.還可以限制鏈接數(shù)
-m connlimit?--connlimit-above n 限制為多少個(gè) ? ? ? ? ? ? ?
例如:
? ? ? ? iptables -I FORWARD -p tcp -m connlimit --connlimit-above 9 -j DROP ? ? ? ?//表示限制鏈接數(shù)最大為9個(gè)
5、模擬隨機(jī)丟包率
? ? ? ?iptables -A FORWARD -p icmp -m statistic --mode random --probability 0.31 ?-j REJECT ? //表示31%的丟包率
? ? ? ?或者
? ? ? ?-m random --average 5 -j DROP 表示模擬丟掉5%比例的包
相關(guān)知識(shí):
Linux 中延時(shí)模擬
設(shè)置延時(shí) 3s :
tc qdisc add dev eth0 root netem delay 3000ms
可以在 3000ms 后面在加上一個(gè)延時(shí),比如 ’3000ms 200ms‘表示 3000ms ± 200ms ,延時(shí)范圍 2800 – 3200 之間.
結(jié)果顯示如下
Linux 中丟包模擬
設(shè)置丟包 50% ,iptables 也可以模擬這個(gè),但一下不記的命令了,下次放上來(lái):
tc qdisc change dev eth0 root netem loss 50%
上面的設(shè)丟包,如果給后面的 50% 的丟包比率修改成 ’50% 80%’ 時(shí),這時(shí)和上面的延時(shí)不一樣,這是指丟包比率為 50-80% 之間。