概括
我是一名后端开发人员,但网络知识有限。我需要在我的计算机(Linux 主机)上本地测试由多个组件(各种 SIP 和媒体元素,SIP UA)组成的 SIP 系统。挑战在于,一些系统元素可以作为 VirtualBox VM(Windows 和 Linux 客户机)访问,而其他系统元素可以作为 Docker 容器(通过 Docker Engine 运行)访问。我试图实现的是配置我的本地主机(不是本地网络路由器)和/或 VM 和 Docker 客户机(如果需要)以确保 VM 可以与 Docker 容器通信,反之亦然。对于所有系统组件是否必须位于同一子网或多个不同子网中,我没有任何严格要求,只要满足以下条件即可:
- 每个系统组件都可以通过自己的 IP 地址访问(许多 SIP 组件依赖于默认的 5060 端口)
- 理想情况下(不是强制性的,但可以大大简化设置)可以预先指定 IP 地址(就像使用 Docker 自定义网桥一样),因为许多 SIP 服务器必须预先配置它们将监听的 IP 地址
- 无需 NAT 即可进行交叉通信(处理媒体协议时,NAT 会使事情变得特别困难)。
细节
我目前拥有的:
- Linux主机(PopOS 22.04)
- 本地网络IP:192.168.200.232
$ netstat -r Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface default 192.168.200.1 0.0.0.0 UG 0 0 0 wlp1s0 link-local 0.0.0.0 255.255.0.0 U 0 0 0 wlp1s0 172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0 192.168.200.0 0.0.0.0 255.255.255.0 U 0 0 0 wlp1s0
- VirtualBox 6.1
- Windows 11 来宾Windows 11 guest
- 防火墙:已禁用
- 网络设置:桥接适配器、wlp1s0、Intel PRO/1000 MT 服务器、启用混杂模式
- IP地址:192.168.200.88
- Docker 24.0.2
- Linux 容器
- 网络设置:使用默认Docker
bridge
网络 - IP地址:172.17.0.4
# netstat -r Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface default _gateway 0.0.0.0 UG 0 0 0 eth0 172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
我能够从 Docker 容器 ping 虚拟机:
# ping 192.168.200.88
PING 192.168.200.88 (192.168.200.88) 56(84) bytes of data.
64 bytes from 192.168.200.88: icmp_seq=1 ttl=127 time=0.476 ms
64 bytes from 192.168.200.88: icmp_seq=2 ttl=127 time=0.677 ms
但反过来就不行:
> ping 172.17.0.4
Pinging 172.17.0.4 with 32 bytes of data:
Request timed out.
我尝试像这样向 Windows 客户机添加静态路由(这里 192.168.200.232 是我的主机 IP):
route add 172.17.0.0 MASK 255.255.0.0 192.168.200.232
这导致了以下 Windows 客户机netstat -r
输出:
PS C:\Users\User> netstat -r
===========================================================================
Interface List
15...08 00 27 7c 0c be ......Intel(R) PRO/1000 MT Network Connection
1...........................Software Loopback Interface 1
===========================================================================
IPv4 Route Table
===========================================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 192.168.200.1 192.168.200.88 25
127.0.0.0 255.0.0.0 On-link 127.0.0.1 331
127.0.0.1 255.255.255.255 On-link 127.0.0.1 331
127.255.255.255 255.255.255.255 On-link 127.0.0.1 331
172.17.0.0 255.255.0.0 192.168.200.232 192.168.200.88 26
192.168.200.0 255.255.255.0 On-link 192.168.200.88 281
192.168.200.88 255.255.255.255 On-link 192.168.200.88 281
192.168.200.255 255.255.255.255 On-link 192.168.200.88 281
224.0.0.0 240.0.0.0 On-link 127.0.0.1 331
224.0.0.0 240.0.0.0 On-link 192.168.200.88 281
255.255.255.255 255.255.255.255 On-link 127.0.0.1 331
255.255.255.255 255.255.255.255 On-link 192.168.200.88 281
===========================================================================
Persistent Routes:
None
IPv6 Route Table
===========================================================================
Active Routes:
If Metric Network Destination Gateway
1 331 ::1/128 On-link
15 281 fe80::/64 On-link
15 281 fe80::b2b0:9f8f:be31:e695/128
On-link
1 331 ff00::/8 On-link
15 281 ff00::/8 On-link
===========================================================================
Persistent Routes:
None
但它不起作用(可能是因为我的家用路由器上缺少额外的静态路由,但我想避免在路由器级别进行任何更改,因为我需要在不同的环境中复制此解决方案,并且我想将所有更改单独包含在主机上)
概括
以下是我想要实现的配置图表:
我试图使用直接在主机上运行的虚拟机和 Docker 容器来实现目标吗?如果可以,任何指点都将不胜感激!
答案1
使用以下命令运行所有容器--net=host
网络主机驱动程序
这样,您的所有组件都将位于同一网络上,并能够进行通信
答案2
编辑:完全忘记了您在本地需要它。您可能可以使用 VMWare 网络实现完全相同的功能。
- 在 VMWare 网络编辑器中创建新的“仅主机”网络
-
- 在那里禁用 DHCP 服务器
- 将虚拟机 NIC 设置为该网络。手动分配 IP 地址
- 在同一网络内创建一个新的 docker 网络( macVLAN 或 ipVLAN )
- 手动为已部署的容器分配 IP 地址
以下是网络创建命令的示例:
docker network create --driver ipvlan --subnet 192.168.0.1/24 --gateway 192.168.0.254 --ip-range 192.168.0.254/28 --attachable --opt mode=l2 --opt parent=eth0 externalNetwork
允许我将 192.168.0.254/28(即 192.168.0.240 至 192.168.0.253)与我的 Docker 一起使用。我在路由器中保留了此段,因此它不会分配此段。
这是我的 Unraid(虚拟化和托管服务器)为 DNS 解析器 docker 运行的命令。所述 docker 应由我家中位于 192.168.0.1-192.168.0.254 网络上的其他物理设备访问
docker run
-d
--name='piholedocker'
--net='externalNetwork'
--ip='192.168.0.250'
-e TZ="TIMEZONE"
-e HOST_OS="Unraid"
-e HOST_CONTAINERNAME="piholedocker"
-e 'TCP_PORT_53'='53'
-e 'UDP_PORT_53'='53'
-e 'UDP_PORT_67'='67'
-e 'TCP_PORT_80'='80'
-e 'TCP_PORT_443'='443'
我将在这里留下我最初的评论以供参考:
您可以为虚拟机设置“外部”网络,并为容器使用 ipVLAN(或 macVLAN)。这就是我在家里做的事情,这样我就可以从网络中的所有设备联系 Vaultwarden 和 pihole dockers。
您可以:
- 将路由器 DHCP 服务器段限制为 100 个主机,其中 50 个用于虚拟机,另外 100 个用于容器(数字仅用于举例)
- YOLO 通过在常规段上运行所有内容(推荐给懒惰的家庭用户)
- 在路由器中创建一个全新的网段。然后,根据 MAC 地址将其分配给虚拟机/容器(或手动分配)
无论如何,在办公室网络环境中,请事先联系 IT。最糟糕的情况是,他们会购买便宜的 TP-Link 路由器,将其插入他们的网络,然后在那里为您提供整个网段(例如,如果您的工作使用的是 192.168.xx/24,那么您将获得类似 172.16.xx/24 的东西)。
题外话:关于这些事情,总是尝试咨询 IT 部门!他们大多是好人,对网络(以及许多其他事情)有很好的理解。