Vpn

Docker:如何讓容器訪問主機上的網橋?VPN-over-VPN

  • May 9, 2021

我正在嘗試對接一個 vpn-over-vpn 設置,我一直在使用該設置通過另一個 VPN 連接橋接兩個 lan 段,但我遇到了一個似乎應該有解決方案的障礙。

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

我在沒有 docker 容器的情況下工作的方式是,tincd 本質上被配置為連接到只有在建立 openconnect VPN 時才能訪問的 IP 地址。而且我有一個橋接器“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 乙太網介面連結,而 USB 乙太網介面不能從容器內部直接訪問。我也不希望容器使用“主機”網路,因為我不希望 openconnect 路由更改影響主機上執行的其他東西。

我找不到將主機上現有橋接器暴露給 docker 容器的方法,以便brctl addif通過 tincd 完成的工作。有沒有辦法以某種方式做到這一點?或者這是 ipvlan 以某種方式解決的問題?我很難找到 ipvlan 的範例或將它們與 docker-compose 一起使用的方法。

在嘗試了一堆東西之後,我終於(大部分)開始工作了。結果ipvlan不是正確的驅動程序,這可以macvlanpassthru模式下完成。這是我的 docker-compose.yml 的相關摘錄:

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-Ethernet 加密狗,因為設備名稱enxAABBCCDDEEFF太長,無法添加 vlan 標籤。我找不到單獨的macvlan驅動程序選項來指定標籤。我最終只使用主網路介面eno1並以這種方式標記流量。

引用自:https://serverfault.com/questions/1062987