龙之介大人

iptables扩展匹配插件的使用一
显式扩展的参数语法显式扩展:必须显式指明使用的扩展模块:rpm -ql iptables | grep "...
扫描右侧二维码阅读全文
15
2020/02

iptables扩展匹配插件的使用一

显式扩展的参数语法

显式扩展:必须显式指明使用的扩展模块:rpm -ql iptables | grep "\.so"
  • 如何呼出帮助文档
Centos6: man iptables
Centos7: iptables-extensions
# 1. multiport扩展:以离散方式定义多端口匹配;最多指定15个端口;
    [!] --source-ports,--sports port[,port|,port:port]...: 指明多个源端口;
    [!] --destination-ports,--dports port[,port|,port:port]...: 指明多个离散的目标端口;
    [!] --ports port[,port|,port:port]...: 
# 例如:
    iptables -I INPUT -s 172.16.0.0/16 -d 172.16.100.9 -p tcp -m multiport --dports 22,80 -j ACCEPT
    iptables -I OUTPUT -d 172.16.0.0/16 -s 172.16.100.9 -p tcp -m multiport --sports 22,80 -j ACCEPT

#2. iprange扩展:指明连续的(但一般是不能扩展为整个网络)ip地址范围时使用;
    [!] --src-range from[-to]: 指明连续的源IP地址范围;
    [!] --dst-range from[-to]: 指明连续的目标地址范围;
#例如:
    iptables -t filter -A INPUT -s 10.10.1.0/24 -d 10.10.1.109 -p tcp -m multiport --dports 22,80 -j ACCEPT
    iptables -t filter -A OUTPUT -s 10.10.1.109 -d 10.10.1.0/24 -p tcp -m multiport --dports 22,80 -j ACCEPT

#3. string扩展:检查报文中出现的字符串
    --algo {bm|kmp}: Select the pattern matching strategy. (bm = Boyer-Moore, kmp = Knuth-Pratt-Morris)
    [!] --string pattern : Matches the given pattern.
#例如:
    iptables -t filter -I OUTPUT -m string --algo bm --string '502 Bad Gateway' -j DROP

#4. time扩展:根据报文到达的时间与指定的时间范围进行匹配;
    --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]: 启动日期
    --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]: 停止日期
        Only  match  during the given time, which must be in ISO 8601 "T" notation.  The possible time range is 1970-01-01T00:00:00 to 2038-01-19T04:17:07.

    --timestart hh:mm[:ss]: 启动时间
    --timestop hh:mm[:ss]: 停止时间
        Only match during the given daytime. The possible time range is  00:00:00  to  23:59:59.  Leading  zeroes  are  allowed  (e.g."06:03") and correctly interpreted as base-10.

    [!] --monthdays day[,day...]: 在每个月的特定时间进行检查,只能知道足月;例如2月只有28号,如果指定30号是不会进行检查.
    [!] --weekdays day[,day...]: Only match on the given weekdays. Possible values are Mon, Tue, Wed, Thu, Fri, Sat, Sun, or values from 1 to 7.

#5. connlimit扩展:根据每客户端IP(也可以是地址块)做并发连接数数量匹配;
    --connlimit-upto n: 如果现有连接数小于或等于n,则进行匹配。
    --connlimit-above n: 如果现有连接数大于n,则匹配。
    --connlimit-mask prefix_length: 使用前缀长度对主机进行分组。对于IPv4,这必须是0到32之间的数字(包括)。对于IPv6, 0到128. 如果未指定,则使用适用协议的最大前缀长度。
    --connlimit-saddr: 将此限制应用于源组。如果未指定—connlimit-daddr,则为默认值。
    --connlimit-daddr: 将限制应用于目标组。
#例如:
    iptables -A INPUT -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT #如果现有连接大于2个则拒绝
    iptables -A INPUT -p tcp --syn --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT #如果现有连接小于2个则接受

#6. limit扩展:基于收发报文的速率做检查;
    #此模块使用令牌桶过滤器以有限的速率匹配。
    --limit rate[/second|/minute|/hour|/day]: 最大平均匹配率,指定为一个数字,单位可选为'/second|/minute|/hour|/day';默认是3/hour
    --limit-burst number: 通行证数量,默认为5个
