我的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是否提供了模仿此功能的方法?
答案 0 :(得分:6)
我有两个解决方案,一个涉及iptables黑客,一个直接使用SSH。
使用vagrant ssh
连接到访客时,将端口作为参数传递:
vagrant ssh -- -R 3306:localhost:3306
这会将本地端口3306转发到端口3306的远程机器。
我们可以在guest虚拟机上使用iptables
将guest虚拟机上的本地端口的所有流量转发到主机上的远程端口。我们需要确保主机和guest虚拟机具有相对于彼此的或多或少的静态IP地址,以确保一切正常。我们还需要在主机的防火墙上打开一个端口,以允许访客执行此操作。
在Vagrantfile
中,为来宾设置静态IP地址:
config.vm.network "private_network", ip: "10.10.10.10"
现在,当你点击10.10.10.10
时,你总会*打你的客人。
在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 -a
或ip addr
获取其IP。
主机< => VM将能够进行通信。 VM应该能够通过端口3306连接到主机上运行的mysql。
HTH