iptables 是 Linux 系统上用于配置 IPv4 数据包过滤规则的工具。它可以用于设置和管理防火墙规则,网络地址转换(NAT),网络地址端口转换(PAT)等。iptables 是 Linux 内核中 Netfilter 框架的一部分。
以下是 iptables 的一些基本概念和常见用法:
基本概念
表(Table): iptables 使用不同的表来组织规则,包括 filter、nat、mangle、raw 等。
链(Chain): 每个表包含一组链,如 INPUT、OUTPUT、FORWARD 等,用于指定规则应用于输入、输出、转发等数据包。
规则(Rule): 规则是由匹配条件和相应的动作组成的。如果数据包满足规则中定义的匹配条件,将执行规则中定义的动作。
常用命令和选项
查看规则:
iptables -L # 列出所有规则
iptables -L -n -v # 列出规则,显示 IP 地址和详细信息
清除规则:
iptables -F # 清除所有规则
添加规则:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允许 SSH 连接
删除规则:
iptables -D INPUT -p tcp --dport 22 -j ACCEPT # 删除指定规则
保存规则:
service iptables save # 保存规则到配置文件
service iptables restart # 重新加载规则
规则示例
允许所有本地流量:
iptables -A INPUT -i lo -j ACCEPT
允许已建立的连接:
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
允许SSH连接:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
允许HTTP连接:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
拒绝所有其他连接:
iptables -A INPUT -j DROP
NAT(网络地址转换)
iptables 还可以用于配置网络地址转换,允许在不同网络之间转发数据包。
开启IP转发:
sysctl -w net.ipv4.ip_forward=1
配置端口转发:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.2:80
连接跟踪和状态
iptables 具有连接跟踪和状态机制,用于跟踪网络连接的状态,这在设置规则时非常有用。
查看连接跟踪信息:
cat /proc/net/nf_conntrack
允许相关和已建立的连接:
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
高级匹配条件和匹配模块
iptables 提供了多种匹配条件和匹配模块,可以根据需要使用。例如:
匹配源和目标 IP 地址:
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.2 -j ACCEPT
使用 --protocol 选项匹配协议:
iptables -A INPUT --protocol tcp --dport 22 -j ACCEPT
使用 --mac-source 匹配源 MAC 地址:
iptables -A INPUT --protocol tcp --dport 80 --mac-source 00:11:22:33:44:55 -j ACCEPT
防止DDoS攻击
使用 iptables 可以实施一些策略来减缓或阻止 DDoS(分布式拒绝服务)攻击。
限制连接数:
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 50 -j DROP
限制请求速率:
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
这些规则可以帮助减轻来自大量请求的负载,并提高系统对恶意攻击的抵抗力。
注意事项:
在配置 iptables 规则时,确保不要阻断自己的远程连接,以防远程连接被中断。
在生产环境中修改 iptables 规则时要谨慎,可以在测试环境中进行验证。
在某些发行版上,防火墙规则的配置文件可能位于 /etc/sysconfig/iptables 或 /etc/iptables/rules.v4。
使用 iptables-save 命令可以将当前规则保存到文件,使用 iptables-restore 命令可以从文件加载规则。