三千年读史无外乎功名利禄,九万里悟道终归是诗酒田园。

IPTABLES防火墙扩展用法及规则重载- 显式扩展与隐式扩展

一、显示扩展:必须显式指明使用的扩展模块

显示扩展:必须使用-m选项指定使用的扩展

显示当前iptables可用的显式扩展:

rpm -ql iptables | grep "[[:lower:]]\.so$"

查看man文档:

  • centos 6: man iptables
  • centos 7: man iptables-extensions

1.multiport扩展

以离散方式定义多端口匹配;最多指定15个端口;(一条规则实现多端口操作)

  • 格式:

[!] –source-ports,–sports port[,port|,port:port]… :指明多个源端口;

[!] –destination-ports,–dports port[,port|,port:port]… :指明多个离散的目标端口;

[!] –ports port[,port|,port:port]… :很少用

示例,放行10.10.0.0/16这个网段主机允许访问本机2280端口:

iptables -I INPUT -s 10.10.0.0/16 -d 10.10.10.2 -p tcp -m multiport --dports 22,80 -j ACCEPT
iptables -I OUTPUT -s 10.10.10.2 -s 10.10.0.0/16 -p tcp -m multiport --sports 22,80 -j ACCEPT 

2.iprange扩展

指明连续的(但一般不能扩展为整个网络)IP地址范围时使用;

格式:

[!] --src-range from[-to] :指明连续的源IP地址范围;

[!] --dst-range from[-to] :指明连续的目标IP地址范围;

示例,放行10.10.100.110.10.100.120这个网段主机的22,23,24,25,80端口:

iptables -I INPUT -d 10.10.10.2 -p tcp -m multiport --dports 22:25,80 -m iprange --src-range 10.10.100.1-10.10.100.120 -j ACCPET
iptables -I OUTPUT -s 10.10.10.2 -p tcp -m multiport --sports 22:55,80 -m iprange --dst-range 10.10.100.1-10.100.120 -j ACCEPT

3.string扩展

检查报文中出现的字符串(--algo);

    --algo {bm|kmp}
        bm= Boyer-Moore
        kmp= Knuth-Pratt-

这是两个字符串匹配算法,根据两个开发者命名而来。

示例:

[root@server ~]#cat /var/www/html/bad.html
this is a movie page
[root@server ~]#

当匹配到movie字符串时,REJECT掉:

iptables -I OUTPUT -m string --algo bm --string "movie" -j REJECT

此时访问bad.html这个页面已经打不开

4.time扩展

根据报文到达的时间与指定的时间范围进行匹配;

--datestart :指定其实日期

--datestop :指定结束日期

格式:

--timestart hh:mm[:ss] --timestop hh:mm[:ss]

也可以指定某天:

  • [!] --monthdays day[,day...]
  • [!] --weekdays day[,day...]

具体使用请man iptablestime扩展(新版iptablesman iptables-extesions)

示例,每天的14点到16点不允许访问本机80端口:

iptables -I INPUT -d 192.168.1.2 -p tcp --dport 80 -m time --timestart 14:00 --timestop 16:00 -j DROP

注意时间分CSTUTC时区,data命令可查看当前时区在哪,iptablestime扩展添加的时区一般是按UTC算的,所以两者相差8个小时。

5.connlimit扩展

根据客户端IP(也可以是地址块)做并发连接数数量匹配;

  • --connlimit-above n :连接的数量大于n
  • --connlimit-upto n :连接的数量小于等于n

示例,对于tcp第一次请求(即第一次握手,--syn参数)的主机最多请求两次23端口:

iptables -A INPUT -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT

示例2,限制22端口最多连接数为3

iptables -I INPUT -p tcp --dport 22 -m connlimt --connlimit-above 3 -j REJECT

6.limit扩展

基于收发报文的速率做检查,涉及令牌桶过滤器;

  • --limit rate[/second|/minute|/hour|/day]
  • --limit-burst number

示例,一分钟内只能被ping 30次(所有主机加起来),对于前五个ping没有限制:

iptables -A INPUT -d 192.168.1.2 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 30/minute -j ACCEPT
iptables -A OUTPUT -s 192.168.1.2 -p icmp --icmp-type 0 -j ACCEPT

7.state扩展

根据连接追踪机制检查连接的状态;

调整连接追踪功能所能够容纳的最大连接数量:

cat  /proc/sys/net/nf_conntrack_max

查看已经追踪到兵记录下的连接:

cat  /proc/net/nf_conntrack

不同协议或链接类型追踪时长(可自定义时长):

ls /proc/sys/net/netfilter/

可追踪的连接状态:

  • NEW:新发出的请求;连接追踪模板中不存在此连接相关的信息条目,因此,将其识别为第一次发出的请求;
  • ESTABLISHEDNEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态;
  • RELATED:相关的连接;如FTP协议中的命令连接与数据连接之间的关系;
  • INVALIED:无法识别的连接;

格式:--state STATE1,STATE2...

示例,只允许NEWESTABLISHED入站,ESTABLISHED出站:

iptables -I INPUT -d 10.10.10.2 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -I OUTPUT -s 10.10.10.2 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

这样限制的好处是让所有的连接都安全出去,无法发出NEW请求(反弹木马攻击就是靠NEW请求),大大提升安全性。

再比如,想放行8022端口(使用multiport扩展实现):

