我在我的主机上本地运行 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/