如何通过FW虚拟机为私有网络内的Server虚拟机提供互联网访问?
如何通过FW虚拟机为私有网络内的Server虚拟机提供互联网访问?
看起来你已经把基础的网络拓扑和路由规则都配置得差不多了,但还差几个关键环节没打通,导致Server没法通过FW访问互联网。我来一步步帮你搞定:
1. 开启FW的IP转发功能
Linux系统默认是关闭IP转发的,这意味着FW虚拟机没法把私有网络的流量转发到公网接口上。我们需要手动开启这个功能,既要临时生效,也要保证重启后依然有效:
echo 1 > /proc/sys/net/ipv4/ip_forward echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p
2. 配置FW的NAT地址转换规则
Server用的是私有网段IP(192.168.56.x),这个地址没法直接在公网通信,所以需要FW做地址伪装(MASQUERADE),把Server的流量转换成FW公网接口的IP再发出去。
可以用命令自动识别公网接口,不用手动猜网卡名:
# 自动获取公网接口名称 PUBLIC_IF=$(ip route show default | awk '/default/ {print $5}') # 添加NAT伪装规则 iptables -t nat -A POSTROUTING -o $PUBLIC_IF -j MASQUERADE # 保存规则,避免重启后丢失 mkdir -p /etc/iptables iptables-save > /etc/iptables/rules.v4
3. 检查Server的DNS配置(可选但重要)
有时候能ping通公网IP却没法访问域名,大概率是DNS配置的问题。可以给Server手动配置一个公共DNS:
echo "nameserver 8.8.8.8" > /etc/resolv.conf
修改后的完整Vagrantfile示例
把上面的配置整合到你的Vagrantfile里,最终版本如下:
# -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure("2") do |config| config.vm.box = "ubuntu/focal64" config.vm.define "fw" do |fw| fw.vm.hostname = "FW" fw.vm.network "public_network", bridge: "wlp0s20f3", ip: "192.168.1.254", netmask: "255.255.255.0" fw.vm.network "private_network", ip: "192.168.56.254", netmask: "255.255.255.0" fw.vm.provision "shell", run: "always", inline: <<-SHELL # 清理默认路由并设置正确网关 ip route del default ip route add default via 192.168.1.1 # 开启IP转发 echo 1 > /proc/sys/net/ipv4/ip_forward echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p # 配置NAT伪装规则 PUBLIC_IF=$(ip route show default | awk '/default/ {print $5}') iptables -t nat -A POSTROUTING -o $PUBLIC_IF -j MASQUERADE mkdir -p /etc/iptables iptables-save > /etc/iptables/rules.v4 SHELL fw.vm.provider "virtualbox" do |vb| vb.name = "FW" vb.gui = false vb.memory = "1024" vb.cpus = 1 vb.linked_clone = true vb.customize ["modifyvm", :id, "--groups", "/FW-Server"] end end config.vm.define "server" do |server| server.vm.hostname = "server" server.vm.network "private_network", ip: "192.168.56.253", netmask: "255.255.255.0" server.vm.provision "shell", run: "always", inline: <<-SHELL # 设置默认路由到FW ip route del default ip route add default via 192.168.56.254 # 配置DNS echo "nameserver 8.8.8.8" > /etc/resolv.conf SHELL server.vm.provider "virtualbox" do |vb| vb.name = "server" vb.gui = false vb.memory = "1024" vb.cpus = 2 vb.linked_clone = true vb.customize ["modifyvm", :id, "--groups", "/FW-Server"] end end end
验证方法
启动虚拟机后,登录到Server执行以下命令测试:
ping 8.8.8.8:测试公网IP连通性ping google.com:测试DNS解析和域名访问是否正常
如果都能成功,说明互联网访问已经打通啦!
备注:内容来源于stack exchange,提问作者Petote
相关产品推荐
相关产品推荐

