出口网关节点中转流量

87 阅读4分钟

IPv4 与 IPv6 路由配置(流量中转)及网络调试实战指南

在现代网络环境中,同时支持 IPv4 和 IPv6 已成为常态。本文将带你从零开始,掌握如何在 Linux 系统中添加/删除路由、配置虚拟网卡、启用 IPv6 转发,并通过 tcpdumpnginx 进行实际测试与调试。


如下图,一个集群中的节点只能通过其中指定出口网关节点转发流量,就需要配置路由

image.png

一、IPv4 路由管理

添加特定主机的路由

假设你想让访问 10.1.8.175 的流量通过网关 10.1.12.236 转发,并指定使用 tunl0 接口(常用于 IPIP 隧道),可执行:

sudo ip route add 10.1.8.175 via 10.1.12.236 dev tunl0 onlink

说明onlink 表示下一跳地址不在本地子网内,但仍可通过指定接口直接通信。

删除路由

若需移除该路由:

sudo ip route del 10.1.8.175 via 10.1.12.236 dev tunl0 onlink

查看当前路由表

使用传统命令查看 IPv4 路由:

route -n

或更推荐使用 ip 命令:

ip route show

二、IPv6 配置与路由

启用 IPv6 转发(临时生效)

为了让主机能够转发 IPv6 流量(如作为路由器或网关),需开启内核转发功能:

sudo sysctl -w net.ipv6.conf.all.forwarding=1
sudo sysctl -w net.ipv6.conf.default.autoconf=1
sudo sysctl -w net.ipv6.conf.all.autoconf=1

验证设置是否生效:

sysctl net.ipv6.conf.all.forwarding
sysctl net.ipv6.conf.default.autoconf
sysctl net.ipv6.conf.all.autoconf

永久生效配置

将上述参数写入 /etc/sysctl.conf

net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.default.autoconf = 1
net.ipv6.conf.all.autoconf = 1

然后执行 sudo sysctl -p 加载配置。

查看 IPv6 路由表

ip -6 route
# 或
route -A inet6 -n

三、为 IPv6 创建虚拟网卡(VXLAN)

由于 tunl0(IPIP 隧道)不支持 IPv6,我们需要创建一个支持 IPv6 的虚拟接口。这里以 VXLAN 为例:

创建 VXLAN 接口

ip link add vxlan.egress type vxlan id 501 group 229.0.0.1 dev ens192 dstport 4789
  • id 501:VXLAN 网络标识符(VNI)
  • group 229.0.0.1:组播地址(用于多播发现)
  • dev ens192:底层物理接口
  • dstport 4789:标准 VXLAN 端口

启用接口

ip link set vxlan.egress up

查看接口状态

ip addr show
# 或
ifconfig -a

四、IPv6 路由操作

添加单播主机路由

例如,将访问 10:1:8::77 的流量通过 10:1:8::10 网关转发(注意:此处仍以 tunl0 为例,但实际应使用支持 IPv6 的接口如 vxlan.egress):

sudo ip -6 route add 10:1:8::77/128 via 10:1:8::10 dev tunl0 onlink

⚠️ 注意:tunl0 默认不支持 IPv6。建议将 dev 改为 vxlan.egress 或其他支持 IPv6 的接口。

删除 IPv6 路由

ip -6 route del 10:1:8::77/128 via 10:1:8::10 dev tunl0

为 tunl0 配置 IPv6 地址(仅用于测试)

虽然 tunl0 不推荐用于 IPv6,但可临时分配地址用于调试:

sudo ip -6 addr add fd00:2222::1/64 dev tunl0

五、网络抓包调试

抓取指定端口流量(如 50002)

tcpdump -i any 'port 50002'

抓取 ICMP(IPv4 ping)

tcpdump -i vxlan.egress -nn -v 'icmp'

抓取 ICMPv6(IPv6 ping)

tcpdump -i vxlan.egress -nn -v 'icmp6'

-nn:不解析主机名和端口名;-v:详细输出。


六、部署测试服务:Nginx 支持 IPv4/IPv6

安装 Nginx(源码编译)

wget -c http://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0
./configure --prefix=/usr/local/nginx
make && make install

配置双栈监听

编辑 /usr/local/nginx/conf/nginx.conf,在 server 块中添加:

listen      50002;        # IPv4
listen [::]:50002;       # IPv6

启动与管理

# 启动
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

# 重载配置
/usr/local/nginx/sbin/nginx -s reload

# 停止
/usr/local/nginx/sbin/nginx -s stop

# 优雅退出
/usr/local/nginx/sbin/nginx -s quit

现在你可以通过 curl http://[10:1:8::77]:50002telnet 10.1.8.175 50002 测试连通性。


七、内核日志调试

查看追踪日志

dmesg | grep TRACE

清空 dmesg 缓冲区(谨慎使用)

sudo dmesg -C

此操作会清除所有内核日志,建议在复现问题前先备份日志。


总结

本文涵盖了从基础路由配置到高级网络调试的完整流程,适用于搭建 IPv6 网关、隧道环境或混合网络测试平台。关键点包括:

  • IPv4/IPv6 路由的增删查;
  • 启用 IPv6 转发并持久化;
  • 使用 VXLAN 创建支持 IPv6 的虚拟接口;
  • 通过 tcpdump 实时抓包分析;
  • 部署双栈 Nginx 服务进行端到端验证。

希望这篇指南能帮助你在复杂的网络环境中快速定位问题、高效完成配置!


作者:钝刀张三
发布日期:2025年11月
适用系统:Linux(Ubuntu/CentOS 等主流发行版)