You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 14:52:54