千家信息网

9个实验带你了解iptables的显示扩展规则设置

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,本小结重点讲解一下iptables的显示扩展规则设置显示扩展:必须显式地指明使用的扩展模块进行扩展;使用帮助:Centos 6:man IptablesCentos 7:man iptables-ex
千家信息网最后更新 2025年01月19日9个实验带你了解iptables的显示扩展规则设置

本小结重点讲解一下iptables的显示扩展规则设置

显示扩展:必须显式地指明使用的扩展模块进行扩展;

使用帮助:

Centos 6:man Iptables

Centos 7:man iptables-extensions

实验1:

multiport扩展

以离散的方式定义多端口匹配;最多指定15个端口;

[!]--source-ports,--sports port,port,....:指定多个源端口;

[!]--destination-ports,--dports port,port....:指定多个目标端口

[!]--ports port ,port...:指明多个端口,不管是源端口还是目标端口都匹配

允许192.168.32.163这台主机访问本机的22,80端口

iptables -A INPUT -s 192.168.32.163 -d 192.168.32.144 -p tcp -m multiport --dports 22,80 -j ACCEPT

实验2:

iprange扩展

指明连续的(但一般不能是整个网络)ip地址范围;

[!]--src-rang from[-to]:源IP地址;

[!]--dst-rang from[-to]:目标IP地址;

172.16.100.5主机到172.16.100.10主机不能访问本机的web服务

iptables -A INPUT -d 192.168.32.144 -p tcp --dport 80 -m iprange --src-range 172.16.100.5-172.16.100.10 -j DROP

实验3:

string扩展

对报文中的应用层数据做字符串模式匹配检测;

--algo{bm|kmp}:字符串匹配检测算法;

bm:Boyer-Moore

kmp:Knuth-Pratt_Morrls

[!]--string patter:要检测的字符串模式;

[!]--hex-string patter:要检测的字符创模式,16进制格式;

限制192.168.32.163访问本机web网页中含有have内容的网页。

必须定义到OUTPUT中因为请求的报文中是不带需要限制的字符串的,只有响应的报文中才带有需要限制的字符串

iptables -A OUTPUT -s 192.168.32.144 -d 192.168.32.163 -p tcp --sport 80 -m string --algo bm --string "have" -j REJECT

在本机安装web服务,并创建两个页面,其中一个含有have字符串,

初始状态防火墙未做任何规则

此时客户端可以正常访问web服务器

添加防火墙规则

iptables -A OUTPUT -s 192.168.32.144 -d 192.168.32.163 -p tcp --sport 80 -m string --algo bm --string "have" -j REJECT

含有have字段的网页不能够访问


实验4:

time扩展

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

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

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

--datestart 1970-01-01T00:00:00

--datestop 2030-01-19T04:17:07

--timestart hh:mm[:ss]

--timestop hh:mm[:ss]

[!]--monthdays day[,day]

Possible values are 1 to 31.

[!]--weekdays day[,day]

Possible values are Mon,Tue,Wed,Thu,Fri,Sat,Sun

--kerneltz:使用内核上的时区,而非默认的UTC;

定义本机的web服务在每周末下午的14:30到18:30不允许192.168.32.145主机访问

iptables -A INPUT -s 192.168.32.163 -d 192.168.32.144 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP

未使用time扩展设置防火墙规则时客户端可以正常网站

客户端可以正常访问web服务

添加time扩展访问规则


实验5:

connlimit扩展

根据每客户端IP做并发连接数量匹配;

--connlimit-upto n:连接的数量小于等于n时匹配;

--connlimit-above n:连接的数量大于n时匹配;

我们要求每个客户端IP最多能够连接两个

iptables -A INPUT -d 192.168.32.144 -p tcp --dport 21 -m connlimit --connlimit-above 2 -j REJECT

实验6:

limit扩展

基于收发报文的速率做匹配;

令牌桶过滤器:

--limit rate[/second | /minute| /hour| /day]

--limit-burst number

每分钟只允许其它主机对本主机进行ping操作三次,峰值最大为5

iptables -I INPUT -d 192.168.32.144 -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j ACCEPT 满足条件执行放行策略

iptables -I INPUT 2 -p icmp -j REJECT 加一条拒绝规则

设置规则之前:

添加规则:


实验7:

state扩展

根据"连接追踪机制"去检查连接的状态;跟TCP协议没有关系

如何判断从本机发出的一个连接是对别人请求的响应还是自己发起的请求?

可以通过本机记录的conntrack追踪结果,在有效时间内,可以查看到每个对本机的请求连接跟本机反馈的结果的之间的对应关系

