作为一名开发人员,我试图在 ubuntu 22 主机 (virtualbox) 上设置 vm guest 以便能够访问 Internet。问题是我没有在同一个私有子网上运行外部路由器,所以我想我还需要在主机上设置“路由器/网关”功能以正确连接两个世界 (?)。
为了给您提供背景信息,我正在尝试迁移我当前的(旧)设置,如下所示:
(Internet) <--> asus router (static public ip a.b.c.d, gateway + dhcp for internal subnet 192.168.84.1) <--> ubuntu host (192.168.84.107) <--> vm guests (192.168.84.xxx)
当前(旧)主机上的配置是一个简单的桥(封装物理 eth0),网关设置为 192.168.84.1(华硕路由器),一切都运行正常。
我的新主机位于其他地方(它本身就是一个虚拟机,所以实际上我现在正在进行嵌套虚拟化,但我猜这与这个问题无关),它有自己的公共 IP(abc132/25)并使用远程网关(abc129)。因此没有路由器 192.168.84.1 来将虚拟机(使用 192.168.84.xxx)指向:
(Internet) <--> external router (a.b.c.129) <--> ubuntu host (public IP a.b.c.132/25) <--> vm guests (192.168.84.xxx)
我已尝试过(如果需要,我将编辑问题并提供 netplan、ifconfig、ip route 和其他转储,但现在我只是想问问我尝试做的事情是否可行):
编辑了 netplan:从“eth0”接口中删除所有设置,创建了封装它的桥接器“br0”,并将设置放在那里(地址、名称服务器、路由)。我还将 ip 192.168.84.1 添加到地址中,因此现在 br0 有两个 ip(原始公共 abc132/25 和子网网关的 192.168.84.1/24)
将虚拟机设置为使用桥接适配器(并为其分配静态 IP 192.168.84.x)
安装 isc dhcp 服务器并将其配置为管理接口“br0”和子网 192.168.84.0(掩码 255.255.255.0),使用路由器 192.168.84.1
当前状态:
- a)主机可以访问互联网
- b)主机可以访问所有来宾(使用他们的 192.168.84.x ips)
- c) 客人可以联系其他客人
- d)客人可以访问主机(使用192.168.84.1)
- e) 客人无法访问互联网 - ping 甚至显示“配置错误”(?) 接口(可能是因为 br0 同时使用公共和内部网关 ips?):
From 192.168.84.1: icmp_seq=3 Redirect Host(New nexthop: a.b.c.129)
我认为我缺少了将本地 dhcp/路由连接到外部网关的一个部分,但是我不知道该在哪里进行更改(以及排列组合)。
任何帮助将不胜感激!
谢谢。
答案1
正如通常的情况一样,我已经非常接近解决方案了,唯一缺少的部分是 NAT 规则:
iptables -t nat -A POSTROUTING -4 -s 192.168.84.0/24 -j MASQUERADE
添加此规则可将客户虚拟机连接到互联网,从而解决问题。
这是我的上下文完整配置:
网络计划.yaml
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: false
dhcp6: false
set-name: eth0
bridges:
br0:
interfaces:
- eth0
dhcp4: true
dhcp6: false
optional: true
addresses:
- a.b.c.132/25
- 192.168.84.1/24
nameservers:
addresses:
- 8.8.8.8
routes:
- to: default
via: a.b.c.129
dhcpd配置文件
subnet 192.168.84.0 netmask 255.255.255.0 {
range 192.168.84.102 192.168.84.200;
option routers 192.168.84.1;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.84.255;
option domain-name-servers 8.8.8.8;
}
isc-dhcp 服务器
INTERFACESv4="br0"
希望这对任何人都有帮助。