在现代网络架构中,使用通用 Linux 主机作为路由器是一种灵活且成本高效的解决方案。无论是构建家庭网关、企业边缘防火墙,还是实验室环境的数据包转发节点,掌握 Linux 内核的网络参数配置与防火墙规则编写都至关重要。本文将聚焦于将一台标准 Linux 主机打造成具备 NAT(网络地址转换)与数据包转发功能的路由器,涵盖从内核参数到现代 nftables 框架的全流程配置。
一、启用内核 IP 转发功能
Linux 系统默认关闭了数据包转发功能,这是为了满足作为普通主机的安全性。要使 Linux 具备路由能力,首先需要启用内核的 IP 转发参数。
1.1 运行时启用
对于 IPv4 转发,最核心的参数是 net.ipv4.ip_forward。可以通过 sysctl 命令直接修改,无需重启系统:
sysctl -w net.ipv4.ip_forward=1
这条命令会立即生效,但系统重启后会失效。如果需要同时支持 IPv6,则需额外配置 net.ipv6.conf.all.forwarding=1。
1.2 持久化配置
为了使配置在重启后依然生效,需要将其写入系统控制文件。建议在 /etc/sysctl.d/ 目录下创建独立的配置文件,例如 /etc/sysctl.d/99-router.conf:
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/99-router.conf
sysctl --system
通过 --system 参数,系统会重新加载 /etc/sysctl.d/ 下的所有配置。确认配置已生效后,可使用 sysctl net.ipv4.ip_forward 进行验证。
二、选择防火墙框架:iptables 与 nftables
配置好内核转发后,下一步是编写防火墙规则来处理数据包的转发(FORWARD)与网络地址转换(NAT)。目前主流的工具有传统的 iptables 和现代的 nftables。
2.1 历史演进与选择
长期以来,iptables 是 Linux 防火墙的代名词。然而,随着网络环境日益复杂(尤其是 IPv4/IPv6 双栈的普及),iptables 面临着规则冗余、维护困难、性能瓶颈等问题。自 2020 年起,大多数主流 Linux 发行版(如 Debian 12、Ubuntu 22.04、Fedora)已将 nftables 设为默认防火墙工具。
为什么推荐 nftables?
- 统一框架:使用单一的
nft工具即可管理 IPv4、IPv6、ARP 等所有协议族,告别iptables、ip6tables、arptables分而治之的时代。 - 高性能:利用 sets 和 maps 数据结构,在大规模规则集下拥有比 iptables 更优的查找性能。
- 简洁语法:其语法更接近人类阅读习惯,支持原子性规则更新,避免了加载规则时的空窗期安全隐患。
本文将重点演示 nftables 的配置,并提供 iptables 的等价命令作为参考。
三、实战配置:构建简单的 NAT 路由器
假设一个典型场景:路由器拥有两张网卡,eth0 接入公网(WAN),eth1 接入内部局域网(LAN),且内网网段为 192.168.100.0/24。我们需要实现:
- 内网设备通过 NAT 访问公网(MASQUERADE)。
- 允许公网访问内网特定服务(如端口转发)。
3.1 使用 nftables 进行配置
nftables 使用表(table)、链(chain)和规则(rule)的层级结构。我们可以创建一个统一的 inet 表来处理 IPv4 和 IPv6。
步骤一:创建表与基础链
# 创建一个 filter 表(如果不存在),并使用 inet 家族同时覆盖 IPv4 和 IPv6
nft add table inet filter
# 在 filter 表中定义 FORWARD 链(处理转发的数据包)
nft add chain inet filter forward { type filter hook forward priority filter; policy drop; }
注意:上面直接设置了默认策略为 drop(拒绝),这是最安全的设计。随后我们再逐个放行需要的流量。
步骤二:配置 NAT(伪装)
NAT(网络地址转换)通常在 nat 表的 postrouting 链中配置。对于出口流量的伪装(MASQUERADE),Linux 内核会自动获取出口接口的公网 IP,无需关心其具体地址。
# 创建 nat 表
nft add table ip nat
# 在 POSTROUTING 链上对内网流量进行 MASQUERADE
# 假设内网网段为 192.168.100.0/24,WAN 接口为 eth0
nft add rule ip nat postrouting ip saddr 192.168.100.0/24 oifname "eth0" masquerade
步骤三:配置转发规则(FORWARD)
仅有 NAT 是不够的,Linux 防火墙默认会阻止转发流量。我们需要显式允许合法流量。
-
放行已建立连接的返回包:
nft add rule inet filter forward ct state established,related accept -
放行内网到公网的访问(如果前面设置了 drop 策略,这一步是必须的):
nft add rule inet filter forward iifname "eth1" oifname "eth0" ct state new accept -
示例:端口转发(DNAT) 假设需要将公网 8080 端口的流量转发到内网
192.168.100.10的 80 端口。# 在 nat 表的 PREROUTING 链中添加目标地址转换规则 nft add rule ip nat prerouting iifname "eth0" tcp dport 8080 dnat to 192.168.100.10:80 # 同时需要在 filter 表的 forward 链中放行该目的地的流量 nft add rule inet filter forward ip daddr 192.168.100.10 tcp dport 80 accept
3.2 使用 iptables 进行配置(传统方案)
如果因兼容性问题必须使用 iptables,配置逻辑类似,但需要在不同的工具和表中切换。以下是实现上述 nftables 功能的等效 iptables 命令:
# 1. 启用 IP 转发 (同上文)
sysctl -w net.ipv4.ip_forward=1
# 2. NAT 伪装
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE
# 3. FORWARD 链规则
# 允许已建立连接的数据包
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许内网到外网的新建连接
iptables -A FORWARD -i eth1 -o eth0 -m state --state NEW -j ACCEPT
# 4. 端口转发 (DNAT)
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to-destination 192.168.100.10:80
iptables -A FORWARD -p tcp -d 192.168.100.10 --dport 80 -j ACCEPT
四、关键工程实践与监控
4.1 状态跟踪(Connection Tracking)
Linux 防火墙的核心是 conntrack(连接跟踪)模块。nftables 和 iptables 的 state 或 ct state 模块依赖于此。确保内核加载了 nf_conntrack 模块:
lsmod | grep nf_conntrack
在高流量场景下,可能需要调整 nf_conntrack_max 和 nf_conntrack_tcp_timeout_established 等参数,以避免连接跟踪表溢出导致丢包。
4.2 规则持久化
上述命令配置的规则在系统重启后会丢失。必须将规则保存并设置为开机自动恢复。
对于 nftables:
# 保存当前规则
nft list ruleset > /etc/nftables.conf
# 在 systemd 环境中,创建服务或使用系统自带的 nftables.service
对于 iptables:
# Debian/Ubuntu
iptables-save > /etc/iptables/rules.v4
# 安装 iptables-persistent 包可自动恢复
apt-get install iptables-persistent
4.3 调试与日志
如果数据包转发失败,除了检查 sysctl 和防火墙规则外,还可以利用 tcpdump 进行抓包分析,或在防火墙规则中添加带计数的查看命令(如 nft -a list ruleset)来定位匹配情况。
五、总结
将 Linux 主机打造为路由器,本质上是 **“内核功能 + 防火墙规则”** 的组合。核心在于:
- 内核层:通过
net.ipv4.ip_forward=1打开转发开关。 - 网络层:确保路由表正确(通常内网在同一广播域即可自动通达)。
- 防火墙层(关键):根据业务需求,编写严格的 FORWARD 链策略和 NAT 规则。
对于 2025 年后的新项目,强烈推荐使用 nftables。它不仅提供了更现代的语法,还能在单一框架下高效管理 IPv4/IPv6 双栈流量,大幅降低运维复杂度。通过合理的默认拒绝(Default Drop)策略和连接跟踪机制,即可用简单的脚本构建出生产级的高性能路由器。
参考资料
- Linux Kernel IP Sysctl Documentation: kernel.org
- nftables Wiki - Simple ruleset for a home router: wiki.nftables.org
- DigitalOcean: How To Forward Ports through a Linux Gateway with Iptables