conntrack机制:追踪本机上的请求和响应之间关系;状态有如下几种;

NEW:新发出请求;连接追踪模板中不存在此连接的信息条目,因此,将其识别为第一次发出的请求;

ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态;

RELATED:相关联的连接;如ftp协议中的命令连接与书籍之间的关系;

INVALID:无效的连接;

UNTRACKEN:为进行追踪的连接;

正常情况下,服务器是不会通过80端口主动发起连接请求,22号端口正常情况下也是不会主动发起连接请求

允许NEW请求连接进来

iptables -A INPUT -d 192.168.32.144 -p tcp --dport 80 -m state --state NEW -j ACCEPT

INPUT链放行NEW,ESTABLISHED

iptables -A INPUT -d 192.168.32.144 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT

OUTPUT链放行ESTABLISHED

iptables -A OUTPUT -s 192.168.32.144 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT

更改默认策略全部为DROP:

iptables -P INPUT DROP

iptables -P OUTPUT DROP

iptables -P FORWARD DROP

客户端可以正常访问:


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

/proc/sys/net/nf_contrack_max

已经追踪到的并记录下来的连接:

/proc/net/nf_conntrack

不同的协议的连续追踪时长

/proc/sys/net/netfilter/

iptables的链接跟踪最大容量为/proc/sys/net/ipv4/ip_conntrack_max,链接碰到各种状态的超时后就会从表中删除;当模板满载时,后续的连接可能会超时

解决方法一般有两个:

(1)加大nf_conntrack_max值

vim /etc/sysctl.conf

net.ipv4.nf_conntrack_max=393216

net.ipv4.netfilter.nf_conntrack_max=393216

(2)降低nf_conntrack timeout时间

vim /etc/sysctl.conf

net.ipv4.netfilter.nf_conntrack_tcp_timeout_established=300

net.ipv4.netfilter.nf_conntrack_tcp_timeout_time_wait=120

net.ipv4.netfilter.nf_conntrack_tcp_timeout_close_wait=60

net.ipv4.netfilter.nf_conntrack_tcp_timeout_fin_wait=120

实验8:

如何开放被动模式的ftp

ftp主动链接模式。客户端发起请求连接服务器21号端口,服务器端进程会通过本机的20号端口主动去连接客户端随机端口+1的端口(新数据请求),客户端有可能存在防火墙,

ftp被动连接模式。客户端请服务器发起数据下载请求,服务器端随机使用一个端口响应,

服务器端判断数据连接是不是与此前的某个命令连接有关联关系, 只要数据连与此前的命令连接有关联关系,防火墙就放行,不从端口放行,以转态为标准。

先复制一个文件到/var/ftp/pub

cp /etc/issue /var/ftp/pub/

防火墙初始状态:

因为要使用远程连接功能,所以放行了22号端口

客户端使用lftp连接发现连接失败

手动记载连接追踪的模块

modprobe nf_conntrack_ftp

设置防火墙规则放行命令连接:

iptables -A INPUT -d 192.168.32.144 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -s 192.168.32.144 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT

放行数据连接:

iptables -A INPUT -d 192.168.32.144 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -s 192.168.32.144 -p tcp -m state --state ESTABLISHED -j ACCEPT

此时继续访问可以看到


实验9:

规则优化:

服务器规则优化设定:任何不允许的访问,应该在请求到达时给予拒绝;

(1)可安全放行所有入站的状态为ESTABLISHED状态连接;

(2)可安全放行所有出站的状态为ESTABLISHED状态连接;

(3)谨慎放行入站的新请求;

(4)有特殊目的的限制访问功能,要于芳心规则之前加以决绝;

iptables -I INPUT -d 192.168.32.144 -m state --state ESTABLISHED -j ACCEPT

iptables -I INPUT 2 -d 192.168.32.144 -p tcp -m multiport --dport 21,22,80 -m state --state NEW -j ACCEPT

iptables -I INPUT 3 -d 192.168.32.144 -p tcp -m state --state RELATED -j ACCEPT

iptables -D INPUT 4

iptables -D INPUT 4

iptables -D INPUT 4

出站规则设定

iptables -I OUTPUT -s 192.168.32.144 -m state --state ESTABLISHED -j ACCEPT

iptables -D OUTPUT 2

iptables -D OUTPUT 2

iptables -D OUTPUT 2

限制掉web服务反馈的请求中含有have的页面

iptables -I OUTPUT -m string --algo kmp --string "have" -j REJECT

备注:其实在前端的web服务异常繁忙的服务器上的使用state连接追踪功能是不明智的,在讲到集群负载的时候我们将重点讨论这个问题















0