更新
无论如何,如果有人偶然发现了这篇文章。下面的解决方案确实有效,但没有任何反馈/建设性批评或错误识别就对这个问题投反对票似乎是不合理的。
目标
我需要最好的方式来设置 ubuntu 服务器 vbox6.1 客户机以访问互联网并允许 ubuntu 20.04 桌面主机通过 ssh 进入该框。
进展 / 研究
虽然使用 2 个网络适配器组合与 VirtualBox 服务器来建立主机-客户机通信和 VirtualBox 的互联网访问是一种非常常见的解决方案,但这些常见方法有一定的注意事项。
桥接适配器和 NAT 适配器组合方法 - 迄今为止最简单、最快捷的方法,但需要注意的是,如果您在 UFW 防火墙/VPN 中使用终止开关,则通常您必须根据所连接的 Wi-Fi 网络调整防火墙设置,因为网关地址会发生变化(对于在 vbox 上使用静态 IP 地址的用户来说,这是一个常见问题)。如果您非常熟悉防火墙规则,那么此方法适合您。
NAT 适配器和仅主机适配器组合方法 - nat 适配器在盒子内提供轻松的互联网访问,仅主机适配器为 apache 等应用程序提供主机客户机通信。此处需要注意的是,某些应用程序在安装时会根据主适配器 ip 地址自行配置(这是我现在的问题) 并且由于 NAT IP 地址无法与主机通信,这会产生问题。
我正在研究的解决方案(可能最初设置起来有点困难)是配置一个仅主机适配器,以便通过主机的主网络适配器访问互联网。
意义
一vboxnet0 仅主机适配器为您想要的任意数量的 vbox 提供 ssh、主机-客户机通信和外部互联网访问,并使用静态或动态 ip......不再有 vbox 连接问题。
以下是优点和缺点以及我的进展步骤。
步骤1
为您的机器创建一个仅主机适配器(vboxnet0),我的 IP 地址是 192.168.51.1
优点:
如果你计划在同一个主机专用适配器上安装多个 vbox,你可以选择启用 DHCP 服务器
第2步:
为你的 vbox 创建静态 IP 配置(我的是 Ubuntu 20.04 服务器)。你可以选择跳过此步骤,直接使用动态 IP
我在用
network:
version: 2
renderer: networkd
ethernets:
enp0s3:
addresses: ['192.168.51.47/24']
gateway4: 192.168.51.1
nameservers:
addresses: [127.0.0.1, 192.168.51.1, 8.8.8.8]
专业版
利用机器上的静态 IP,您可以通过 SSH 进入机器,而无需使用第二个 NAT 适配器。
第三步
为主机-客户机通信创建简单、最小的 UFW 防火墙规则
这就是配置仅主机适配器与 UFW 配合使用所需的全部内容:
ufw allow allow in|out on vboxnet0
专业版
- 使用此方法,只要每个盒子都在 vboxnet0 上,您就可以使用单个防火墙规则立即为多个 vbox 创建主机-客户机通信(如果您计划制作许多需要主机-客户机通信的 vbox,这非常有用)
第四步
创造永恒的使用 MASQUERADE 共享主机的主网络适配器,实现 vboxnet0 的互联网访问
这是我现在的问题。我只能为 vboxnet0 创建临时互联网访问,因为我对 ip 表和 MASQUERADE 不够熟悉。
作为临时解决方案,我在 bash 脚本中使用以下 4 个命令:
sudo iptables -A FORWARD -o wg0 -i vboxnet0 -s 192.168.51.0/24 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -F POSTROUTING
sudo iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE
其中 wg0 是我的主机的主网络适配器。
此时您应该能够从 vbox 内部 ping 8.8.8.8 以确保它可以访问互联网。
我从以下位置获取了上述命令:
https://help.ubuntu.com/community/Internet/ConnectionSharing
有人可以完成/完善为一个或多个 vbox 创建互联网访问的仅主机适配器方法吗?
似乎这可以帮助很多 ubunutu 用户。使用此方法,您的 vbox 是“网络便携式“并在初始配置后以最少的努力即可访问互联网。
唯一的缺点这里是:困难的初始设置和 vbox 无法被 LAN 上的其他机器访问,如果您只是进行本地 Web 开发,则可以忽略不计。
答案1
此解决方案旨在让 Ubuntu 开发人员的生活更加方便和安全。我希望管理员和/或其他人能够支持我最初的问题,因为对于想要使用 Ubuntu 进行 Web 开发的人来说,这是一个相当常见的问题。
无论如何,我最近遇到了一个软件需求,即为具有互联网访问功能的 VirtualBox 提供一个主机专用适配器。这意味着广泛使用的双适配器方法不够用。在解决这个问题时,我偶然发现了一个超级安全、超级方便、超级高效的 ubuntu/virtualbox 开发环境。我将在下面发布我的所有步骤,以帮助其他寻求更高效 Web 开发环境的 Web 开发人员。
首先,简单概述一下:
桥接适配器和 NAT 适配器组合方法
优点:
- 如果您精通 UFW,则可以轻松快速地进行设置
缺点:
- 需要在客户机内配置 2 个网络接口
- 由于网关值的原因,具有静态 IP 地址的访客在更改 Wi-Fi 网络时可能会遇到问题
- 需要更高级的防火墙配置
- 鼓励使用
/etc/hosts
解析本地域名(随着时间的推移变得繁琐)
NAT 适配器和仅主机适配器
优点:
- 易于设置
- 最低限度的防火墙配置
缺点:
- 需要在客户机内配置 2 个网络接口
- 一些软件包在安装时使用默认 IP,因此默认的 10.XXX 地址不合适
(在我的情况下,通过 virtualbox 首选项创建自定义 NAT 地址不会有帮助,因为我的软件只安装在默认 NAT 地址上,并且 NAT 地址不可路由,主机无法访问) - 需要更高级的防火墙配置
- 鼓励使用
/etc/hosts
解析本地域名(随着时间的推移变得繁琐)
最有效的解决方案:
具有 Internet 访问权限的单个主机专用适配器。
仅主机适配器,带互联网访问方法
优点:
- 所有客人可使用一个适配器
- 简化防火墙配置
- 简化宾客网络
- 客户机的行为更像通常具有单个网络接口“eth0”的生产服务器
- 彻底杜绝
/etc/hosts
使用
缺点:
- 更加困难的初始配置。
了解了以上内容后,让我们开始吧:
我会假设:
- 您已安装最新版本的 virtualbox
- 你有一个带有 VPN KillSwitch 的 UFW 防火墙已配置。(请注意 IP Masquerade 部分,我们将再次讨论它。)
- 您已经在 virtualbox 中创建了客户服务器,并为您的用户添加了 ssh 公钥
- 一个可以在您的客户机内部进行 Web 访问的 Web 项目,其域名以“.test”结尾(即 www.example.test)
步骤1
在虚拟盒>文件>主机网络管理器为你的机器创建一个主机专用适配器(即 vboxnet0)。在本指南中,我的 IP 地址为 192.168.51.1
第2步
在Virtualbox > 设置 > 网络, 点击 ”启用适配器“ 适配器 1 和 “附于“选择您在“中创建的vboxnet0名称”步骤1“
步骤3
为您的客户服务器创建静态 IP 配置(我的是 Ubuntu 20.04 服务器)。这对于 ssh 和域名解析是必需的,但是如果您不需要 ssh/dns,则可以使用动态 IP。
对于 Ubuntu Server,我使用:
network:
version: 2
renderer: networkd
ethernets:
enp0s3:
addresses: ['192.168.51.47/24']
gateway4: 192.168.51.1 #**NOTE** Your vboxnet0 ip address is the gateway for your static ip address.
nameservers:
addresses: [127.0.0.1, 192.168.51.1, 8.8.8.8]
记住
运行#netplan apply
和/或#netplan --debug generate
查找您的拼写错误和错误。
重新启动您的客户端以确保设置生效。
第四步
创建简单、最小的 UFW 防火墙规则以启用主机-客户机通信。这是配置仅主机适配器以与 UFW 配合使用所需的全部操作:
$sudo ufw allow in on vboxnet0 && sudo ufw allow out on vboxnet0
此时你应该从主机 ping 你的客户机的静态 IP 并通过 ssh 登录到主机。
测试:
ssh -p 22 -i ~/.ssh/id_rsa root@your-guest's-static-ip address
ping -c 5 your-guest's-static-ip address
第五步
通过使用 MASQUERADE 共享主机的主网络适配器,为 vboxnet0 创建永久的互联网访问。配置 vpn killswitch 时,您必须通过编辑将 ip 伪装成 vpn 的地址/etc/ufw/before.rules
,我们将再次编辑此文件。
sudo nano /etc/ufw/before.rules
在该文件的这一部分中:
#NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
添加:
-A POSTROUTING -s 192.168.51.1/24 -j MASQUERADE
#笔记这是您的 vboxnet0 主机专用适配器的 IP 地址,它充当您的客户的静态 IP 地址的网关。
关闭并保存文件
现在,所有流量 192.168.51.1 都将通过主机的主网络接口发送,即使它发生变化(即 wi-fi 与 lan)
您可以通过访问 vbox 客户机并在命令行上运行来测试这一点:
ping -c 5 8.8.8.8
如果成功,您的仅主机适配器现在就可以访问互联网。
第 6 步
这是最后一步,也是迄今为止最复杂的一步。此时,要让您的 virtualbox web dev 环境准备就绪,唯一需要做的就是安装和配置 dnsmasq,以便您的客户服务器中的域名可以在本地解析。侧边栏dnsmasq 显然可以与上面提到的组合网络适配器方法一起使用以消除使用/etc/hosts
,但是当使用单个主机专用适配器时,需要 dnsmasq 来解析本地域名。
禁用并停止 systemd 已解决
$ sudo systemctl disable systemd-resolved
$ sudo systemctl stop systemd-resolved删除符号链接
/etc/resolv.conf
并删除文件$ ls -lh /etc/resolv.conf
$ sudo rm /etc/resolv.confetc/resolv.con
使用以下值创建一个新的 / :$ sudo bash -c 'echo "nameserver 127.0.0.1" > /etc/resolv.conf' #(主机域名解析)
$ sudo bash -c 'echo "nameserver 208.67.222.222" >> /etc/resolv.conf' #(用于外部互联网的 OpenDNS 公共 DNS 服务器 ip)
$ sudo bash -c 'echo "名称服务器你的客户的静态 ip 地址" >> /etc/resolv.conf'
安装 dnsmasq
$ sudo apt 安装 dnsmasq
将 .test 添加到 dnsmasq 配置文件:
$ sudo bash -c 'echo "address=/.test/your-guest's-static-ip address" >> /etc/dnsmasq.conf'
笔记:开发需要通配符域名解析的 wordpress 多站点的人员可以使用:
$ sudo bash -c 'echo "address=/example.test/your-guest's-static-ip address" >> /etc/dnsmasq.conf'
为客户的静态 IP 地址创建目录解析器:
$sudo mkdir -v /etc/resolver && sudo bash -c 'echo "nameserver your-guest's-static-ip 地址" > /etc/resolver/test'
重新启动 dnsmasq 和网络管理器
$ sudo systemctl 重新启动 dnsmasq $ sudo systemctl 重新启动网络管理器
测试你的 dnsmasq 设置
a.) 打开浏览器并确认您仍然可以访问外部互联网
b.) 运行后dig example.test
你应该能够看到你的客户服务器的静态 IP 地址
c.) 在主机的浏览器中打开 example.test
砰!完毕。
使用此 Web 开发环境,您可以随意更改 Wi-Fi 网络,而不会出现 ufw/guest ip 地址问题,您只有一个主机专用适配器,您可以在您创建的所有未来访客上使用,更轻松地将访客联网在一起,并且完全停止使用该/etc/hosts
文件来解析项目的本地域名,因为它是由 dnsmasq 自动完成的。
我的消息来源:
https://unix.stackexchange.com/questions/304050/how-to-avoid-conflicts-between-dnsmasq-and-systemd-resolved
https://brunopaz.dev/blog/setup-a-local-dns-server-for-your-projects-on-linux-with-dnsmasq/
https://www.stevenrombauts.be/2018/01/use-dnsmasq-instead-of-etc-hosts/#configure-dnsmasq
https://linuxize.com/post/how-to-setup-a-firewall-with-ufw-on-ubuntu-20-04/
https://superuser.com/questions/1237463/virtualbox-host-only-with-internet
https://www.stevenrombauts.be/2018/01/use-dnsmasq-instead-of-etc-hosts/#configure-dnsmasq
https://medium.com/soulweb-academy/docker-local-dev-stack-with-traefik-https-dnsmasq-locally-trusted-certificate-for-ubuntu-20-04-5f036c9af83d