iptables詳解之filter

iptables詳解之filter

iptables令不少小夥伴腦闊疼,下面咱們來講說如何使用iptables。算法

1、iptables格式

1.一、iptables 幫助

經過iptables --help查看一下iptables用法shell

[root@note1 ~]# iptables --help
iptables v1.4.21

Usage: iptables -[ACD] chain rule-specification [options]
       iptables -I chain [rulenum] rule-specification [options]
       iptables -R chain rulenum rule-specification [options]
       iptables -D chain rulenum [options]
       iptables -[LS] [chain [rulenum]] [options]
       iptables -[FZ] [chain] [options]
       iptables -[NX] chain
       iptables -E old-chain-name new-chain-name
       iptables -P chain target [options]
       iptables -h (print this help information)

1.二、iptables 格式

iptables [-t table] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]bash

iptables命令由 表 + 命令 + 鏈 + 匹配條件 + 處理動做 組成服務器

2、iptables表

iptables由四表五鏈組成。每一個表分別實現不一樣的功能,每一個表擁有不一樣的鏈,鏈表明規則實現的位置。網絡

四表分別爲:app

  • filter :過濾,防火牆;
  • nat :用於源地址轉換或目標地址轉換;
  • mangle :拆解報文,作出修改,並從新封裝起來;
  • raw :關閉nat表上啓用的鏈接追蹤機制;

五鏈分別爲:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。ssh

不一樣表支持的鏈:curl

  • filter :INPUT,FORWARD,OUTPUT
  • nat :PREROUTING,INPUT,OUTPUT,POSTROUTING
  • mangle :PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
  • raw :OUTPUT,PREROUTING

添加規則時的考量點:tcp

  • 要實現哪一種功能:判斷添加到哪一個表上;
  • 報文流經的路徑:判斷添加到哪一個鏈上;

鏈:鏈上的規則次序,即爲檢查的次序;所以,隱含必定的應用法則:ide

  • 同類規則(訪問同一應用),匹配範圍小的放上面;
  • 不一樣類的規則(訪問不一樣應用),匹配到報文頻率較大的放在上面;
  • 將那些可由一條規則描述的多個規則合併起來;
  • 設置默認策略;

使用iptables命令時若不使用-t指明操做哪張表,默認操做filter表。

3、iptables命令

iptables命令有三大類,查看,鏈管理,規則管理

3.一、查看iptables規則

-t : 查看的表
-n :不進行 IP 與 HOSTNAME 的反解
-v :列出更多的信息,包括經過該規則的封包總位數、相關的網絡接口等.
-L :列出目前的 table 的規則.
-S :查看規則定義,
--line-number用於查看規則號.

#使用iptables查看規則
[root@note1 ~]# iptables -vnL --line-number
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1      467 29128 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
2        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 41 packets, 4276 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
[root@note1 ~]#

[root@note1 ~]# iptables -vnL INPUT --line-number
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1      502 31476 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
2        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
[root@note1 ~]# 

#使用-S選項查看iptables的規則定義
[root@note1 ~]# iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

3.二、鏈管理

3.2.一、-N 新建鏈

-N:new, 自定義一條新的規則鏈;

iptables -N test

3.2.二、-X 刪除鏈

-X:delete,刪除自定義的規則鏈;
​ 注意:僅能刪除用戶自定義的引用計數爲0的空的鏈;

iptables -X test

3.2.三、-E 重命名

-E:重命名自定義鏈;引用計數不爲0的自定義鏈不可以被重命名,也不能被刪除;

iptables -N testrn
iptables -E testrn testrename

3.2.四、-P 默認策略

-P:Policy,設置默認策略;對filter表中的鏈而言,其默認策略有:

  • ACCEPT:接受
  • DROP:丟棄
  • REJECT:拒絕

使用需謹慎,因爲我測試時,沒有先增長一條放行ssh的規則,因此在我將filter的INPUT鏈默認策略改成DROP後,我已經沒法經過Xshell連接虛擬機了,須要進入VMware放行ssh。

