将主机端口转发给guest

时间:2015-02-05 18:14:23

标签: vagrant

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

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

According to this answer,Docker提供了一种本地执行此操作的方法,而无需使用IP表规则。 VirtualBox和Vagrant是否提供了模仿此功能的方法?

2 个答案:

答案 0 :(得分:6)

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

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

使用vagrant ssh连接到访客时,将端口作为参数传递:

vagrant ssh -- -R 3306:localhost:3306

这会将本地端口3306转发到端口3306的远程机器。

iptables Hackery

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

为访客提供静态IP

Vagrantfile中,为来宾设置静态IP地址:

config.vm.network "private_network", ip: "10.10.10.10"

现在,当你点击10.10.10.10时,你总会*打你的客人。

在Guest

中配置iptables

this awesome answer in Server Fault中找到:

$ 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

然后,启用端口转发:

$ echo "1" | sudo tee /proc/sys/net/ipv4/ip_forward

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

$ sudo iptables-save

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


我应该使用哪种颜色?

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

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

答案 1 :(得分:1)

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

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

Vagrant.configure("2") do |config|
  config.vm.network "public_network"
end

基本上,这将在VM中添加额外的虚拟NIC,它将从网络中的同一DHCP服务器获取IP。使用ifconfig -aip addr获取其IP。

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

HTH