iptables详解之filter

iptables令很多小伙伴脑阔疼,下面我们来说说如何使用iptables。

一、iptables格式

1.1、iptables 帮助

通过iptables --help查看一下iptables用法

[root@note1 ~]# iptables --help
iptables v1.4.21Usage: 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] chainiptables -E old-chain-name new-chain-nameiptables -P chain target [options]iptables -h (print this help information)

1.2、iptables 格式

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

iptables命令由 表 + 命令 + 链 + 匹配条件 + 处理动作 组成

二、iptables表

iptables由四表五链组成。每个表分别实现不同的功能,每个表拥有不同的链,链代表规则实现的位置。

四表分别为:

  • filter :过滤,防火墙;
  • nat :用于源地址转换或目标地址转换;
  • mangle :拆解报文,做出修改,并重新封装起来;
  • raw :关闭nat表上启用的连接追踪机制;

五链分别为:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。

不同表支持的链:

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

添加规则时的考量点:

  • 要实现哪种功能:判断添加到哪个表上;
  • 报文流经的路径:判断添加到哪个链上;

链:链上的规则次序,即为检查的次序;因此,隐含一定的应用法则:

  • 同类规则(访问同一应用),匹配范围小的放上面;
  • 不同类的规则(访问不同应用),匹配到报文频率较大的放在上面;
  • 将那些可由一条规则描述的多个规则合并起来;
  • 设置默认策略;

使用iptables命令时若不使用-t指明操作哪张表,默认操作filter表。

三、iptables命令

iptables命令有三大类,查看,链管理,规则管理

3.1、查看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:80Chain 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.2、链管理

3.2.1、-N 新建链

-N:new, 自定义一条新的规则链;

iptables -N test

3.2.2、-X 删除链

-X:delete,删除自定义的规则链;
​ 注意:仅能删除用户自定义的引用计数为0的空的链;

iptables -X test

3.2.3、-E 重命名

-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除;

iptables -N testrn
iptables -E testrn testrename

3.2.4、-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.3.1、-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.2、-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.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.4、-D 删除规则

-D:delete,删除规则按照规则序号或规则本身

3.3.4.1、指明规则序号
[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.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 ~]# 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.5、-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.6、-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 ~]#

四、iptables匹配条件

4.1、基本匹配条件

无需加载任何模块,由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.2、扩展匹配条件

4.2.1、隐式扩展

隐式扩展:不需要手动加载扩展模块;因为它们是对协议的扩展,所以在使用-p选项指明了特定的协议时,就表示已经指明了要扩展的模块,无需再同时使用-m选项指明扩展模块的扩展机制。

4.2.1.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.2、udp
[!] --source-port, --sport port[:port]:
匹配报文的源端口;可以是端口范围;[!] --destination-port, --dport port[:port]:
匹配报文的目标端口;可以是端口范围;

[!]中的叹号表示取反的意思

4.2.1.3、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:220     0 REJECT     all  --  *      *       0.0.0.0/0            176.16.128.1         reject-with icmp-port-unreachableChain 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:220     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.2、显式扩展

显式扩展:必须使用-m选项指明要调用的扩展模块的扩展机制;

使用man iptables-extensions来查看显示扩展的用法。

4.2.2.1、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.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.3、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.4、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.5、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.6、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 <= 20     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 8 limit: avg 20/min burst 30     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            176.16.128.1         multiport dports 80,443,33062   104 REJECT     all  --  *      *       0.0.0.0/0            176.16.128.1         reject-with icmp-port-unreachableChain 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,33060     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 010   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.7、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

五、处理动作

-j targetname [per-target-options]

5.1、基本处理动作

ACCEPT 允许
DROP 丢弃

5.2、扩展处理动作

5.2.1、REJECT 拒绝

--reject-with type

5.2.2、LOG 日志

--log-level
--log-prefix

默认日志保存于/var/log/messages

5.2.3、RETURN 返回

返回调用者;

5.3、自定义链作为target

自定义链做为target:

六、保存、重载

保存:iptables-save > /PATH/TO/SOME_RULE_FILE

重载:iptabls-restore < /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) 自定义脚本;

七、规则优化

  1. 使用自定义链管理特定应用的相关规则,模块化管理规则;
  2. 优先放行双方向状态为ESTABLISHED的报文;
  3. 服务于不同类别的功能的规则,匹配到报文可能性更大的放前面;
  4. 服务于同一类别的功能的规则,匹配条件较严格的放在前面;
  5. 设置默认策略:白名单机制
    iptables -P,不建议;
    建议在规则的最后定义规则做为默认策略;