iptables -P INPUT DROP

增長了放行規則後,咱們已經成功使用Xshell從新連上了主機

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

使用命令添加默認策略

#先放行ssh,INPUT鏈及OUTPUT鏈都要放行。
iptables -A INPUT -d 176.16.128.1 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -s 176.16.128.1 -p tcp --sport 22 -j ACCEPT
#添加新規則的時候要插入在默認拒絕規則前,除這些規則外的都將拒絕。
iptables -A INPUT -d 176.16.128.1 -j REJECT
iptables -A OUTPUT -s 176.16.128.1 -j REJECT
#設置鏈上的默認策略爲容許。
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT

3.三、規則管理

3.3.一、-A 追加規則

-A:append,在已有規則後追加規則;

# 在note1節點增長一條拒絕80端口的規則
[root@note1 local]# iptables -A INPUT -p tcp --dport 80 -j REJECT

# 咱們能夠看到因爲是使用追加命令追加的規則,這條規則的位置爲2
[root@note1 local]# iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1     4208  225K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
2        2   120 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 reject-with icmp-port-unreachable

# 在主機點訪問note1節點的80端口
[root@master ~]# curl note1:80
curl: (7) Failed connect to note1:80; 拒絕鏈接
[root@master ~]#

3.3.二、-R 替換規則

-R:replace,替換指定鏈上的指定規則;

# 使用-R命令修改拒絕80端口的規則爲接受訪問
[root@note1 local]# iptables -R INPUT 2 -p tcp --dport 80 -j ACCEPT

# 查看iptables
[root@note1 local]# iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1     4881  271K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
2        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80

# 在master節點訪問80端口,能夠看到網頁的內容了。
[root@master ~]# curl note1:80
<h1>I'm Note1</h1>
[root@master ~]#

3.3.三、-I 插入規則

-I:insert, 插入,要指明位置,省略時表示第一條;

# 使用iptables -I不指定位置插入規則。
[root@note1 ~]# iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
# 查看iptables,顯示新增長的規則爲第一條。
[root@note1 ~]# iptables -vnL INPUT --line-number
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:3306
2      616 38140 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
3        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
[root@note1 ~]#

#使用iptables -I指定在第二條插入規則。
[root@note1 ~]# iptables -I INPUT 2 -p tcp --dport 443 -j ACCEPT
[root@note1 ~]# iptables -vnL INPUT --line-number
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:3306
2        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443
3      810 50540 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
4        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
[root@note1 ~]#

3.3.四、-D 刪除規則

-D:delete,刪除規則按照規則序號或規則自己

3.3.4.一、指明規則序號
[root@note1 ~]# iptables -vnL INPUT --line-number
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:3306
2        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443
3      835 52340 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
4        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
[root@note1 ~]# iptables -D INPUT 2
[root@note1 ~]# iptables -vnL INPUT --line-number
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:3306
2      882 55100 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
3        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
[root@note1 ~]#
3.3.4.二、 指明規則自己
[root@note1 ~]# iptables -vnL INPUT --line-number
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:3306
2      882 55100 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
3        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
[root@note1 ~]# iptables -D INPUT -p tcp --dport 3306 -j ACCEPT
[root@note1 ~]# iptables -vnL INPUT --line-number
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1     1016 62940 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
2        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
[root@note1 ~]#

3.3.五、-Z 置零

iptables的每條規則都有兩個計數器:

  • (1) 匹配到的報文的個數;pkts
  • (2) 匹配到的全部報文的大小之和;bytes
