iptables的拓展匹配:
icmp模块的使用方法:
iptables -t filter -I INPUT -p icmp -m icmp --icmp-type echo-reply -j ACCEPT
说明:回应
我能ping通别人,别人ping不通我。
iprange模块的作用:
iptables -t filter -I INPUT -m iprange --src-range 192.168.2.20-192.168.2.100 -j REJECT
说明:拒绝这个网段的IP地址进行访问。
配置一段IP地址能够访问或者拒绝,不让所有的IP地址能够访问到你的服务器,因为局域网内发起攻击是很容易的。
我们使用的是REJECT动作,那么我们通过 ssh端口可以看到Connection refused的连接拒绝的返回信息。如果是DROP,就直接丢弃,没有任何返回信息。
multiport模块的作用:
iptables -t filter -I INPUT -p tcp -m multiport --dports 20,21,22,25,80,110 -j ACCEPT
配置端口的时候,不建议一个个去开端口。实际生产环境中,不建议开这么多端口,能不开放端口就不开放端口,只要开放端口,就会带来风险。
邮件服务器专门添加25端口和110端口,另外再加上22端口。
我开端口,让别人来访问。就要使用filter表,使用INPUT链。--dports: 目的是我的端口。
写端口加协议。22/tcp -p tcp --dport 22
state模块的作用:
-m state
NEW 新生态
ESTABLISHED 连接态
RELATED 衍生态:已经跟别人建立了连接,那么衍生的连接都能通过。
INVALID 无效态
iptables -t filter -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
使用状态防火墙规则,放行本机ftp服务(被动模式)
iptables -t filter -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -I INPUT -p tcp --dport 20,21 -j ACCEPT
iptables -t filter -A INPUT -j REJECT
modprobe nf_conntrack_ftp
vim /etc/sysconfig/iptables-config
IPTABLES_MODULES="nf_conntrack_ftp"
小结:
该内核模块的作用是在连接数据端口的时候,将第一次握手的数据包状态由原来的NEW识别成RELATED。
-m tos //ip协议头部 type of service 服务类型
iptables -F
tcpdump -i eth0 -nn port 22 -vvv # 抓取远程从主机访问本机ssh数据包,观察TOS值
tcpdump -i eth0 -nn port 22 -vvv # 抓取远程从本机rsync或scp复制文件,观察TOS值
小结:都是通过22/tcp, 但可以通过IP报文中的TOS来区分应用。
ssh: tos 0x0 0x10
scp: tos 0x0 0x8
rsync: tos 0x0 0x8
iptables -m tos -h
iptables -t filter -A INPUT -p tcp --dport 22 -m tos --tos 0x10 -j REJECT
iptables -t filter -A INPUT -j REJECT
说明:ssh都不让用了。只能使用scp和rsync应用。我们入侵Linux,登录,提权。
-m tcp
按TCP标记匹配:
Flags are:SYN ACK FIN RST URG PSH ALL NONE
iptables -t filter -A INPUT -p tcp -m tcp --tcp-flags SYN,ACK,FIN,RST SYN --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --syn --dport 80 -j ACCEPT
说明:
--tcp-flags SYN, ACK, FIN, RST SYN 检查四个标记位SYN,ACK,FIN,RST 但是只有SYN标记位才匹配。我只同意SYN。
则允许三次握手中的第一次握手,等价于--syn。
能够保证我们网站的安全性。
-m limit
iptables -F
实验:从客户端ping本机,观察序列号。
iptables -t filter -A INPUT -p tcp --syn --dport 80 -m limit --limit 20/minute -j ACCEPT
iptables -t filter -A INPUT -j REJECT
说明:
1)访问网站,第一次握手建立连接的,每分钟20次。间接拦截DDos攻击。
2)使用kali系统,可以模拟一分钟20次的连接。
进入本机INPUT链的ICMP,如果匹配第一条则放行,不匹配的将被第二条拒绝,默认前5个不限制。
16/second
16/minute
16/hour
16/day
iptables -t filter -A INPUT -p tcp --syn --dport 80 -m limit --limit 50/second -j ACCEPT
iptables -t filter -A INPUT -j REJECT
limit是用来限制用户访问的。
-m connlimit 限制同一个IP最大连接数:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --syn --dport 22 -m connlimit ! --connlimit-above 2 -j ACCEPT
//仅允许每个客户端有两个SSH连接
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit !--connlimit-above 100 -j ACCEPT
//仅允许每个客户端有100个requests(请求报文)
iptables -A INPUT -j REJECT
-m time模块:
iptables -A INPUT -m time --timestart 12:00 --timestop 13:00 -j ACCEPT
iptables -A INPUT -p tcp --syn --dport 22 -m time --timestart 12:00 --timestop 13:00 -j ACCEPT
iptables -A INPUT -j REJECT
--timestart:开始时间
--timestop: 结束时间
说明在任何协议都支持time模块,都可以增加这个时间的限制功能。--syn发起连接的内容。
-m comment 模块:说明备注的意思。
iptables -A INPUT -s 192.168.17.109 -m comment --comment "cloud class" -j REJECT
规则配置多了,容易忘掉,加这个备注还是有作用的。
-m mark模块:
iptables -t filter -A INPUT -m mark --mark 2 -j REJECT
mark是用来做标记的。目前我们没有使用mangle表。