Linux防火墙实战:iptables配置与NAT地址转换

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
web1Web服务器: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的三大核心功能:

  1. 主机防护:通过 INPUT 链,以“默认拒绝”策略构建了主机自身的防火墙。

  2. 网络管控:通过 FORWARD 链,实现了对通过网关流量的精细化访问控制。

  3. 地址转换:通过 nat 表的 POSTROUTING 链配置 MASQUERADE,实现了SNAT,有效隐藏了内部网络拓扑。

请牢记,使用 iptables-save 命令保存配置是保证规则持久化的关键步骤。理解“表、链、规则”的工作流程,是灵活运用iptables解决各种网络需求的基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值