Debian 10 开启 IPv4 路由转发:sysctl 持久化与链路验证 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-A192.0.2.0/24 路由器接口 ens33192.0.2.1/24 LAN-B198.51.100.0/24 路由器接口 ens34198.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_forward1控制 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_forward1 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 结果判断所有协议。