如何在虚拟机中配置Ubuntu Linux 16.04作为路由器?
我来帮你搞定这个Ubuntu虚拟机路由器的配置卡点——毕竟要跑atcd做定向网络测试,路由转发可是核心环节!下面是一步步的解决方案,针对你卡在网关路由数据包的问题:
1. 先确认网卡配置与静态IP设置
首先得把两块网卡的角色分清楚:假设一块网卡(比如eth0)用来连接主机所在的局域网(相当于路由器的WAN口),另一块(eth1)用来连接测试设备(相当于LAN口)。
先通过ip addr命令确认两块网卡的名称,然后编辑网络配置文件/etc/network/interfaces,设置静态IP:
auto eth0 iface eth0 inet static address 192.168.1.10 # 和主机同网段的IP,根据你的实际情况调整 netmask 255.255.255.0 gateway 192.168.1.1 # 主机的网关地址 dns-nameservers 8.8.8.8 # 公共DNS,方便访问外网 auto eth1 iface eth1 inet static address 10.0.0.1 # 给LAN口分配一个独立网段的IP,比如10.0.0.1/24 netmask 255.255.255.0
保存后重启网络服务:
sudo systemctl restart networking
2. 开启IP转发(这是路由的关键!)
Ubuntu默认是关闭IP转发的,这也是很多人卡在路由环节的原因。
- 临时生效(重启虚拟机后失效):
sudo sysctl -w net.ipv4.ip_forward=1
- 永久生效(重启后依然有效):
编辑/etc/sysctl.conf,找到net.ipv4.ip_forward=1这一行,去掉前面的#注释,然后执行:
sudo sysctl -p
可以用sysctl net.ipv4.ip_forward命令验证,输出为1就是开启成功。
3. 配置NAT规则,让测试设备能访问外网
如果你的测试设备需要通过路由器访问外网,得设置SNAT(源地址转换)规则:
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
为了让这个规则在虚拟机重启后保留,安装iptables-persistent工具:
sudo apt-get install iptables-persistent
安装过程中会提示保存当前的iptables规则,直接选Yes就行。
4. 配置atcd的定向路由策略
atcd需要通过NFQUEUE来拦截和处理数据包,所以得把测试设备的流量导向atcd的处理队列:
首先确保atcd已经安装并运行:
sudo apt-get install atcd sudo systemctl start atcd sudo systemctl enable atcd # 设置开机自启
然后添加iptables规则,把测试设备的流量转发到NFQUEUE(队列号设为0,和atcd默认监听的队列一致):
sudo iptables -A FORWARD -s 10.0.0.2 # 替换成你的测试设备IP -j NFQUEUE --queue-num 0
之后你就可以用atc命令设置各种网络条件了,比如给测试设备添加100ms延迟+10%丢包:
sudo atc --add --delay 100ms --loss 10% --src 10.0.0.2 --dst 0.0.0.0/0
5. 验证路由与atcd效果
- 在测试设备上,把网关设置为
10.0.0.1,IP设为10.0.0.2/24(和路由器LAN口同网段) - 先测试基础连通性:
ping 10.0.0.1(能通说明LAN口没问题),再ping 8.8.8.8(能通说明NAT和IP转发正常) - 测试atcd效果:设置完延迟/丢包后,再ping外网,观察是否有对应的网络变化。
常见问题排查
- 如果测试设备ping不通路由器:检查
eth1的IP配置是否正确,或者添加ICMP允许规则:sudo iptables -A INPUT -i eth1 -p icmp -j ACCEPT - 如果ping不通外网:确认
net.ipv4.ip_forward是1,检查NAT规则是否正确,同时确保主机的桥接网卡没有限制虚拟机的对外访问 - 如果atcd不生效:检查iptables的NFQUEUE规则是否正确,或者看atcd服务状态:
sudo systemctl status atcd
内容的提问来源于stack exchange,提问作者scorpiodawg
相关产品推荐
相关产品推荐

