如何让RHEL8虚拟机内子网中的Docker容器与外部网络通信?
实现外部设备与RHEL8虚拟机内Docker容器的直接通信
要让Windows主机及外部设备直接访问虚拟机内Docker容器的静态IP,需要完成以下配置:
1. 开启RHEL8虚拟机的IP转发功能
IP转发是让虚拟机能够在外部网络和容器子网之间路由流量的基础:
- 临时生效:
echo 1 > /proc/sys/net/ipv4/ip_forward - 永久生效(重启后仍有效):
编辑/etc/sysctl.conf,添加或修改以下配置:
执行命令使配置立即生效:net.ipv4.ip_forward = 1sysctl -p
2. 调整Docker的iptables规则,允许外部流量进入容器子网
默认情况下,Docker会拒绝非虚拟机本机的外部流量访问自定义桥接网络内的容器,需要添加规则放行:
- 先通过
ip addr查看虚拟机的物理网卡名称(比如ens33),假设你的容器子网为172.20.0.0/16(替换为你实际的容器子网),执行:iptables -I DOCKER-USER -i ens33 -d 172.20.0.0/16 -j ACCEPT - 若要永久保存iptables规则,执行:
iptables-save > /etc/sysconfig/iptables systemctl enable --now iptables.service
3. 配置Windows主机及外部设备的路由表
让外部设备知道容器子网的流量需要转发到RHEL8虚拟机的IP(假设虚拟机在Windows宿主机所在网络的IP为192.168.1.100,容器子网为172.20.0.0/16):
- Windows主机(以管理员身份打开命令提示符):
其中route add 172.20.0.0 mask 255.255.0.0 192.168.1.100 -p-p表示永久添加路由,重启后不会丢失。 - Linux外部设备:
ip route add 172.20.0.0/16 via 192.168.1.100 - 其他设备:参考对应系统的路由添加方法,将容器子网的下一跳指向虚拟机IP。
4. 配置RHEL8防火墙放行相关流量
确保RHEL8的firewalld不会阻断外部到容器子网的流量:
firewall-cmd --add-rich-rule='rule family="ipv4" destination address="172.20.0.0/16" accept' --permanent firewall-cmd --reload
验证连通性
完成以上配置后,在Windows主机或外部设备上ping容器的静态IP,比如ping 172.20.0.10,若能通则说明路由配置生效,再测试外部应用发送数据到容器IP,确认容器能正常接收。
内容的提问来源于stack exchange,提问作者VKH
相关产品推荐
相关产品推荐

