本小结重点讲解一下iptables的显示扩展规则设置
成都创新互联是一家专业提供川汇企业网站建设,专注与成都网站制作、成都做网站、外贸营销网站建设、H5开发、小程序制作等业务。10年已为川汇众多企业、政府机构等服务。创新互联专业网站设计公司优惠进行中。
显示扩展:必须显式地指明使用的扩展模块进行扩展;
使用帮助:
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连接追踪功能是不明智的,在讲到集群负载的时候我们将重点讨论这个问题