将主机端口转发给guest

Naf*_*Kay 8 vagrant

我有MySQL在我的主机上本地运行,原因是我不能在我的Vagrant机器内运行它.我知道有一种方法可以通过将客户端上3306的所有流量转发到主机的IP地址和端口来解决iptables的这个问题,但这对我来说很复杂,因为我将不得不玩iptables规则并且可能进入TCP伪装,这将是很好的避免.

在Vagrant(VirtualBox VM)中是否有办法将主机TCP端口转发给guest虚拟机,以便guest虚拟机可以访问127.0.0.1:3306并将所有流量host:3306无缝转发?如果没有,我将如何在iptables中设置它?

根据这个答案,Docker提供了一种本地执行此操作的方法,而无需使用IP表规则.VirtualBox和Vagrant是否提供了模仿此功能的方法?

Naf*_*Kay 8

我有两个解决方案,一个涉及iptables黑客,另一个直接使用SSH.

通过SSH将主机端口隧道传送给访客

使用连接到guest虚拟机时vagrant ssh,将端口作为参数传递:

vagrant ssh -- -R 3306:localhost:3306
Run Code Online (Sandbox Code Playgroud)

这将在端口3306将本地端口3306转发到远程机器.

iptables Hackery

我们可以iptables在guest虚拟机上使用来将guest虚拟机上的本地端口的所有流量转发到主机上的远程端口.我们需要确保主机和guest虚拟机具有相对于彼此的或多或少的静态IP地址,以确保一切正常.我们还需要在主机的防火墙上打开一个端口,以允许访客执行此操作.

为访客提供静态IP

在您的Vagrantfile设置中,为访客设置静态IP地址:

config.vm.network "private_network", ip: "10.10.10.10"
Run Code Online (Sandbox Code Playgroud)

现在,当你击中时10.10.10.10,你将永远*击中你的客人.

在Guest中配置iptables

在服务器故障中找到这个很棒的答案:

$ remote_ip=10.0.2.2
$ mysql_port=3306
$ sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport $mysql_port \
      -j DNAT --to $remote_ip:$mysql_port
$ sudo iptables -N INET-PRIV
$ sudo iptables -A FORWARD -i eth0 -o eth1 -j INET-PRIV
$ sudo iptables -A FORWARD -j drop
$ sudo iptables -A INET-PRIV -p tcp -d $remote_ip --dport $mysql_port \
      -j ACCEPT
$ sudo iptables -A INET-PRIV -j DROP
Run Code Online (Sandbox Code Playgroud)

然后,启用端口转发:

$ echo "1" | sudo tee /proc/sys/net/ipv4/ip_forward
Run Code Online (Sandbox Code Playgroud)

首先,测试一下,然后当你确定它有效时,运行:

$ sudo iptables-save
Run Code Online (Sandbox Code Playgroud)

我不确定是否/proc/sys/net/ipv4/ip_forward会记住启动时的设置,因此您可能希望将其添加到启动脚本中.


我应该使用哪种?

SSH肯定更容易做到,但是必须加密该端口的流量并将其转发回主机有一点性能开销.

iptables感觉像是黑魔法,但是一旦你开始工作,它就会非常好并且相当无缝.


Ter*_*ang 2

端口转发(使用 NAT 后网络后端)似乎不太适合用例。

在您的用例中,公共网络(桥接网络)是更好的选择。在中创建第二个网络Vagrantfile并执行vagrant reload.

Vagrant.configure("2") do |config|
  config.vm.network "public_network"
end
Run Code Online (Sandbox Code Playgroud)

基本上,这将在虚拟机中添加一个额外的虚拟网卡,并且它将从网络中的同一 DHCP 服务器获取 IP。使用ifconfig -a或获取其IP ip addr

主机 <=> VM 将能够通信。VM 应该能够通过端口 3306 连接到主机上运行的 mysql。

华泰