在嵌入式开发、网络设备改造以及私有化部署场景中,将标准 Linux 系统转变为功能完整的路由器是一项核心技能。无论是利用旧工业主机充当边界网关,还是在容器环境中实现服务网格流量转发,抑或为物联网设备构建轻量级路由固件,Linux 内核的网络栈都提供了成熟且高度可定制的解决方案。本文将从实际部署角度出发,给出从接口规划到转发规则配置、再到性能优化的完整参数清单。

网络接口规划与基础配置

在配置路由器之前,需要明确各网络接口的角色划分。典型的双网卡路由器场景中,一块网卡连接上游网络(WAN),另一块连接内部局域网(LAN)。若存在多个子网,则可能需要配置更多接口。以 eth0 为外网口、eth1 为内网口为例,首先为内网接口分配静态 IP 地址:

ip addr add 192.168.1.1/24 dev eth1
ip link set eth1 up

若需要支持多个独立 LAN 网段,可按需添加更多接口并分配不同子网段的地址,例如 eth2 使用 192.168.2.1/24。确保各接口已启用并配置正确的 IP 地址后,方可进行后续的转发配置。

IPv4 转发启用:内核参数配置

Linux 路由器工作的前提是启用内核的 IP 数据包转发功能。临时启用可通过写入 proc 文件系统实现:

echo 1 > /proc/sys/net/ipv4/ip_forward

生产环境中需要将该配置持久化,否则设备重启后将丢失路由能力。编辑 /etc/sysctl.conf 文件,添加或修改如下行:

net.ipv4.ip_forward = 1

执行 sysctl -p 使配置即时生效。对于需要同时支持 IPv6 的场景,还需启用 net.ipv6.conf.all.forwarding = 1。值得注意的是,部分 Linux 发行版在 /etc/sysctl.d/ 目录下采用碎片化配置文件管理,生产环境中建议将路由相关配置集中放置于专门的配置文件(如 99-router.conf)中,便于维护和审计。

NAT 配置:MASQUERADE 与源地址转换

仅有转发能力尚不足以让内网设备访问外部网络 —— 还需要通过网络地址转换(NAT)将内网 IP 替换为路由器 WAN 接口的公网 IP。iptables 的 MASQUERADE 目标能够自动捕获外网接口的 IP 地址并进行动态替换,非常适合动态 IP 场景:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

上述规则指定从 eth0 接口流出的数据包(-o eth0)在 POSTROUTING 链进行源地址伪装。若路由器拥有固定公网 IP,也可使用 SNAT 替代 MASQUERADE 以略微降低 CPU 开销:

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 203.0.113.10

对于多 WAN 场景,可在每条出接口上分别配置 MASQUERADE 规则,实现多链路上网的流量负载均衡。

FORWARD 链配置:流量转发精细控制

FORWARD 链决定了经由路由器转发数据包的处理行为。默认策略通常设为 DROP,再通过显式规则放行业务流量。首先配置默认拒绝策略:

iptables -P FORWARD DROP

随后为已建立连接和相关连接放行,这是状态化检测的核心:

iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

上述两条规则分别处理返回流量和内网主动发起的访问。若需要更细粒度的控制,例如仅允许特定端口或协议通过,可在规则中加入 -p tcp --dport 80 或 -p udp --dport 53 等匹配条件。需要特别注意的是,FORWARD 链的规则顺序至关重要 —— 宽松规则应置于严格规则之前,否则会被先行匹配到的规则拦截。

桥接模式:无路由的纯二层转发

在某些场景下,设备需要以透明网桥形式运行,实现即插即用的网络扩展而无需改变原有 IP 规划。Linux 通过 bridge-utils(现已被 iproute2 的 brctl 命令替代)实现网桥功能。首先创建网桥设备:

ip link add br0 type bridge
ip link set eth1 master br0
ip link set eth2 master br0
ip link set br0 up

网桥创建后,连接到 eth1 和 eth2 的设备将处于同一广播域,MAC 地址学习和转发由内核网桥模块自动处理。若需要基于 MAC 层的过滤或 VLAN 标记,可结合 ebtables 工具实现更精细的控制。在纯桥接模式下,无需配置 IP 地址和 NAT,但建议为网桥分配管理 IP 以便远程运维:

ip addr add 192.168.100.1/24 dev br0

性能调优:提升转发吞吐与降低延迟

在高频转发场景(如千兆宽带网关或物联网边缘节点)中,默认内核参数可能成为瓶颈。以下参数可在 /etc/sysctl.conf 中调优:

# 增大连接跟踪表容量
net.netfilter.nf_conntrack_max = 262144
net.netfilter.nf_conntrack_tcp_timeout_established = 3600

# 启用反向路径过滤(关闭以提升转发性能,仅在确定安全时使用)
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0

# 增大 socket 缓冲区
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

# 启用 BBR 拥塞控制(适合高带宽延迟积场景)
net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq

对于采用 iptables 进行大量规则匹配的场景,可考虑使用 nf_conntrack 模块的 hashsize 参数优化内存分配,在 /etc/modprobe.conf 中添加:

options nf_conntrack hashsize=65536

结合 ipset 使用可以将大量 IP 地址匹配规则转化为高效的哈希查询,显著降低大规模规则集的查找延迟。

规则持久化与故障排查

配置完成的 iptables 规则需要持久化保存以确保重启后生效。Debian/Ubuntu 系列推荐使用 iptables-persistent 包:

iptables-save > /etc/iptables/rules.v4

CentOS/RHEL 系列则使用 service iptables save 命令将规则写入 /etc/sysconfig/iptables。容器化部署场景中,可在容器启动脚本中通过 iptables-restore 批量恢复规则。

日常运维中的问题排查可借助以下命令:使用 iptables -L -n -v 查看规则匹配计数;通过 ip route show 检查路由表是否正确;利用 tcpdump -i eth0 port 80 捕获特定接口的指定端口流量,验证数据包是否正常到达路由器。

小结

将 Linux 设备改造为路由器的核心在于三个层面:正确启用内核转发、配置恰当的 NAT 或桥接模式、以及根据实际流量特征进行性能调优。相较于专用路由硬件,Linux 方案的优势在于极高的灵活性和可编程性 —— 从简单的双网卡 NAT 网关到复杂的多路由策略路由,均可通过标准工具链实现。掌握上述配置参数与阈值设定,足以应对绝大多数企业边缘网络或嵌入式系统的路由部署需求。

资料来源:本文技术细节参考 OneUptime 博客的 Linux 路由器配置指南及 DigitalOcean 端口转发教程。