我有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是否提供了模仿此功能的方法?
我有两个解决方案,一个涉及iptables黑客,另一个直接使用SSH.
使用连接到guest虚拟机时vagrant ssh,将端口作为参数传递:
vagrant ssh -- -R 3306:localhost:3306
Run Code Online (Sandbox Code Playgroud)
这将在端口3306将本地端口3306转发到远程机器.
我们可以iptables在guest虚拟机上使用来将guest虚拟机上的本地端口的所有流量转发到主机上的远程端口.我们需要确保主机和guest虚拟机具有相对于彼此的或多或少的静态IP地址,以确保一切正常.我们还需要在主机的防火墙上打开一个端口,以允许访客执行此操作.
在您的Vagrantfile设置中,为访客设置静态IP地址:
config.vm.network "private_network", ip: "10.10.10.10"
Run Code Online (Sandbox Code Playgroud)
现在,当你击中时10.10.10.10,你将永远*击中你的客人.
$ 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感觉像是黑魔法,但是一旦你开始工作,它就会非常好并且相当无缝.
端口转发(使用 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。
华泰
| 归档时间: |
|
| 查看次数: |
3067 次 |
| 最近记录: |