You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

单设备多虚拟路由器架构下的被测设备以太网联网测试网络配置咨询

单设备多虚拟路由器架构下的被测设备以太网联网测试网络配置咨询

我在一条生产线上负责测试设备能否通过以太网口连接互联网。
每个被测设备都有一套专属的静态网络配置:

  • 静态IP/子网掩码
  • 静态网关IP
  • DNS服务器IP(主用和备用)
  • NTP服务器IP
    所有设备的配置套餐我都提前掌握,但不确定当前被测设备用的是哪一套。
    我打算做一个带两个以太网口的测试盒:一个接口连被测设备,另一个连公司路由器(路由器用DHCP配置,能访问互联网就行,性能要求不高)。
    目前我的初步思路是搭建一个网桥,包含以下组件:
  • 两个物理以太网接口
  • 绑定到本地运行的DNS、NTP服务器的veth虚拟网卡对
    现在我搞不懂该怎么配置nftables,才能把流量导向正确的目的地——比如DNS/NTP流量要转发到本地服务器,而发往网关的流量……(原提问内容未完成)

核心思路梳理

其实你这个场景的关键是让测试盒能模拟任意一套被测设备的网关、DNS、NTP服务,同时还要把非本地服务的流量转发到公司路由器上。单纯网桥是二层直通模式,没法基于IP做流量拦截和分流,所以得改成路由模式,结合nftables的地址转换规则来实现需求。

具体配置步骤

1. 切换为路由模式(放弃纯网桥)

把测试盒当成小型路由器来配置:

  • 连接被测设备的网口(比如叫eth0):配置一个能覆盖所有被测设备IP段的静态IP,比如所有被测设备IP都在192.168.0.0/16段,那eth0就设为192.168.255.254/16
  • 连接公司路由器的网口(比如叫eth1):用DHCP自动获取IP,确保能正常访问外网

2. 为本地服务配置veth虚拟网卡对

veth对的作用是把本地DNS、NTP服务映射到各个被测设备配置里指定的IP上,比如某套配置的DNS IP是192.168.1.100,就这么创建:

# 创建veth对
ip link add veth_dns0 type veth peer name veth_dns0_host
# 给veth端配置目标DNS IP
ip addr add 192.168.1.100/32 dev veth_dns0
# 启用两个网卡端
ip link set veth_dns0 up
ip link set veth_dns0_host up

之后把veth_dns0_host加到本地DNS服务的监听列表里(比如用dnsmasq的话,在配置文件加interface=veth_dns0_host)。同理,为每一套配置的NTP IP创建对应的veth对,绑定到本地NTP服务(比如chronyd)的监听接口。

3. nftables规则配置(核心环节)

我们要实现两个核心功能:分流DNS/NTP流量到本地服务,转发网关流量到公司路由器。先创建基础表和链:

nft add table ip test_forward
nft add chain ip test_forward prerouting { type nat hook prerouting priority -100; }
nft add chain ip test_forward postrouting { type nat hook postrouting priority 100; }
nft add chain ip test_forward forward { type filter hook forward priority 0; }

然后添加具体规则,这里用单套配置举例:

# 把指向目标DNS IP的流量重定向到本地DNS服务端口
nft add rule ip test_forward prerouting ip daddr 192.168.1.100 tcp dport 53 redirect to :53
nft add rule ip test_forward prerouting ip daddr 192.168.1.100 udp dport 53 redirect to :53

# 把指向目标NTP IP的流量重定向到本地NTP服务端口
nft add rule ip test_forward prerouting ip daddr 192.168.1.101 udp dport 123 redirect to :123

# 把被测设备发往网关的流量做SNAT后转发到公司路由器接口
nft add rule ip test_forward postrouting oifname eth1 ip saddr 192.168.0.0/16 masquerade

# 允许所有转发流量通过
nft add rule ip test_forward forward accept

如果有很多套配置,建议用集合来批量匹配,规则更简洁:

# 创建DNS IP集合,加入所有预设的DNS地址
nft add set ip test_forward dns_ips { type ipv4_addr; }
nft add element ip test_forward dns_ips { 192.168.1.100, 192.168.2.100, 192.168.3.100 }

# 用集合匹配DNS流量
nft add rule ip test_forward prerouting ip daddr @dns_ips tcp dport 53 redirect to :53
nft add rule ip test_forward prerouting ip daddr @dns_ips udp dport 53 redirect to :53

4. 开启内核IP转发

最后别忘了打开Linux内核的IP转发功能,否则流量没法正常转发:

# 临时生效
echo 1 > /proc/sys/net/ipv4/ip_forward
# 永久生效,编辑/etc/sysctl.conf,设置net.ipv4.ip_forward=1,然后执行sysctl -p

额外实用建议

  • 可以写个shell脚本,根据预设的配置套餐自动生成对应的veth对和nftables规则,不用手动一个个配置
  • 本地DNS推荐用dnsmasq,轻量还支持多接口监听和缓存,能提升测试效率
  • 如果想更智能,可以加个简单的探测逻辑:通过ARP扫描获取被测设备的IP,自动匹配对应的配置套餐,自动加载相关规则

备注:内容来源于stack exchange,提问作者Jasper

火山引擎 最新活动