Debian 10 开启 IPv4 路由转发:sysctl 持久化与链路验证
1. 服务介绍
Linux 路由转发让一台具有多块网卡的主机在不同三层网络之间转发 IPv4 数据包。它常用于实验路由器、双网卡服务器、内网出口和隔离网段互通场景。
开启net.ipv4.ip_forward只允许内核执行三层转发,不会自动生成路由,也不会自动放行防火墙,更不会自动提供 NAT。要实现完整通信,还需要为客户端配置返回路由,并检查 nftables/iptables 的 FORWARD 策略。
本文使用 Debian 10 示例,完成内核参数持久化、路由表确认、客户端静态路由和端到端验证。
> 版本说明:Debian 10 LTS 已结束。本文保留旧实验环境用于复现;生产环境应使用仍受支持的 Debian 版本,并按当前防火墙工具和网络管理方式调整命令。
2. 准备运行环境
• 操作系统:Debian 10 amd64 实验主机。
• 权限:root 或具备 sudo 权限的管理员账号。
• 网卡:至少两块处于不同三层网络的网卡,先确认实际接口名。
• 地址规划:准备每块网卡的地址、掩码/前缀、网关和对端网段。
• 客户端:两侧至少各有一台测试主机,且测试主机配置返回路由。
• 防火墙:确认 nftables、iptables、云安全组或上游 ACL 不阻断转发流量。
• 配置备份:修改/etc/sysctl.conf或/etc/sysctl.d/前先备份。
示例拓扑:
LAN-A:192.0.2.0/24 路由器接口 ens33:192.0.2.1/24 LAN-B:198.51.100.0/24 路由器接口 ens34:198.51.100.1/24 LAN-A 客户端默认网关:192.0.2.1 LAN-B 客户端默认网关:198.51.100.1192.0.2.0/24和198.51.100.0/24是文档示例网段,实际部署必须替换为已规划地址。
3. 相关知识与注意点
•net.ipv4.ip_forward=1控制 IPv4 内核转发;查看/proc/sys/net/ipv4/ip_forward可确认当前运行值。
•sysctl -w只修改当前运行状态,重启后可能丢失。持久化应写入/etc/sysctl.d/99-router.conf或受控的/etc/sysctl.conf,再执行sysctl --system。
• 路由器必须同时知道两侧直连网段;客户端必须知道远端网段的下一跳。只开转发、不配返回路由,常见结果是单向可达或请求超时。
• 路由转发与 NAT 不同。两个内网有正确返回路由时不需要 NAT;访问公网时才按出口设计 SNAT/MASQUERADE,并单独配置防火墙。
• 防火墙可能允许本机 INPUT/OUTPUT,却拒绝 FORWARD。排障要同时看路由、内核参数、FORWARD 规则和抓包结果。
• IPv6 不受net.ipv4.ip_forward控制。IPv6 转发需另查net.ipv6.conf.all.forwarding和 IPv6 防火墙规则。
•rp_filter、策略路由、云平台源地址检查和桥接配置也可能影响多网卡转发。出现回程包丢失时,不要只反复执行sysctl -p。
4. 实验步骤
4.1 确认系统、网卡和路由表
cat /etc/os-release uname -a ip -br link ip -br addr ip route确认两块网卡都处于UP,地址属于不同网段,直连路由已经出现在路由表中。不要照搬旧实验中的接口名,例如实际接口可能是ens33、ens34、enp1s0或enp2s0。
4.2 查看当前 IPv4 转发状态
sysctl net.ipv4.ip_forward cat /proc/sys/net/ipv4/ip_forward返回net.ipv4.ip_forward = 0或文件内容为0时,说明当前未开启 IPv4 转发。
4.3 临时开启转发并验证
先临时修改运行参数:
sysctl -w net.ipv4.ip_forward=1 sysctl net.ipv4.ip_forward临时值适合验证,不适合生产配置。重新启动系统后要再次检查,确认是否需要持久化。
4.4 持久化 sysctl 配置
推荐使用独立文件,便于审计和回滚:
install -d -m 0755 /etc/sysctl.d cat >/etc/sysctl.d/99-router.conf <<'EOF' # Enable IPv4 forwarding for this host net.ipv4.ip_forward = 1 EOF sysctl --system sysctl net.ipv4.ip_forward如果实验要求直接修改/etc/sysctl.conf,先备份并确保同一参数只有一处有效配置:
cp -a /etc/sysctl.conf /etc/sysctl.conf.bak.$(date +%F-%H%M%S) vi /etc/sysctl.conf加入:
net.ipv4.ip_forward = 1应用并检查:
sysctl -p /etc/sysctl.conf sysctl --system sysctl net.ipv4.ip_forward4.5 配置客户端返回路由
路由器本身有两侧直连路由还不够。若 LAN-A 客户端需要访问 LAN-B,客户端需要把 LAN-B 指向路由器:
ip route add 198.51.100.0/24 via 192.0.2.1LAN-B 客户端反向访问 LAN-A 时配置反向路由:
ip route add 192.0.2.0/24 via 198.51.100.1这些命令通常是临时配置。生产环境应写入 NetworkManager、systemd-networkd、ifupdown 或 DHCP 下发的持久化路由配置中。确认路由:
ip route get 198.51.100.10 ip route get 192.0.2.104.6 检查防火墙转发策略
只读检查当前规则,不自动清空或放行:
nft list ruleset 2>/dev/null iptables -L FORWARD -n -v 2>/dev/null iptables -S FORWARD 2>/dev/null如果存在默认 DROP,需要按实际源网段、目的网段、协议和状态设计最小放行规则。规则变更前保存当前配置,并先从控制台或第二个会话验证,避免锁死管理通道。
5. 验证结果
5.1 路由器本机验证
sysctl net.ipv4.ip_forward ip -br addr ip route ip route get 198.51.100.10预期:转发参数为1,两块网卡地址正确,路由表包含两个直连网段,目标地址选择正确出口。
5.2 客户端端到端验证
在 LAN-A 客户端执行:
ping -c 4 192.0.2.1 ping -c 4 198.51.100.10 traceroute -n 198.51.100.10 2>/dev/null || tracepath -n 198.51.100.10在 LAN-B 客户端执行反向测试:
ping -c 4 198.51.100.1 ping -c 4 192.0.2.10如果第一跳可达、远端地址不通,优先检查客户端返回路由和两侧防火墙。
5.3 抓包定位转发链路
在路由器两侧网卡同时观察:
tcpdump -ni ens33 'icmp or arp' tcpdump -ni ens34 'icmp or arp'请求包只从一侧进入、另一侧没有发出,检查内核转发和 FORWARD 规则;请求和响应方向不一致,检查远端返回路由、策略路由和源地址校验。
6. 常见问题排查
• **参数为 1 但两网段不通**:检查客户端返回路由、ip route、FORWARD 防火墙规则和两侧抓包。
• **重启后参数恢复 0**:确认配置写入/etc/sysctl.d/99-router.conf或/etc/sysctl.conf,并执行sysctl --system。
• **只开转发后访问公网失败**:检查出口默认路由、上游回程路由和 NAT 设计;转发本身不会自动提供 NAT。
• **单向可达**:通常是远端没有回程路由,也可能是rp_filter、策略路由或防火墙丢包。
• **修改配置后失去远程连接**:使用虚拟机控制台恢复备份,先检查地址、网关和防火墙,再重新建立 SSH。
• **IPv6 不通**:单独检查net.ipv6.conf.all.forwarding、IPv6 路由和防火墙,不要只看 IPv4 参数。
• **抓包没有 ICMP**:确认测试主机实际使用接口、ARP 是否完成、目标地址和网关是否正确;不要只依赖 ping 结果判断所有协议。