1.虚拟机中执行,测试虚拟机是否可以访问

ip route del 192.168.2.0/22 dev enp6s18 2>/dev/null
ip route add 192.168.2.0/24 src 192.168.2.100 dev enp6s18

2.配置网络永久生效

路径: /etc/netplan/

network:
  version: 2
  renderer: networkd
  ethernets:
    enp6s18:
      dhcp4: false
      addresses:
        - 192.168.1.X/22   
        - 192.168.2.X/22
      nameservers:
        addresses: [192.168.1.6, 8.8.8.8]
      routes:
        - to: default
          via: 192.168.1.6  //宿主机IP

        # 你要的永久路由 ✅ 正确语法
        - to: 192.168.2.0/24
          scope: link
          from: 192.168.2.X  # 192.168.2.X/22的IP 都走192.168.2.0/24

3.修改docker-compose 文件

robot-server:
    image: ruoyi/ruoyi-server:5.5.3
    container_name: robot-server
    restart: unless-stopped
    environment:
      # 时区上海
      TZ: Asia/Shanghai
      SERVER_PORT: 8080
      SNAIL_PORT: 28080
      MONITOR_USERNAME: ruoyi
      MONITOR_PASSWORD: 123456
    ports:
      - "8081:8080"
    volumes:
      # 修正路径拼写错误,保持和其他服务一致的路径规范
      - /mn/dockerfile/robotserver:/opt/robotserver
      # LibreOffice临时目录挂载(持久化,避免容器重启丢失)
      - /mn/dockerfile/robotserver/lo_shared:/tmp/lo-shared
      # skywalking 探针
#      - /docker/skywalking/agent/:/ruoyi/skywalking/agent
    privileged: true   
    sysctls:
      net.ipv4.conf.all.src_valid_mark: 1
    networks:
      - ruoyi-network

必须要有:

privileged: true   
    sysctls:
      net.ipv4.conf.all.src_valid_mark:  1

4.添加规则

安装持久化工具

sudo apt update
sudo apt install -y iptables-persistent
    1. 清空旧规则
iptables -t nat -F POSTROUTING
  • 2.加第一条规则:容器访问 192.168.2.0/24 强制源 IP
iptables -t nat -A POSTROUTING \
-s 172.20.0.0/16 \   
-d 192.168.2.0/24 \  
-j SNAT --to-source 192.168.2.100

解释(你只要知道:这是容器网段 → 强制源 IP)
172.18.0.0/16 = 你的 Docker 桥接网段
192.168.2.0/24 = 目标网段(2 段所有设备)
–to-source 192.168.2.100 = 容器访问时伪装成这个 IP

  • 3.加第二条规则:容器访问其他所有网络 正常走 NAT(保证 1 段能通)
iptables -t nat -A POSTROUTING \
-s 172.20.0.0/16 \
! -d 192.168.2.0/24 \
-j MASQUERADE
  • 4.永久保存规则
netfilter-persistent save
  • 5.重启容器
docker-compose up -d robot-server

现在 1 网段 和 2 网段 都通了
• 访问 192.168.2.180 → 自动用源 IP 192.168.2.100 ✅
• 访问 192.168.1.x、外网、网关 → 正常访问 ✅
• 重启服务器不失效 ✅
• 桥接 Docker 完全正常 ✅

查看最终正确规则

iptables -t nat -L POSTROUTING -n

你会看到:

SNAT       all  --  172.20.0.0/16        192.168.2.0/24         to:192.168.2.100
MASQUERADE all  --  172.20.0.0/16        !192.168.2.0/24

这就是双网段配置

现在测试:

  • 容器访问 192.168.2.180 ✅ 通
  • 容器访问 192.168.1.6 ✅ 通
  • 容器访问外网 ✅ 通
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