将 Ubuntu Linux 16.04 设置为虚拟机中的路由器

将 Ubuntu Linux 16.04 设置为虚拟机中的路由器

(迁移自https://serverfault.com/questions/895250/setting-up-ubuntu-linux-16-04-as-a-router-within-a-vm

我想将 Ubuntu VM 设置成运行诊断这样我就可以在各种网络条件下对单个设备进行有针对性的测试。我已经让部分设备正常工作,但无法让网关路由我的数据包。

我尝试过的要点:

  • "router"在 Ubuntu 16.04 主机上创建 Ubuntu 16.04 VM( )( "laptop")
  • 为虚拟机创建了两个网卡,均桥接至主机的单个 WiFi 适配器
  • 将第一个 NIC(enp0s3)静态配置为网关,地址为 192.168.0.199
  • 将第二个 NIC(enp0s8)设置为通过 DHCP 自动配置,例如 192.168.0.100
  • 使用以下iptables规则(来自这里这里) 在router iptables -t nat -A POSTROUTING -o enp0s8 -j MASQUERADE iptables -A FORWARD -i enp0s8 -o enp0s3 -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -i enp0s3 -o enp0s8 -j ACCEPT
  • 被测设备/主机("test-device")配置为静态 IP 192.168.0.77,配置为使用 192.168.0.199 作为网关。

此时,我能够router从 LAN 上配置为仍使用 Wifi 路由器作为网关(192.168.0.1)的其他机器访问通过 192.168.0.199 和 192.168.0.100 运行的 HTTP 服务器。

test-device能够 ping 通 Internet 上的主机,但是,无法与这些主机建立 TCP 连接(例如,curl www.google.com失败并显示“目标不可达”)。

其他一些值得分享的事情:

iptables配置router

root# iptables -L -v
Chain INPUT (policy ACCEPT 12012 packets, 5058K bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  enp0s8 enp0s3  anywhere             anywhere             state RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  enp0s3 enp0s8  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT 3220 packets, 271K bytes)
 pkts bytes target     prot opt in     out     source               destination         

ip route条目

root# ip route
default via 192.168.0.1 dev enp0s3 onlink 
169.254.0.0/16 dev enp0s3  scope link  metric 1000 
192.168.0.0/24 dev enp0s3  proto kernel  scope link  src 192.168.0.199 
192.168.0.0/24 dev enp0s8  proto kernel  scope link  src 192.168.0.121 

我不知道下一步该做什么,需要一些帮助!

答案1

未激活 IP 转发在 sysctl 中...

执行 IP 路由在 Ubuntu Linux 中:

sudo nano sysctl.conf

net.ipv4.ip_forward=1
net.ipv4.conf.all.forwarding=1

sudo sysctl -p

相关内容