iptables传输数据包的过程:
1. 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。
2. 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。
3. 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。
第一部分:常用显示模块介绍
注意:本文所有实例都是在默认规则为DROP下。
# 开放ssh服务端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --sport 22 -j ACCEPT
# 修改默认规则为DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP
1. multiport: 多端口匹配
可用于匹配非连续或连续端口;最多指定15个端口;
实例
iptables -A INPUT -p tcp -m multiport --dport 22,80 -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --sport 22,80 -j ACCEPT
2. iprange: 匹配指定范围内的地址
匹配一段连续的地址而非整个网络时有用
实例:
iptables -A INPUT -p tcp -m iprange --src-range 192.168.118.0-192.168.118.60 --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp -m iprange --dst-range 192.168.118.0-192.168.118.60 --sport 22 -j ACCEPT
3. string: 字符串匹配,能够检测报文应用层中的字符串
字符匹配检查高效算法:kmp, bm
能够屏蔽非法字符
实例:
# 注意该条规则需要添加到OUTPUT链,当服务端返回数据报文检查到有关键字"sex"时,则丢弃该报文,可用于web敏感词过滤
iptables -A OUTPUT -p tcp --dport 80 -m string --algo kmp --string "sex" -j DROP
4. connlimit: 连接数限制,对每IP所能够发起并发连接数做限制;
实例:
# 默认INPUT 为 DROP. 每个ip对ssh服务的访问最大为3个并发连接,超过则丢弃
iptables -A INPUT -p tcp --dport 22 -m connlimit ! --connlimit-above 3 -j ACCEPT
5. limit: 速率限制
limit-burst: 设置默认阀值
# 默认放行10个,当到达limit-burst阀值后,平均6秒放行1个
iptables -A INPUT -p icmp -m limit --limit 10/minute --limit-burst 10 -j ACCEPT
6. state: 状态检查
连接追踪中的状态:
NEW: 新建立一个会话
ESTABLISHED:已建立的连接
RELATED: 有关联关系的连接
INVALID: 无法识别的连接
# 放行ssh的首次连接状态
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
第二部分:编写常用规则
编写iptables注意:做默认规则drop的时候一定要先开放ssh端口,否则就杯具了。
# 清空自建规则
iptables -F
iptables -X
# 在INPUT链上,tcp为RELATED,ESTABLISHED的数据包为放行
iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
# 在INPUT链上,tcp为NEW而且端口为22,80的数据包放行
iptables -A INPUT -p tcp -m state --state NEW -m multiport 22,80 -j ACCEPT
# 在OUTPUT链上,tcp为ESTABLISHED都放行
iptables -A OUTPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
# INPUT链和OUTPUT链默认规则都为DROP状态
iptables -P INPUT DROP
iptables -P OUTPUT DROP
# 打开本地回环地址
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 允许服务器ping对端主机而不允许对端主机ping服务器
iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
# 开放主机对dns的访问
iptables -A INPUT -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
第三部分:针对特定的服务定制相关规则
1. 对ssh进行管控,1小时内最多发起5个连接,防止黑客暴力破解ssh
# 清空默认规则
iptables -F
iptables -X
# 添加已建立的连接规则
iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
# 设置默认规则
iptables -P INPUT DROP
iptables -P OUTPUT DROP
# 设置iptables记录匹配ssh规则
iptables -I INPUT 2 -p tcp --syn -m state --state NEW -j LOG --log-level 5 --log-prefix "[SSH Login]:"
# 使用recent显示模块限定每小时最多匹配到5次,超过则丢弃。
iptables -A INPUT -p tcp --syn -m state --state NEW -m recent --name OPENSSH --update --seconds 3600 --hitcount 5 -j DROP
iptables -A INPUT -p tcp --syn -m state --state NEW -m recent --name OPENSSH --set -j ACCEPT
2. 对web服务进行并发管控,防止Ddos
# 清空默认规则
iptables -F
iptables -X
# 添加已建立的连接规则
iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
# 设置默认规则
iptables -P INPUT DROP
iptables -P OUTPUT DROP