iptables是Linux内核中功能强大的网络包过滤和修改工具,是构建系统防火墙和实现网络地址转换(NAT)的核心。理解其工作原理,是掌握Linux网络管理和安全的基础。
第一部分:核心概念与环境准备
1. 理解核心概念
你可以把iptables想象成一个高效的“安保检查系统”。这个系统有不同的“部门”(称为表,Table),每个部门负责不同工作。我们最常打交道的是两个部门:
-
filter表:负责“安检”,决定哪些数据包可以放行、哪些需要拦截,这是它的默认工作模式。
-
nat表:负责“换装易容”,修改数据包的源或目标地址,实现地址转换。
数据包在流经这个系统时,会经过几个固定的“检查站”(称为链,Chain)。根据数据包的流向,主要会进入以下三个检查站:
-
INPUT站:处理目的地就是本台机器的数据包。
-
OUTPUT站:处理从本台机器发出的数据包。
-
FORWARD站:处理只是途经本台机器,需要被转发到其他机器的数据包。
在每个“检查站”里,有一份按顺序排列的“检查清单”(即规则,Rules)。当一个数据包到达时,保安会从上到下逐条核对清单。一旦找到匹配的条件,就立即执行对应的动作(如放行或拒绝),并停止继续核对。如果所有规则都不匹配,则执行该检查站的默认规定(默认策略)。
2. 实验环境与目标
本次实验需要三台已经配置好网络、可以相互通信的Linux主机。我们将配置中间的主机作为防火墙和网关,实现以下目标:
-
控制对本机的访问(配置INPUT链)。
-
控制过境流量(配置FORWARD链)。
-
隐藏内部网络结构(配置NAT地址转换)。
实验拓扑如下:
| 主机名 | IP地址与角色 |
|---|---|
client | 内网客户端:192.168.88.10, 网关指向 192.168.88.11 |
node1 | 防火墙/网关:内网卡 192.168.88.11, 外网卡 192.168.99.11 |
web1 | Web服务器:192.168.99.100, 网关指向 192.168.99.11 |
首要步骤:在作为网关的 node1 主机上,必须开启Linux内核的IP转发功能,否则它无法帮其他机器传递数据包。
# 在 node1 主机上执行 echo ‘net.ipv4.ip_forward = 1’ >> /etc/sysctl.conf sysctl -p
完成后,请先确认 client 可以 ping 通 web1,确保基础网络通畅。
第二部分:配置INPUT链(守卫本机大门)
首先,我们配置 node1 自身的防火墙,采取“默认拒绝,明确允许”的严格策略。
1. 设置默认策略并允许必要通信
# 1. 设置INPUT链的默认策略为DROP(拒绝所有入站连接) iptables -P INPUT DROP # 2. 允许本地环回接口(lo)的通信,许多系统服务依赖于此 iptables -A INPUT -i lo -j ACCEPT # 3. 关键规则:允许已建立或相关联的连接的数据包返回 # 这确保了由本机主动发起的对话能得到回应 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
2. 放行特定服务
现在,我们需要有选择地打开一些“门”。
# 4. 允许内部网络(192.168.88.0/24)通过SSH管理本机 iptables -I INPUT 1 -s 192.168.88.0/24 -p tcp --dport 22 -j ACCEPT # 5. 允许任何人访问本机的Web服务(用于后续测试) # 先安装并启动一个简单的Web服务 dnf install -y httpd echo “防火墙节点测试页” > /var/www/html/index.html systemctl start httpd # 添加防火墙规则 iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 6. 查看并确认已设置的规则(--line-numbers 显示行号便于管理) iptables -nL INPUT --line-numbers
此时,client 主机可以成功SSH登录到 node1,也能访问 node1 上的网站,但无法ping通它,因为我们还没有允许ICMP协议。
3. 规则管理与持久化
iptables的规则是即时生效但默认非永久的。
# 在INPUT链顶部插入一条规则,拒绝来自特定IP的ping请求 iptables -I INPUT -s 192.168.88.254 -p icmp -j REJECT # 如果想删除一条规则,可以使用行号(假设删除第1行) # iptables -D INPUT 1 # 最重要的一步:保存当前规则,使其在重启后依然生效 iptables-save > /etc/sysconfig/iptables systemctl enable iptables
第三部分:配置FORWARD链(管控过境流量)
接下来,我们把 node1 配置成真正的防火墙,精细控制 client 和 web1 之间的通信。
1. 准备后端服务
先在 web1 上准备好测试用的Web服务。
# 在 web1 主机上执行 dnf install -y httpd echo “来自后端Web服务器的测试页” > /var/www/html/index.html systemctl start httpd
2. 配置转发规则
在 node1 上,我们对 FORWARD 链进行配置。
# 1. 设置FORWARD链的默认策略为DROP,严格管控 iptables -P FORWARD DROP # 2. 允许从服务器区(web1)返回给客户端区(client)的数据包 # 这对于客户端发起的请求能收到回应至关重要 iptables -A FORWARD -s 192.168.99.0/24 -d 192.168.88.0/24 -j ACCEPT # 3. 允许客户端区发起对服务器区的特定访问 # 允许ping (ICMP协议) iptables -A FORWARD -s 192.168.88.0/24 -d 192.168.99.0/24 -p icmp -j ACCEPT # 允许访问SSH、HTTP、HTTPS及一个端口范围(使用multiport模块) iptables -A FORWARD -s 192.168.88.0/24 -d 192.168.99.0/24 -p tcp -m multiport --dport 22,80,443,100:130 -j ACCEPT
现在,client 应该可以 ping 通 web1,并且能访问 web1 上的网站了。
# 在 client 主机上验证 ping -c2 192.168.99.100 curl http://192.168.99.100/
第四部分:配置NAT(网络地址转换)
NAT 可以将私有地址转换为公网地址,常用于让内网机器访问互联网,同时也能隐藏内部网络结构。这里我们配置 SNAT(源地址转换),让 web1 认为访问来自网关 node1,而非真实的 client。
1. 观察转换前的效果
# 在 web1 上,打开一个终端实时监控访问日志 tail -f /var/log/httpd/access_log # 在 client 上,访问web1的网站 curl http://192.168.99.100/
此时,web1 的日志会记录下真实的客户端IP:192.168.88.10。
2. 配置SNAT(源地址伪装)
在网关 node1 上,我们将来自客户端网段的数据包源IP,伪装成网关自己的外网口IP。
# 在 nat 表的 POSTROUTING 链(路由后处理,适合做SNAT)添加规则 # 使用 MASQUERADE(动态伪装),适用于网关IP可能变化的场景(如拨号上网) iptables -t nat -A POSTROUTING -s 192.168.88.0/24 -j MASQUERADE # 查看nat表的规则 iptables -t nat -nL
说明:如果网关的外网IP是固定的,也可以使用 SNAT --to-source [IP地址] 进行静态转换。
3. 验证NAT效果
# 再次在 client 上访问 web1 curl http://192.168.99.100/
现在,观察 web1 上的访问日志,你会发现来源IP变成了 192.168.99.11(即 node1 的地址),这说明源地址转换已经成功,内部客户端的真实IP被隐藏了。
总结
通过本次实验,我们系统性地实践了iptables的三大核心功能:
-
主机防护:通过
INPUT链,以“默认拒绝”策略构建了主机自身的防火墙。 -
网络管控:通过
FORWARD链,实现了对通过网关流量的精细化访问控制。 -
地址转换:通过
nat表的POSTROUTING链配置MASQUERADE,实现了SNAT,有效隐藏了内部网络拓扑。
请牢记,使用 iptables-save 命令保存配置是保证规则持久化的关键步骤。理解“表、链、规则”的工作流程,是灵活运用iptables解决各种网络需求的基础。

4464

被折叠的 条评论
为什么被折叠?