iptables -I INPUT -d 10.10.10.2 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -I OUTPUT -s 10.10.10.2 -p tcp -m multiport --dports 22,80 -m state --state ESTABLISHED -j ACCEPT

规则优化

上面几条命令可以优化为:

iptables -I INPUT -d 10.10.10.2 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptabls -I OUTPUT  -m state --state ESTABLISHED -j ACCPET  ##优化出站规则

初步优化后的规则如下:

[root@server ~]# iptables -L -n
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            172.30.0.12         multiport dports 22,80 state NEW,ESTABLISHED
ACCEPT     icmp --  0.0.0.0/0            172.30.0.12         icmp type 8 state NEW,ESTABLISHED

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state ESTABLISHED
[root@server ~]#

可见,入站规则每条都有NEWESTABLISHED,当有一个ESTABLISHED请求入站时需要一条条匹配才能放行,可想而知,当有几百条规则时效率是极低的。
此时,可以在入站规则添加一条: 凡是ESTABLISHED(说明此前被放行过了)请求全部放行。这样所有ESTABELISHED只要匹配第一条规则即可入站。

优化后的规则如下:

[root@server ~]# iptables -I INPUT -m state --state ESTABLISHED -j ACCEPT
[root@server ~]# iptables -L -n
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state ESTABLISHED
ACCEPT     tcp  --  0.0.0.0/0            172.30.0.12         multiport dports 22,80 state NEW,ESTABLISHED
ACCEPT     icmp --  0.0.0.0/0            172.30.0.12         icmp type 8 state NEW,ESTABLISHED

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state ESTABLISHED
[root@server ~]#

再接着,INPUT表的第二、三条的ESTABLISHED请求可以删了(删之前先添加,因为此时用的ssh连接服务器,匹配的第二条),改成只检查NEW即可
最终优化:

[root@server ~]# iptables -I INPUT 2 -d 172.30.0.12 -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT
[root@server ~]# iptables -I INPUT 3 -d 172.30.0.12 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
[root@server ~]# iptables -D INPUT 4
[root@server ~]# iptables -D INPUT 4  ##删除第四条后,第五条变为第四条,因此这里还是删除第四条
[root@server ~]# iptables -L -n -v
Chain INPUT (policy DROP 1 packets, 40 bytes)
pkts bytes target     prot opt in     out     source               destination         
8466  628K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state ESTABLISHED
    2   120 ACCEPT     tcp  --  *      *       0.0.0.0/0            172.30.0.12         multiport dports 22,80 state NEW
   30   840 ACCEPT     icmp --  *      *       0.0.0.0/0            172.30.0.12         icmp type 8 state NEW

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

Chain OUTPUT (policy ACCEPT 9 packets, 630 bytes)
pkts bytes target     prot opt in     out     source               destination         
7065 1062K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state ESTABLISHED
[root@server ~]#

state扩展可以提升系统安全性是必然的,但是,因为其用的是追踪访问机制,所以也会影响效率,所以平时最好综合实际环境使用。

有些协议的追踪访问时间长,而有些则短,比如TCP会话超时时间两个小时(很长)
因此,可以自定义协议的追踪时间时长
不同协议或链接类型追踪时长:

ls /proc/sys/net/netfilter/

二、隐式扩展

隐式扩展:对-p protocol指明的协议进行的扩展,可省略-m选项

-p tcp
    --dport PORT[-PORT]:目标端口,可以是单个或连续多个端口;
    --sport PORT[-PORT]
    --tcp-flags LIST1 LIST2 SYN,ACK,FIN,RST,PSH,URG
                            #检查LIST1所指明的所有标志位, 且这其中,
                            #LIST2所表示出的所有标记位必须为1,而余下的必须为0;
                            #没有LIST1中指明的,不做检查;

例如:

--tcp-flags SYN,ACK,FIN,RST SYN   #等于--syn,检查是否为新建TCP请求的第一次请求
            -p udp
                    --dport
                    --sport

            -p icmp
                    --icmp-type
                            #可用数字表示其类型:
                                0:echo-reply  #回送应答(ping应答)
                                8:echo-request #ping请求

比如允许本机ping任何主机,但不允许任何主机ping本机:

iptables -A OUTPUT -s 192.168.1.2 -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -d 192.168.1.2 -p icmp --icmp-type 0 -j ACCEPT 

示例二,放行本机入站的22端口,-I INPUT 默认插入INPUT第一条链:

iptables -I INPUT -d 192.168.1.2 -p tcp --dport 22 -j ACCEPT  

示例三,放行本机出站ssh的22端口:

iptables -I OUTPUT -s 192.168.1.2 -p tcp --sport 22 -j ACCEPT

三、规则保存及重载

  • 保存规则至指定文件:
    iptables-save > /PATH/TO/SOMEFILE
  • 从指定文件重载规则:
    iptables-restore < /PATU/FROM/SOMEFILE

其他用法

CentOS 6:

service iptables save
##相当于iptables-save > /etc/sysconfig/iptables

service iptables restart
##相当于iptables-restore < /etc/sysconfig/iptables

总结:

显示扩展必须使用-m选项指定扩展,后接扩展参数或选项

隐式扩展是对-p protocol的协议扩展

赞(33)
转载请注明出处:RokasYang's Blog » IPTABLES防火墙扩展用法及规则重载-