[root@note1 ~]# iptables -vnL INPUT --line-number
Chain INPUT (policy ACCEPT 11 packets, 774 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1     1028 63752 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
2        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
[root@note1 ~]# iptables -Z INPUT
[root@note1 ~]# iptables -vnL INPUT --line-number
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        6   364 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
2        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
[root@note1 ~]#

3.3.六、-F 清空規則鏈

[root@note1 ~]# iptables -vnL INPUT --line-number
Chain INPUT (policy ACCEPT 5 packets, 180 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1       46  2728 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
2        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
[root@note1 ~]# iptables -F INPUT
[root@note1 ~]# iptables -vnL INPUT --line-number
Chain INPUT (policy ACCEPT 6 packets, 364 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
[root@note1 ~]#

4、iptables匹配條件

4.一、基本匹配條件

無需加載任何模塊,由iptables/netfilter自行提供;

[!] -s, --source  
address[/mask][,...]:檢查報文中的源IP地址是否符合此處指定的地址或範圍;

[!] -d, --destination 
address[/mask][,...]:檢查報文中的目標IP地址是否符合此處指定的地址或範圍;全部地址:0.0.0.0/0

[!] -p, --protocol 
protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or  "all"
最經常使用的協議tcp、udp、icmp;

[!] -i, --in-interface 
數據報文流入的接口;只能應用於數據報文流入的環節,只能應用於PREROUTING,INPUT和FORWARD鏈;

[!] -o, --out-interface 
數據報文流出的接口;只能應用於數據報文流出的環節,只能應用於FORWARD、OUTPUT和POSTROUTING鏈;

[!]中的歎號表示取反的意思

4.二、擴展匹配條件

4.2.一、隱式擴展

隱式擴展:不須要手動加載擴展模塊;由於它們是對協議的擴展,因此在使用-p選項指明瞭特定的協議時,就表示已經指明瞭要擴展的模塊,無需再同時使用-m選項指明擴展模塊的擴展機制。

4.2.1.一、tcp
[!] --source-port, --sport port[:port]:
匹配報文的源端口;能夠是端口範圍;

[!] --destination-port, --dport port[:port]:
匹配報文的目標端口;能夠是端口範圍;

[!] --tcp-flags mask comp
mask是咱們應該檢查的標誌,以逗號分隔,例如 SYN,ACK,FIN,RST
comp是必須設置的標誌,例如SYN
例如:「--tcp-flags  SYN,ACK,FIN,RST  SYN」表示,要檢查的標誌位爲SYN,ACK,FIN,RST四個,其中SYN必須爲1,餘下的必須爲0;

[!] --syn:用於匹配第一次握手,至關於」--tcp-flags  SYN,ACK,FIN,RST  SYN「;

[!]歎號表示取反的意思

4.2.1.二、udp
[!] --source-port, --sport port[:port]:
匹配報文的源端口;能夠是端口範圍;

[!] --destination-port, --dport port[:port]:
匹配報文的目標端口;能夠是端口範圍;

[!]歎號表示取反的意思

4.2.1.三、icmp
[!] --icmp-type {type[/code]|typename}

[!]歎號表示取反的意思

icmp type

類型爲8:請求回送echo-request(Ping 請求)

類型爲0:回送應答echo-reply(Ping 應答)

咱們設置INPUT放行icmp-type類型爲0的報文,OUTPUT放行icmp-type類型爲8的報文,默認規則設置爲拒絕,這樣就能夠只容許咱們ping其餘主機,不容許其餘主機ping咱們。

#由於要增長默認拒絕規則,因此先放行ssh
[root@note1 ~]# iptables -A INPUT -d 176.16.128.1 -p tcp --dport 22 -j ACCEPT
[root@note1 ~]# iptables -A OUTPUT -s 176.16.128.1 -p tcp --sport 22 -j ACCEPT
#增長默認拒絕規則
[root@note1 ~]# iptables -A INPUT -d 176.16.128.1 -j REJECT
[root@note1 ~]# iptables -A OUTPUT -s 176.16.128.1 -j REJECT
[root@note1 ~]# iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  299 19206 ACCEPT     tcp  --  *      *       0.0.0.0/0            176.16.128.1         tcp dpt:22
    0     0 REJECT     all  --  *      *       0.0.0.0/0            176.16.128.1         reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  165 15559 ACCEPT     tcp  --  *      *       176.16.128.1         0.0.0.0/0            tcp spt:22
    0     0 REJECT     all  --  *      *       176.16.128.1         0.0.0.0/0            reject-with icmp-port-unreachable
#如今咱們嘗試ping,因爲ping未在iptables中設置因此ping請求沒法發送。
[root@note1 ~]# ping 176.16.128.8
PING 176.16.128.8 (176.16.128.8) 56(84) bytes of data.
ping: sendmsg: 不容許的操做
ping: sendmsg: 不容許的操做
ping: sendmsg: 不容許的操做
^C
--- 176.16.128.8 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 1999ms

#如今咱們在OUTPUT鏈上增長一條容許發送ping請求的規則
[root@note1 ~]# iptables -I OUTPUT 2 -s 176.16.128.1 -p icmp --icmp-type 8 -j ACCEPT

#嘗試ping,發現請求能夠發送了,可是未有響應回來
[root@note1 ~]# ping 176.16.128.8
PING 176.16.128.8 (176.16.128.8) 56(84) bytes of data.

#咱們使用tcpdump抓包,發現ping請求是有響應回來的。是INPUT鏈沒有放行。
[root@note1 ~]# tcpdump -i eno16777736 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eno16777736, link-type EN10MB (Ethernet), capture size 262144 bytes
20:45:00.605683 IP note1 > master: ICMP echo request, id 4276, seq 64, length 64
20:45:00.605962 IP master > note1: ICMP echo reply, id 4276, seq 64, length 64
20:45:01.606935 IP note1 > master: ICMP echo request, id 4276, seq 65, length 64
20:45:01.607533 IP master > note1: ICMP echo reply, id 4276, seq 65, length 64
^C
8 packets captured
8 packets received by filter
0 packets dropped by kernel
[root@note1 ~]#

#咱們在iptables的INPUT鏈放行ping請求的響應。
[root@note1 ~]# iptables -I INPUT 2 -d 176.16.128.1 -p icmp --icmp-type 0 -j ACCEPT

#至此咱們已經ping通了其餘主機。
[root@note1 ~]# ping 176.16.128.8
PING 176.16.128.8 (176.16.128.8) 56(84) bytes of data.
64 bytes from 176.16.128.8: icmp_seq=228 ttl=64 time=0.687 ms
64 bytes from 176.16.128.8: icmp_seq=229 ttl=64 time=0.432 ms
^C
--- 176.16.128.8 ping statistics ---
231 packets transmitted, 4 received, 98% packet loss, time 230101ms
rtt min/avg/max/mdev = 0.432/0.804/1.443/0.382 ms
[root@note1 ~]#

若要容許其餘主機也能ping咱們。在INPUT鏈中追加一條放行icmp-type類型爲8的報文,OUTPUT放行icmp-type類型爲0的報文,這樣就均可以ping通了。

4.2.二、顯式擴展

顯式擴展:必須使用-m選項指明要調用的擴展模塊的擴展機制;

使用man iptables-extensions來查看顯示擴展的用法。

4.2.2.一、multiport

以離散或連續的方式定義多端口匹配條件,最多15個;

[!]--source-ports, --sports port[,port|,port:port]...:指定多個源端口;
[!]--destination-ports, --dports port[,port|,port:port]...:指定多個目標端口;

[!]歎號表示取反的意思

咱們說過iptables要儘可能將那些可由一條規則描述的多個規則合併起來,不但能夠更簡潔,這樣也能夠提升報文經過的效率。

#使用iptables放行21,22,23,80,139,443,445,3306等端口。
iptables -A INPUT -p tcp -m multiport --dports 21:23,80,139,443,445,3306 -j ACCEPT

4.2.2.二、iprange

以連續地址塊的方式來指明多IP地址匹配條件;

[!] --src-range from[-to] #源地址區間
[!] --dst-range from[-to] #目標地址區間

[!]歎號表示取反的意思

設置放行176.16.128.5-176.16.128.10區間的IP能夠訪問主機

[root@note1 init.d]#iptables -I INPUT 2 -p icmp --icmp-type 8 -m iprange --src-range 176.16.128.5-176.16.128.10 -j ACCEPT
[root@note1 init.d]#iptables -I OUTPUT 2 -p icmp --icmp-type 0 -s 176.16.128.1 -j ACCEPT

#使用176.16.128.2 Ping主機,是沒有迴應的。
[root@note2 ~]# ping 176.16.128.1
PING 176.16.128.1 (176.16.128.1) 56(84) bytes of data.
^C
--- 176.16.128.1 ping statistics ---
11 packets transmitted, 0 received, 100% packet loss, time 10076ms

[root@note2 ~]#

#使用176.16.128.8 Ping主機,在ip區間內是能夠收到回覆的。
[root@master ~]# ping 176.16.128.1
PING 176.16.128.1 (176.16.128.1) 56(84) bytes of data.
64 bytes from 176.16.128.1: icmp_seq=1 ttl=64 time=0.539 ms
64 bytes from 176.16.128.1: icmp_seq=2 ttl=64 time=0.922 ms
^C
--- 176.16.128.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1020ms
rtt min/avg/max/mdev = 0.539/0.730/0.922/0.193 ms
[root@master ~]#

4.2.2.三、time

指定數據包到達時間/日期範圍的匹配條件。

--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
[!] --weekdays day[,day...]
[!] --monthdays day[,day...]

--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

--kerneltz:使用內核配置的時區而非默認的UTC;

[!]歎號表示取反的意思

通常時間或與周幾聯用,或時間與每個月幾號聯用。日期通常不經常使用。

#INPUT鏈放行工做區域176.16.128.5-176.16.128.10的主機在週一至週五的早9點到晚5點能夠訪問telnet服務。
iptables -I INPUT 2 -d 176.16.128.1 -p tcp --dport 23 -m iprange --src-range 176.16.128.5-176.16.128.10 -m time --timestart 9:00:00 --timestop 17:00:00 --weekdays 1,2,3,4,5 --kerneltz -j ACCEPT

#OUTPUT鏈放行telnet服務。
iptables -I OUTPUT 2 -s 176.16.128.1 -p tcp --sport 23 -j ACCEPT

4.2.2.四、string

該模塊使用某種模式匹配策略來匹配給定的字符串。

--algo {bm|kmp}           #匹配算法
[!] --string pattern      #要過濾的字符串
[!] --hex-string pattern  #要檢查的字符串的十六進制編碼
--from offset             #從報文的哪一個位置開始檢查
--to offset               #從報文的哪一個位置結束檢查

[!]歎號表示取反的意思。

只對明文編碼的協議生效。

# 出棧報文中包含字符串gay拒絕訪問。
iptables -I OUTPUT -m string --algo bm --string "gay" -j REJECT

4.2.2.五、connlimit

容許您限制每一個客戶端地址與服務器的並行鏈接數。

--connlimit-upto n   #上限 小於等於
--connlimit-above n  #下限 大於等於

取決於默認規則是什麼,默認規則是拒絕,使用upto,設置低於就容許,不低於就被默認規則所匹配。

# 設置每一個客戶端ssh的鏈接不大於2個。
iptables -I INPUT -p tcp -d 176.16.128.1 --dport 22 -m connlimit --connlimit-upto 2 -j ACCEPT

4.2.2.六、limit

此模塊使用令牌桶限制請求的速率。

--limit rate[/second|/minute|/hour|/day]  #每秒、每分、每小時、天天多少個。
--limit-burst number #一批最多個數、峯值(桶大小)

限制本機某tcp服務接收新請求的速率:--syn, -m limit

# 限制主機Ping請求每分鐘20次,峯值發三次。
[root@note1 sysconfig]# iptables -I INPUT 2 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 3 -j ACCEPT
[root@note1 sysconfig]# iptables -I OUTPUT 2 -p icmp --icmp-type 0 -j ACCEPT
[root@note1 sysconfig]# iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  893 57538 ACCEPT     tcp  --  *      *       0.0.0.0/0            176.16.128.1         tcp dpt:22 #conn src/32 <= 2
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 8 limit: avg 20/min burst 3
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            176.16.128.1         multiport dports 80,443,3306
    2   104 REJECT     all  --  *      *       0.0.0.0/0            176.16.128.1         reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  547 39791 ACCEPT     tcp  --  *      *       176.16.128.1         0.0.0.0/0            multiport sports 22,80,443,3306
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 0
   10   848 REJECT     all  --  *      *       176.16.128.1         0.0.0.0/0            reject-with icmp-port-unreachable
[root@note1 sysconfig]#

#Ping主機,觀察應答的時間,得出已經成功限制Ping請求速率。
[root@master ~]# ping 176.16.128.1
PING 176.16.128.1 (176.16.128.1) 56(84) bytes of data.
64 bytes from 176.16.128.1: icmp_seq=1 ttl=64 time=0.692 ms
64 bytes from 176.16.128.1: icmp_seq=2 ttl=64 time=0.684 ms
64 bytes from 176.16.128.1: icmp_seq=3 ttl=64 time=0.722 ms
64 bytes from 176.16.128.1: icmp_seq=4 ttl=64 time=0.706 ms
64 bytes from 176.16.128.1: icmp_seq=7 ttl=64 time=1.10 ms
64 bytes from 176.16.128.1: icmp_seq=10 ttl=64 time=1.89 ms
64 bytes from 176.16.128.1: icmp_seq=13 ttl=64 time=0.983 ms
^C
--- 176.16.128.1 ping statistics ---
14 packets transmitted, 7 received, 50% packet loss, time 13093ms
rtt min/avg/max/mdev = 0.684/0.969/1.893/0.409 ms
[root@master ~]#

4.2.2.七、state

state模塊容許訪問此數據包的鏈接跟蹤狀態。

#僅放行哪些鏈接的狀態。
[!] --state state 
INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED.

NEW: 新鏈接請求;
ESTABLISHED:已創建的鏈接;
INVALID:沒法識別的鏈接;
RELATED:相關聯的鏈接,當前鏈接是一個新請求,但附屬於某個已存在的鏈接;
UNTRACKED:未追蹤的鏈接;

state擴展:
內核模塊裝載:
nf_conntrack
nf_conntrack_ipv4

手動裝載:
nf_conntrack_ftp

追蹤到的鏈接:
/proc/net/nf_conntrack

調整可記錄的鏈接數量最大值:
/proc/sys/net/nf_conntrack_max

超時時長:
/proc/sys/net/netfilter/timeout

5、處理動做

-j targetname [per-target-options]

5.一、基本處理動做

ACCEPT 容許
DROP 丟棄

5.二、擴展處理動做

5.2.一、REJECT 拒絕

--reject-with type

5.2.二、LOG 日誌

--log-level
--log-prefix

默認日誌保存於/var/log/messages

5.2.三、RETURN 返回

返回調用者;

5.三、自定義鏈做爲target

自定義鏈作爲target:

6、保存、重載

保存:iptables-save &gt; /PATH/TO/SOME_RULE_FILE

重載:iptabls-restore &lt; /PATH/FROM/SOME_RULE_FILE
-n, --noflush:不清除原有規則
-t, --test:僅分析生成規則集,但不提交

CentOS6

保存規則:
service iptables save
保存規則於/etc/sysconfig/iptables文件,覆蓋保存;

重載規則:
service iptables restart
默認重載/etc/sysconfig/iptables文件中的規則

配置文件:/etc/sysconfig/iptables-config

CentOS7

(1) 自定義Unit File,進行iptables-restore
(2) firewalld服務;
(3) 自定義腳本;

7、規則優化

  1. 使用自定義鏈管理特定應用的相關規則,模塊化管理規則;
  2. 優先放行雙方向狀態爲ESTABLISHED的報文;
  3. 服務於不一樣類別的功能的規則,匹配到報文可能性更大的放前面;
  4. 服務於同一類別的功能的規則,匹配條件較嚴格的放在前面;
  5. 設置默認策略:白名單機制iptables -P,不建議;建議在規則的最後定義規則作爲默認策略;
相關文章
相關標籤/搜索