#例如:
    [root@study1 ~]# iptables -t filter -I INPUT -s 0.0.0.0/0 -d 10.10.1.109 -p icmp --icmp-type 8 -m limit --limit 30/minute --limit-burst 2 -j ACCEPT

#7. state扩展:根据连接追踪机制检查连接的状态;
    #调整连接追踪功能所能够容纳的最大连接数量:
        /proc/sys/net/nf_conntrack_max
    #已经追踪到并记录下的连接:
        /proc/sys/net/nf_conntrack
    #不同协议或链接类型追踪的时长
        /proc/sys/net/netfilter/
    [!] --state state1 state2 ...: 追踪的状态; 

#可追踪的连接状态:
    NEW:新发出的请求,连接追踪模板中不存此连接相关的信息条目,因此,将其识别为第一次发出的请求;
    ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态;
    RELATED:相关的连接,如ftp协议的命令连接与数据连接之间的关系;
    INVALIED:无法识别的连接
#例如:
    #放行请求报文:
    #命令连接:NEW, ESTABLISHED
    #数据连接:RELATED, ESTABLISHED
    iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A INPUT -d LocalIP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
    
    #放行响应报文:
    #ESTABLISEHD
    iptables -A OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT

显示扩展的详细使用

multiport使用示例

#如果我要放行ssh与httpd服务的报文,普通的放行方法需要写两条规则使用multiport只需要一条,
# 使用方式如下:
[root@study1 ~]# iptables -F #情况链信息
[root@study1 ~]# iptables -X #清空自定义链
[root@study1 ~]# iptables -t filter -A INPUT -s 10.10.1.0/24 -d 10.10.1.109 -p tcp -m multiport --dports 22,80 -j ACCEPT
[root@study1 ~]# iptables -t filter -A OUTPUT -s 10.10.1.109 -d 10.10.1.0/24 -p tcp -m multiport --dports 22,80 -j ACCEPT
[root@study1 ~]# iptables -t filter -L -n -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 1181 75344 ACCEPT     tcp  --  *      *       10.10.1.0/24         10.10.1.109          multiport dports 22,80kj

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

