0%

Iptables详解-扩展模块速成

扩展模块

我们知道,httpd服务的默认端口为80,当我们使用curl或者浏览器访问主机时,默认会连接服务端的80端口,假设,我们现在想要使用iptables设置一条规则,拒绝来自192.168.1.100的访问请求,我们就可以拒绝100上的报文能够发往本机的80号端口,这个时候,就需要用到”目标端口”选项。

tcp扩展模块

常用的扩展匹配条件如下:

-p tcp -m tcp –sport 用于匹配tcp协议报文的源端口,可以使用冒号指定一个连续的端口范围

-p tcp -m tcp –dport 用于匹配tcp协议报文的目标端口,可以使用冒号指定一个连续的端口范围

# 更多示例如下
iptables -t filter -I OUTPUT -d 192.168.1.100 -p tcp -m tcp --sport 80 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.100 -p tcp -m tcp --dport 80:90 -j REJECT    
iptables -t filter -I OUTPUT -d 192.168.1.100 -p tcp -m tcp ! --sport 80 -j ACCEPT

udp扩展

常用的扩展匹配条件
–sport:匹配udp报文的源地址
–dport:匹配udp报文的目标地址

#示例
iptables -t filter -I INPUT -p udp -m udp --dport 137 -j ACCEPT
iptables -t filter -I INPUT -p udp -m udp --dport 131:168 -j ACCEPT
#可以结合multiport模块指定多个离散的端口

icmp扩展

常用的扩展匹配条件
–icmp-type:匹配icmp报文的具体类型

# 更多示例如下
iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT
iptables -t filter -I INPUT -p icmp --icmp-type 8 -j REJECT
iptables -t filter -I OUTPUT -p icmp -m icmp --icmp-type 0/0 -j REJECT
iptables -t filter -I OUTPUT -p icmp --icmp-type 0 -j REJECT
iptables -t filter -I INPUT -p icmp --icmp-type "echo-request" -j REJECT

multiport扩展模块

常用的扩展匹配条件如下:

-p tcp -m multiport –sports 用于匹配报文的源端口,可以指定离散的多个端口号,端口之间用”逗号”隔开
-p udp -m multiport –dports 用于匹配报文的目标端口,可以指定离散的多个端口号,端口之间用”逗号”隔开

# 更多示例如下
iptables -t filter -I OUTPUT -d 192.168.1.100 -p udp -m multiport --sports 137,138 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.100 -p tcp -m multiport --dports 22,80 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.100 -p tcp -m multiport --dports 22,80:88 -j REJECT

string模块

如果我们需要匹配制定的字符串就需要用到string扩展模块;

常用扩展匹配条件如下

–algo:指定对应的匹配算法,可用算法为bm、kmp,此选项为必需选项。
–string:指定需要匹配的字符串

# 更多示例如下
iptables -t filter -I INPUT -p tcp -m string --algo bm --string "youtube" -j DROP
iptables -t filter -I INPUT -p tcp -m string --algo kmp --string "youtube" -j DROP

time模块

如果我们需要根据时间来放行或者拒绝通过,那么就需要用到time模块。
常用扩展匹配条件如下
–timestart:用于指定时间范围的开始时间,不可取反

–timestop:用于指定时间范围的结束时间,不可取反

–weekdays:用于指定”星期几”,可取反

–monthdays:用于指定”几号”,可取反

–datestart:用于指定日期范围的开始日期,不可取反

–datestop:用于指定日期范围的结束时间,不可取反

# 更多示例如下
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --weekdays 6,7 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --monthdays 22,23 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time ! --monthdays 22,23 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays 6,7 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --weekdays 5 --monthdays 22,23,24,25,26,27,28 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --datestart 2017-12-24 --datestop 2017-12-27 -j REJECT

iprange模块

常用的-s选项与-d选项并不能一次性的指定一段连续的IP地址范围,如果我们需要指定一段连续的IP地址范围,
这个时候就可以用iprange扩展模块

包含的扩展匹配条件如下

–src-range:指定连续的源地址范围
–dst-range:指定连续的目标地址范围

# 更多示例如下
iptables -t filter -I INPUT -m iprange --src-range 192.168.1.1-192.168.1.10 -j DROP
iptables -t filter -I OUTPUT -m iprange --dst-range 192.168.1.10-192.168.1.20 -j DROP
iptables -t filter -I INPUT -m iprange ! --src-range 192.168.1.100-192.168.1.200 -j DROP

–tcp-flags模块

用于匹配报文的tcp头的标志位

# 更多示例如下
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK -j REJECT
iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags SYN,ACK -j REJECT
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags ALL SYN -j REJECT

我们可以用-syn匹配tcp新建连接的请求报文,相当于使用”–tcp-flags SYN,RST,ACK,FIN SYN”

# 更多示例如下
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --syn -j REJECT

自定义链

当默认链中的规则非常多时,不方便我们管理,这个时候自定义链就能派上用场。

想象这样一个场景,如果INPUT链中存放了100条规则,这些规则里面有针对httpd服务的,有针对ftp服务的,有针对私网IP的,有针对公网IP的,如果想要修改针对nas服务的相关规则,没有配置自定义链之前我们需要从头看一遍这100条规则,找出哪些规则是针对nas的,然后进行修改。
如果我们之前配置自定义链,这就能很方便的解决我们的问题。

创建自定义链

#示例:在filter表中创建IN_WEB自定义链
iptables -t filter -N IN_WEB

引用自定义链

#示例:在INPUT链中引用刚才创建的自定义链
iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB

重命名自定义链

#示例:将IN_WEB自定义链重命名为WEB
iptables -E IN_WEBB WEB

删除自定义链

删除自定义链需要满足两个条件

1、自定义链没有被引用

2、自定义链中没有任何规则

#示例:删除引用计数为0并且不包含任何规则的WEB链
iptables -X WEB

参考文章