将 Linux 容器分配到与主机相同的 LAN 的方法?

Way to assign Linux container to the same LAN as host?

我的目标是让我的 Linux 容器与主机和其他设备位于同一个局域网中。 因为我需要经常使用 nmap 来扫描 lan 上的设备 mac 地址。不幸的是,nmap 扫描仅在这些 machines 都位于同一子网上时才有效。

我尝试了几种方法来实现它,但都失败了。 尽管有很多关于如何执行此操作的说明,但似乎它们都是针对 Docker for Linux.

比如来自Whosebug的非常详细的说明: 也不适合我。


我尝试过的事情:

Macvlan:

Windows 10 的 Docker 似乎不支持 macvlan,因为我无法将 Windows 网络适配器作为父级..

管道工程:

仅适用于 Linux 系统,但我使用的是 Windows 10..

修改 bip 来自 daemon.json:

我试过了,这会将 docker0 设置为静态 IP,然后容器仍然无法 ping 通局域网上的设备。我猜是因为容器放在了NAT,改变docker0 bridge ip是达不到我的目的的。

运行 图片与 --net host:

哪个 ifconfig 显示:

docker0   Link encap:Ethernet  HWaddr 02:42:2d:b8:0b:7c
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0
          inet6 addr: fe80::42:2dff:feb8:b7c/64 Scope:Link
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:540 (540.0 B)

eth0      Link encap:Ethernet  HWaddr 02:50:00:00:00:01
          inet addr:192.168.65.3  Bcast:192.168.65.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:111 errors:0 dropped:0 overruns:0 frame:0
          TX packets:147 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:9701 (9.7 KB)  TX bytes:10384 (10.3 KB)

hvint0    Link encap:Ethernet  HWaddr 00:15:5d:0d:52:27
          inet addr:10.0.75.2  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::215:5dff:fe0d:5227/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:359819 errors:0 dropped:1303 overruns:0 frame:0
          TX packets:1157 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:54740692 (54.7 MB)  TX bytes:103676 (103.6 KB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:57 errors:0 dropped:0 overruns:0 frame:0
          TX packets:57 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:5732 (5.7 KB)  TX bytes:5732 (5.7 KB)

它能够 ping 我子网上的所有内容,但 IP 仍然不是来自我的子网,而是 192.168.65.3。

然后我试图通过编辑 /etc/network/interface.d/eth0 将 eth0 ip 更改为静态 IP,在重新启动网络服务后,eth0 ip 已从我的子网更改为静态 ip,但是网络不再工作了。

拜托,如果这里有人知道如何将 Windows 10 的 Linux 容器放置在 LAN 上,就像主机的一样。


我的Docker版本

Client:
 Version:      18.03.1-ce
 API version:  1.37
 Go version:   go1.9.5
 Git commit:   9ee9f40
 Built:        Thu Apr 26 07:12:48 2018
 OS/Arch:      windows/amd64
 Experimental: false
 Orchestrator: swarm

Server:
 Engine:
  Version:      18.03.1-ce
  API version:  1.37 (minimum version 1.12)
  Go version:   go1.9.5
  Git commit:   9ee9f40
  Built:        Thu Apr 26 07:22:38 2018
  OS/Arch:      linux/amd64
  Experimental: false

我 post 编辑了另一个问题,该问题的根本原因与此问题相同。因此,他们可以应用相同的解决方案。

解决方案是 post

我仍在努力解决这个问题,但您关于 macvlan 不适用于 Windows 10 的断言是不正确的。使用 中的一些说明,我在 Windows 10 上设置了一个相当实用的 macvlan 网络。我仍在努力让我的网络上的主机能够 ping 主机在 macvlan 网络上。

这是我所做的:

  1. 在管理员 powershell window 中: Set-NetIPInterface -ifindex <interface_index> -Forwarding Enabled 设置(使用 Get-NetAdapter 获取网络适配器列表及其 ifindex 编号)
  2. docker network create routed0 --subnet 192.168.2.0/24 将 192.168.2.0/24 替换为要分配给 routed0 网络的正确网络号和网络掩码位

对我来说,这产生了一个 docker 网络,附加的容器可以通过该网络通过 192.168.1.0/24 的路由器成功地与 Internet 主机通信。但是,我还没有弄清楚如何将 windows 10 框配置为 192.168.2.0/24 的网关以实际充当网关(并执行诸如将 ICMP 请求从 1.0/24 上的主机路由到它托管的 docker 网络 2.0/24)。