在Linux系统中,防火墙如同大厦的门禁系统,决定谁能进出、如何进出。iptables是管理员手中的“门禁设置软件”,通过它可以轻松配置规则,控制网络流量。无论是保护服务器、实现地址转换(NAT),还是管理复杂的企业网络,iptables都凭借其灵活性和强大功能,成为Linux防火墙的经典工具。尽管新工具如nftables逐渐兴起,iptables的成熟生态和广泛兼容性使其依然不可或缺。本文将以门禁系统的比喻,深入浅出地讲解iptables的原理、配置方法和高级应用,帮助读者轻松掌握这一核心工具。欲了解Linux防火墙的整体背景,可回顾Linux防火墙概述。
想象一座大楼,入口和出口装有智能门禁控制器(Linux内核的Netfilter框架),决定哪些人可以进出。iptables就像保安室里的电脑软件,管理员用它设置门禁卡的权限,比如“张三能进A门但不能进B门”。这些规则上传到门禁控制器后,实际的开门或拒绝动作由控制器(Netfilter)完成。
因此,iptables并不是防火墙本身,而是用户侧的工具,用于配置Netfilter框架中的规则。Netfilter在内核中处理数据包的过滤、修改和转发,而iptables提供直观的命令行接口,让管理员轻松定义这些规则。这种分工就像门禁软件与控制器配合,既用户友好又高效。
iptables的“门禁规则”可以实现以下功能:
这些功能让iptables适用于从单机保护到复杂网络管理的各种场景。
就像门禁系统有不同的门和规则,iptables通过“表”、“链”和“规则”组织数据包处理逻辑。
大楼的门禁系统可能有多个功能模块,比如验证身份、记录日志或修改权限。iptables使用四张“表”来实现不同功能:
大楼有多个出入口(如前门、后门、电梯),每个入口有特定的检查流程。iptables的“链”就是数据包的检查点,分为五种内置链:
管理员还可以创建自定义链,就像为特定部门设置专用门禁。例如:
sudo iptables -N HTTP_TRAFFIC
sudo iptables -A HTTP_TRAFFIC -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j HTTP_TRAFFIC
这就像为“HTTP部门”创建专用通道,只允许80端口的访客进入。
每条规则是门禁系统的一条指令,告诉控制器如何处理“访客”。规则由匹配条件(谁)和目标动作(做什么)组成。例如:
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
-p tcp --dport 22
表示“持TCP协议、目标22端口门卡的访客”。-j ACCEPT
表示“开门放行”。匹配条件就像门禁系统扫描卡的属性:
-p
:协议(如tcp、udp、icmp),相当于卡的类型。-s/-d
:源/目标IP,相当于访客的身份ID。--sport/--dport
:源/目标端口,相当于进入的门号。-m
模块):
-m state
:检查访客状态(首次进入、已验证)。-m multiport
:匹配多个门号(如80、443端口)。-m string
:检查访客携带的“包裹”(如阻止含“malware”的数据包)。-m limit
:限制访客频率,防止“拥挤”。示例:阻止携带“malware”标签的访客:
sudo iptables -A INPUT -m string --string "malware" --algo bm -j DROP
目标动作决定如何处理访客:
示例:给HTTP访客贴标签:
sudo iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 1
数据包在系统中就像访客在大楼中移动:
就像门禁系统在不同入口检查访客,iptables在不同链上应用规则,提供灵活控制。
以下通过10个实践任务展示如何用iptables设置“门禁规则”,假设在一台CentOS 8虚拟机(IP:192.168.1.10)上操作。
启动Web服务器:
sudo dnf install -y httpd
sudo systemctl start httpd
sudo sed -i 's/Listen 80/Listen 8080/' /etc/httpd/conf/httpd.conf
sudo systemctl restart httpd
阻止8080端口(锁住HTTP门):
sudo iptables -A INPUT -p tcp --dport 8080 -j DROP
测试:从另一主机访问http://192.168.1.10:8080
,应无响应,相当于门禁拒绝。
修改规则(打开HTTP门):
sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
测试:再次访问,应看到Web页面。
阻止192.168.1.100(禁止特定访客):
sudo iptables -A INPUT -s 192.168.1.100 -j DROP
测试:从192.168.1.100访问,应失败。
允许192.168.1.100(VIP访客):
sudo iptables -A INPUT -s 192.168.1.100 -j ACCEPT
sudo iptables -A INPUT -j DROP
测试:仅192.168.1.100可访问。
阻止ping(关闭ping通道):
sudo iptables -A INPUT -p icmp -j DROP
测试:从另一主机ping 192.168.1.10,应无响应。
允许ping:
sudo iptables -A INPUT -p icmp -j ACCEPT
测试:ping恢复正常。
创建HTTP专用通道:
sudo iptables -N web_traffic
添加规则:
sudo iptables -A web_traffic -p tcp --dport 8080 -j ACCEPT
将HTTP流量引导到专用通道:
sudo iptables -A INPUT -p tcp --dport 8080 -j web_traffic
测试:访问8080端口,应通过。
查看规则编号:
sudo iptables -L INPUT --line-numbers
删除第2条规则:
sudo iptables -D INPUT 2
sudo iptables -L -v -n
输出显示所有表、链和规则详情,如同门禁系统的权限列表。就像门禁系统记录访客是否已验证,iptables通过-m state
模块利用Netfilter的连接跟踪(conntrack)功能,区分“首次进入”(NEW)、“已验证”(ESTABLISHED)、“相关访客”(RELATED)或“可疑访客”(INVALID)。这些记录存储在/proc/net/nf_conntrack
中。
只允许新SSH连接和已验证的会话:
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -j DROP
相当于“允许持SSH门卡的新访客和已进入的访客,其他人一律拒绝”。
限制每分钟新SSH连接为10次:
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j DROP
如同限制每分钟刷卡次数,防止门禁被频繁敲门。
若访客无法进入,检查记录:
sudo cat /proc/net/nf_conntrack | grep 22
若记录溢出,调整最大访客数:
sudo sysctl -w net.netfilter.nf_conntrack_max=262144
NAT就像给访客换临时身份卡:
网关(eth0:203.0.113.1,eth1:192.168.1.0/24)为内网提供互联网访问:
sudo sysctl -w net.ipv4.ip_forward=1
sudo echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
如同给内网访客发公网通行证。
将外部80端口请求转发到内网Web服务器(192.168.1.20:8080):
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.20:8080
sudo iptables -A FORWARD -p tcp -d 192.168.1.20 --dport 8080 -j ACCEPT
如同将前门访客引导到内部办公室。
将流量随机分到两台服务器:
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -m statistic --mode random --probability 0.5 -j DNAT --to-destination 192.168.1.20:8080
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.21:8080
sudo iptables -A FORWARD -p tcp -d 192.168.1.20 --dport 8080 -j ACCEPT
sudo iptables -A FORWARD -p tcp -d 192.168.1.21 --dport 8080 -j ACCEPT
如同将访客随机分配到两个接待室。
记录被拒绝的访客:
sudo iptables -A INPUT -j LOG --log-prefix "DROPPED: " --log-level 4
sudo iptables -A INPUT -j DROP
配置rsyslog单独存储日志:
echo "kern.warning /var/log/firewall.log" >> /etc/rsyslog.conf
sudo systemctl restart rsyslog
限制日志频率:
sudo iptables -A INPUT -m limit --limit 5/minute -j LOG --log-prefix "DROPPED: "
保存门禁规则:
sudo iptables-save > /etc/sysconfig/iptables
恢复规则:
sudo iptables-restore < /etc/sysconfig/iptables
-m string
会增加负担。sudo sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=300
场景:Web服务器(192.168.1.10:8080)仅允许内网(192.168.1.0/24)访客,记录外部尝试。
配置:
sudo iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 8080 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 8080 -j LOG --log-prefix "WEB_ATTEMPT: "
sudo iptables -A INPUT -p tcp --dport 8080 -j DROP
场景:网关(eth0:203.0.113.1,eth1:192.168.1.1)为内网提供互联网访问,并将外部流量均衡到两台Web服务器(192.168.1.20、192.168.1.21)。
配置:
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -m statistic --mode random --probability 0.5 -j DNAT --to-destination 192.168.1.20:8080
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.21:8080
sudo iptables -A FORWARD -p tcp -d 192.168.1.20 --dport 8080 -j ACCEPT
sudo iptables -A FORWARD -p tcp -d 192.168.1.21 --dport 8080 -j ACCEPT
iptables就像大楼的门禁设置软件,通过简单的命令为Netfilter框架配置规则,控制网络流量的“进出”。从基本过滤到高级NAT和状态跟踪,iptables以其灵活性和强大功能,成为Linux防火墙的核心工具。本文通过门禁系统的比喻和实践案例,展示了iptables的配置方法和应用场景。尽管nftables等新工具逐渐兴起,iptables的广泛兼容性和成熟生态使其仍是必备技能。读者可结合实际需求,灵活应用iptables打造安全的网络环境。