Docker:如何让容器访问主机上的网桥?VPN-over-VPN

Docker:如何让容器访问主机上的网桥?VPN-over-VPN

我正在尝试将 vpn-over-vpn 设置 docker 化,我一直用它来通过另一个 VPN 连接桥接两个 LAN 段,但我遇到了一个障碍,似乎应该有一个解决方案。

VLAN1 <-> USB-Ethernet adapter <-> [ tincd (Mode: switch) <-> openconnect ] <-> LAN <-> {internet} <-> tincd (remote) <-> VLAN1 (remote)

在没有 docker 容器的情况下,我实现此操作的方法是将 tincd 实质上配置为连接到一个 IP 地址,该 IP 地址只有在建立 openconnect VPN 后才能访问。我有一个桥接器“vpn-bridge”,它桥接 USB 以太网适配器以及 tincd 守护进程,还有一个 iptables 规则,允许从桥接器接受和转发。这很好用,设备可以互相看到和通信,就像它们在同一个 LAN 上一样。

所以我创建了一个 docker 容器。容器内运行着 openconnect 客户端,并成功连接到远程网络,容器内还运行着 tincd 守护进程,这意味着它能够在 VPN 之上建立 VPN。因为我不想让 openconnect 对路由等的更改影响主机,所以我vpcbr为该容器使用了网络。

现在,tinc-up我在脚本中告诉 tincd 将它创建的接口添加到我的网桥中,该网桥包含 USB 以太网适配器,允许它接受/转发流量。这是脚本中的相关部分tinc-up

ifconfig "$INTERFACE" "0.0.0.0"
brctl addif vpn-bridge "$INTERFACE"
ifconfig "$INTERFACE" up
iptables -A FORWARD -i vpn-bridge -o vpn-bridge -j ACCEPT

直接在主机上执行此操作很容易,桥接器已经存在,并且桥接器已经与 USB 以太网适配器链接。但在 docker 容器内,此桥接器不存在,即使我创建了它,我也无法将其与 USB 以太网接口链接,因为无法从容器内部直接访问该接口。我也不希望容器使用“主机”网络,因为我不想让 openconnect 路由更改影响主机上运行的其他程序。

我找不到一种方法将主机上现有的桥接器暴露给 docker 容器,以便brctl addiftincd 完成的工作可以工作。有没有办法做到这一点?或者这是 ipvlan 以某种方式解决的问题?我很难找到 ipvlan 的示例或将它们与 docker-compose 一起使用的方法。

答案1

尝试了很多方法后,我终于让它(大部分)工作了。结果发现不是正确的驱动程序,可以使用in模式ipvlan完成此操作。以下是我的 docker-compose.yml 的相关摘录:macvlanpassthru

networks:
  main:
    driver: bridge
    ipam:
      config:
        - subnet: 172.21.8.0/24
  vlan:
    driver: macvlan
    driver_opts:
      parent: eno1.9
      macvlan_mode: passthru
    ipam:
      config:
        - subnet: 172.21.9.0/24

我发现我必须main按字母顺序命名我的网络vlan,否则将端口映射到容器中运行的其他守护进程将不起作用。此外,特别是对于,openconnect我必须编写一个自定义脚本来过滤推送到拆分隧道的地址范围以排除该172.16.0.0/12范围,这导致与容器内运行的守护进程的连接被无意中路由到 VPN。

另一个问题是我无法使用 USB 以太网适配器,因为设备名称enxAABBCCDDEEFF太长,导致我无法添加 vlan 标签。我找不到单独的macvlan驱动程序选项来指定标签。我最终只好使用主网络接口eno1并以此方式标记流量。

相关内容