转载于:https://www.cnblogs.com/miaocunf/p/11386418.html

iptables详解之filter相关推荐

  1. iptables详解--转

    出处:http://yijiu.blog.51cto.com/433846/1356254 iptables详解 基本概念: 1.防火墙工作在主机边缘:对于进出本网络或者本主机的数据报文,根据事先设定 ...

  2. iptables详解以及企业常用案例

    iptables详解以及企业常用案例 iptables采用netfilter网络架构实现包过滤防火墙,可以实现硬件防火墙的常用功能,亦可以在应用方案中作为硬件防火墙的替代品.在本文档里我们将详细介绍i ...

  3. iptables详解(转)

    iptables详解 前言 防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种.无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘.而我们的任务就是需 ...

  4. 《iptables详解 》RHEL6

    iptables详解    Iptables原理 现在防火墙主要分以下三种类型: 包过滤.应用代理.状态检测 包过滤防火墙:现在静态包过滤防火墙市面上已经看不到了,取而代之的是动态包过滤技术的防火墙哈 ...

  5. iptables详解【1】: 概念

    iptables详解(1):iptables概念 文章目录 一.防火墙相关概念 二.iptables基础 三.链的概念 四.表的概念 五.表链关系 六.数据经过防火墙的流程 七.规则的概念 八.小结 ...

  6. Iptables 详解与实战案例

    目录 一.iptables简介 二.iptables的表tables与链chains 2.1 四种内建表 2.1.1 Filter表 2.1.2 NAT表 2.1.3 Mangle表 2.1.4 Ra ...

  7. iptables详解及应用(史上最全)

    1.1 iptables概念 从逻辑上讲.防火墙可以大体分为主机防火墙和网络防火墙. 主机防火墙:针对于单个主机进行防护. 网络防火墙:往往处于网络入口或边缘,针对于网络入口进行防护,服务于防火墙背后 ...

  8. 详解php://filter以及死亡绕过

    详解php://filter以及死亡绕过 php://filter PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流.标准输入输出和错误描述符, 内存中.磁盘备份的临时文件流 ...

  9. linux iptables 详解

    1.iptables的发展: iptables的前身叫ipfirewall (内核1.x时代),这是一个作者从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具. ...

最新文章

  1. 何玺对话苏宁金融洪蜀宁:区块链是颠覆性技术,意义远超互联网
  2. C语言写的流氓关机程序及破解
  3. VHDL操作运算符的优先级顺序
  4. 所谓情商高就是会说话
  5. Cloud for Customer UI designer自动生成的一些模型
  6. python获取当前进程id_从python进程名中获取进程id
  7. 使用Python创建一个系统监控程序
  8. 无法访问_关于小米电视无法访问电脑创建共享文件夹问题
  9. bzoj 1628 1683: [Usaco2007 Demo]City skyline(模拟)
  10. atitit.提升软件开发的效率and 质量的那些强大概念and方法总结
  11. 怎样使用U盘启动盘安装乌班图系统
  12. 台达PLC与台达DTE8路温控程序,威纶通触摸屏与温控器modbus485通讯
  13. 孤独星球android app,《孤独星球》终于出了全套免费的旅行指南APP !
  14. eclipse svn主干修改代码同步到分支
  15. 计算机库里怎样添加桌面,小编教你win7中如何在库中添加桌面
  16. Matlab直方图显示y值
  17. linux交换分区的命令,LInux下的交换分区以及相关查看命令
  18. 30支队伍将在阿布扎比角逐奖金达500万美元的2020年穆罕默德-本-扎耶德国际机器人挑战赛
  19. 怎么调整照片dpi大小?如何提高图片的dpi分辨率?
  20. 现代汉语词典 v2007 build 07.01 官网

热门文章

  1. C++中使用strtok函数分割字符串String
  2. THE TWELFTH DAY
  3. 如何判断链表中是否有环
  4. was cached in the local repository, resolution will not be reattempted until the update interval
  5. 零序电流继电器器JL-8C-12-2-2
  6. win10 cmd切换不了目录 windows命令提示符 切换目录 (已解决)
  7. 历史教学视频信息汇总
  8. 一加由于目标计算机积极拒绝无法连接失败,mongodb由于目标计算机积极拒绝无法连接失败...
  9. 一加连续点Android版本号,一加5T Android8.0全国首刷/附加教程和ROM
  10. 用Python写一个微信防撤回神器