vagrant - 将主机端口转发给 guest

标签 vagrant

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

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

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

最佳答案

我有两种解决方案,一种涉及 iptables hacking,一种更直接地使用 SSH。

通过 SSH 将主机端口隧道传输到 guest

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

vagrant ssh -- -R 3306:localhost:3306

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

iptables 黑客

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

给访客一个静态IP

在您的 Vagrantfile , 为 guest 设置静态 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 感觉就像是黑魔法,但是一旦你开始使用它,它真的很好而且相当无缝。

关于vagrant - 将主机端口转发给 guest ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28351109/

相关文章:

vagrant - 如何在每次启动时运行 Vagrant 规定?

postgresql - Postgres 在尝试创建新数据库时提示编码

java - 如何远程调试java应用程序并将端口转发到虚拟机?

ubuntu - 无法从 Ubuntu 主机访问 Vagrant 配置的 VirtualBox VM

vagrant - 如何删除 Vagrant 中的转发端口?

git - 克隆 git 时 vagrant setup 抛出 Permission denied (publickey)

virtualbox - Vagrant 共享文件夹。符号链接(symbolic link)

networking - 在 Vagrant 下使用私有(private)网络无法访问访客 ip

mysql - 使用 bash 脚本在 CentOS 6 VM (Vagrant) 上安装 MySQL