Chain OUTPUT (policy ACCEPT 5 packets, 500 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     tcp  --  *      *       10.10.1.109          10.10.1.0/24         multiport dports 22,80

iprange使用示例

#例如:我需要放行源地址为10.10.1.0-10.10.1.1的主机访问ssh httpd服务
# 规则设置如下
[root@study1 ~]# iptables -t filter -A INPUT -s 0.0.0.0/0 -d 10.10.1.109 -p tcp -m multiport --dports 22,80 -m iprange --src-range 10.10.1.100-10.10.1.150 -j ACCEPT
[root@study1 ~]# iptables -t filter  -A OUTPUT -s 10.10.1.109 -d 0.0.0.0/0 -p tcp -m multiport --sports 22,80 -m iprange --dst-range 10.10.1.100-10.10.1.150 -j ACCEPT
[root@study1 ~]# iptables -t filter -L -n -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  272 18593 ACCEPT     tcp  --  *      *       0.0.0.0/0            10.10.1.109          multiport dports 22,80 source IP range 10.10.1.100-10.10.1.150

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

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  150 15065 ACCEPT     tcp  --  *      *       10.10.1.109          0.0.0.0/0            multiport sports 22,80 destination IP range 10.10.1.100-10.10.1.150
# 规则测试:使用10.10.1.100-10.10.1.150之外的机器是无法访问httpd服务的
[root@study3 ~]# curl 10.10.1.109 -I  #100-150之内的主机是可以正常访问的.
HTTP/1.1 403 Forbidden
Date: Wed, 12 Feb 2020 13:33:19 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Thu, 16 Oct 2014 13:20:58 GMT
ETag: "1321-5058a1e728280"
Accept-Ranges: bytes
Content-Length: 4897
Content-Type: text/html; charset=UTF-8

[root@web-service-1 ~]# curl 10.10.1.109   #在规则之外的主机是无法正常访问httpd服务
curl: (7) Failed connect to 10.10.1.109:80; 连接超时

limit扩展使用示例

#限制ping请求,每次放行2个 每分钟速率30个
[root@study1 ~]# iptables -t filter -A INPUT -s 0.0.0.0/0 -d 10.10.1.109 -p icmp --icmp-type 8 -m limit --limit 30/minute --limit-burst 2 -j ACCEPT
[root@study1 ~]# iptables -t filter -A OUTPUT -s 10.10.1.109 -d 0.0.0.0/0 -p icmp --icmp-type 0 -j ACCEPT

#windows测试
C:\Users\xiaoqi>ping 10.10.1.109 -t
正在 Ping 10.10.1.109 具有 32 字节的数据:
来自 10.10.1.109 的回复: 字节=32 时间=22ms TTL=63
来自 10.10.1.109 的回复: 字节=32 时间=3ms TTL=63
请求超时。
来自 10.10.1.109 的回复: 字节=32 时间=14ms TTL=63
来自 10.10.1.109 的回复: 字节=32 时间=4ms TTL=63
来自 10.10.1.109 的回复: 字节=32 时间=29ms TTL=63
请求超时。
来自 10.10.1.109 的回复: 字节=32 时间=4ms TTL=63
来自 10.10.1.109 的回复: 字节=32 时间=8ms TTL=63
来自 10.10.1.109 的回复: 字节=32 时间=5ms TTL=63
请求超时。

state扩展使用示例

使用state扩展需要装载追踪时专用的模块;
#示例:链接追踪ftp,ssh,httpd服务
#1. 放行ssh服务,且使用链接追踪
[root@study1 ~]# iptables -t filter -I INPUT -s 0.0.0.0/0 -d 10.10.1.109 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT  #INPUT放行NEW ESTABLISHED状态
[root@study1 ~]# iptables -t filter -I OUTPUT -s 10.10.1.109 -d 0.0.0.0/0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT  #OUTPUT放行ESTABLISHED 状态
[root@study1 ~]# iptables -t filter  -L -n -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  515 30132 ACCEPT     tcp  --  *      *       0.0.0.0/0            10.10.1.109          tcp dpt:22 state NEW,ESTABLISHED

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

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   96 10432 ACCEPT     tcp  --  *      *       10.10.1.109          0.0.0.0/0            tcp spt:22 state ESTABLISHED
#测试:ssh服务依然可以正常使用,而httpd服务无法访问
[root@study02 ~]# curl 10.10.1.109
curl: (7) Failed connect to 10.10.1.109:80; 连接超时

#2. 放行httpd服务,使用链接追踪
[root@study1 ~]# iptables -t filter -I INPUT -s 0.0.0.0/0 -d 10.10.1.109 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
[root@study1 ~]# iptables -t filter -I OUTPUT -s 10.10.1.109 -d 0.0.0.0/0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
[root@study1 ~]# iptables -t filter -L -n -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            10.10.1.109          tcp dpt:80 state NEW,ESTABLISHED
 1493 90745 ACCEPT     tcp  --  *      *       0.0.0.0/0            10.10.1.109          tcp dpt:22 state NEW,ESTABLISHED

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

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     tcp  --  *      *       10.10.1.109          0.0.0.0/0            tcp spt:80 state ESTABLISHED
  376 33309 ACCEPT     tcp  --  *      *       10.10.1.109          0.0.0.0/0            tcp spt:22 state ESTABLISHED
#测试结果
[root@study02 ~]# curl 10.10.1.109 -I
HTTP/1.1 403 Forbidden
Date: Thu, 13 Feb 2020 07:34:28 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Thu, 16 Oct 2014 13:20:58 GMT
ETag: "1321-5058a1e728280"
Accept-Ranges: bytes
Content-Length: 4897
Content-Type: text/html; charset=UTF-8


#优化1:允许流入的数据一律允许流出
[root@study1 ~]# iptables -t filter -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
[root@study1 ~]# iptables -t filter -L OUTPUT -n -v  #这样优化了OUTPUT规则,省去了写规则的时间
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   26  3312 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
#测试httpd服务
[root@study02 ~]# curl 10.10.1.109 -I
HTTP/1.1 403 Forbidden
Date: Thu, 13 Feb 2020 07:39:50 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Thu, 16 Oct 2014 13:20:58 GMT
ETag: "1321-5058a1e728280"
Accept-Ranges: bytes
Content-Length: 4897
Content-Type: text/html; charset=UTF-8

#优化2:只要之前NEW的报文都允许INPUT流入
[root@study1 ~]# iptables -t filter -I INPUT -m state --state ESTABLISHED -j ACCEPT
[root@study1 ~]# iptables -t filter -I INPUT 2 -s 0.0.0.0/0 -d 10.10.1.109 -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT

[root@study1 ~]# iptables -t filter -L INPUT -n -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  441 25504 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            10.10.1.109          multiport dports 22,80 state NEW
#测试httpd服务:
[root@study02 ~]# curl 10.10.1.109 -I
HTTP/1.1 403 Forbidden
Date: Thu, 13 Feb 2020 07:45:14 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Thu, 16 Oct 2014 13:20:58 GMT
ETag: "1321-5058a1e728280"
Accept-Ranges: bytes
Content-Length: 4897
Content-Type: text/html; charset=UTF-8
  • 关于开放ftp服务示例
例如:追踪FTP服务时需要装载nf_conntrack_ftp;modprobe nf_conntrack_ftp.
#开放被动模式的ftp服务示例.
#1. 装载模块;模块路径:/lib/modules/3.10.0-1062.9.1.el7.x86_64/kernel/net/netfilter
[root@study1 netfilter]# modinfo nf_conntrack_ftp.ko.xz  #查看模块信息
filename:       /lib/modules/3.10.0-1062.9.1.el7.x86_64/kernel/net/netfilter/nf_conntrack_ftp.ko.xz
alias:          nfct-helper-ftp
alias:          ip_conntrack_ftp
description:    ftp connection tracking helper
author:         Rusty Russell <rusty@rustcorp.com.au>
license:        GPL
retpoline:      Y
rhelversion:    7.7
srcversion:     F21861D5AD43080B93CC4DD
depends:        nf_conntrack
intree:         Y
vermagic:       3.10.0-1062.9.1.el7.x86_64 SMP mod_unload modversions 
signer:         CentOS Linux kernel signing key
sig_key:        9E:88:C8:DF:D4:52:91:8C:83:21:F5:1E:BB:C7:92:4B:49:8B:BD:5A
sig_hashalgo:   sha256
parm:           ports:array of ushort
parm:           loose:bool
[root@study1 ~]# modprobe nf_conntrack_ftp  #装载模块
[root@study1 ~]# lsmod |grep nf_conntrack_ftp  #查看是否装载模块
nf_conntrack_ftp       18478  0 
nf_conntrack          139224  7 nf_nat,nf_nat_ipv4,nf_nat_ipv6,xt_conntrack,nf_conntrack_ftp,nf_conntrack_ipv4,nf_conntrack_ipv6

#2. 放行请求报文
#命令连接:NEW ESTABLISHED
#数据连接:RELATED ESTABLISHED
## 放行命令连接
[root@study1 ~]# iptables -t filter -R INPUT 2 -s 0.0.0.0/0 -d 10.10.1.109 -p tcp -m multiport --dports 21,22,80 -m state --state NEW -j ACCEPT
[root@study1 ~]# iptables -L INPUT -n -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  733 42225 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            10.10.1.109          multiport dports 21,22,80 state NEW
## 放行数据连接
[root@study1 ~]# iptables -t filter -R INPUT 1 -m state --state ESTABLISHED,RELATE -j ACCEPT
[root@study1 ~]# iptables -L INPUT -n -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   32  1916 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            10.10.1.109          multiport dports 21,22,80 state NEW

#放行响应报文
#类型:ESTABLISHED
[root@study1 ~]# iptables -t filter -I OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT
[root@study1 ~]# iptables -L OUTPUT -n -v
Chain OUTPUT (policy DROP 6 packets, 438 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  143  9677 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
    0     0 ACCEPT     tcp  --  *      *       10.10.1.109          0.0.0.0/0            tcp spt:22

iptables规则保存及重载

  • 保存规则至指定文件:iptables-save > /PATH/TO/SOMEFILE
  • 指定文件重载规则:iptables-restore < /PATH/TO/SOMEFILE
#CentOS6 :
service iptables save
    iptables-save > /etc/sysconfig/iptables

service iptables restart
    iptables-restore < /etc/sysconfig/iptables

#CentOS7 :
引入了新的iptables前端管理服务工具:firewalld
    firewalld-cmd
    firewall-config
最后修改:2020 年 02 月 15 日 01 : 39 PM

发表评论