我正在尝试修改VPN上的VPN设置,我一直使用它来连接另一个VPN连接上的两个lan段,但是我遇到了一个路障,看起来应该有一个解决方案。
VLAN1 <-> USB-Ethernet adapter <-> [ tincd (Mode: switch) <-> openconnect ] <-> LAN <-> {internet} <-> tincd (remote) <-> VLAN1 (remote)在没有停靠器容器的情况下,我的工作方式是将tincd本质上配置为连接到只有在建立openconnect时才能到达的IP地址。我有一个桥接器“vpn桥”,它连接USB以太网适配器和tincd守护进程,还有一个iptables规则,允许从网桥接受并转发到桥接器。这是很好的工作,设备可以看到和相互交谈,就像他们在同一个局域网。
所以我创造了一个码头容器。我让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以太网适配器相连。但是在对接器容器中,这个桥并不存在,即使我创建了它,我也无法将它与USB以太网接口连接起来,而USB以太网接口不能从容器内部直接访问。我也不希望容器使用“主机”网络,因为我不希望openconnect路由更改影响主机上运行的其他东西。
我找不到一种方法将主机上的现有桥公开给码头容器,这样由tincd完成的brctl addif就可以工作了。有办法做到这点吗?或者这是ipvlan解决的问题吗?我很难找到ipvlan的例子,也很难找到一种将它们与docker编写一起使用的方法。
发布于 2021-05-09 16:44:04
在尝试了很多事情之后,我终于把它(主要是)工作了。事实证明,ipvlan不是正确的驱动程序,这可以用macvlan在passthru模式下完成。以下是我的对接者-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范围,这会导致在容器中运行的守护进程的连接在不经意间被路由。
另一个问题是,我不能使用,因为设备名enxAABBCCDDEEFF太长,无法添加vlan标记。我找不到一个单独的macvlan驱动程序选项来指定标记。最后,我只使用了主网络接口eno1并以这种方式标记了流量。
https://serverfault.com/questions/1062987
复制相似问题