带有 killswitch 的 Dockerized Wireguard 不允许共享网络的服务本地访问

带有 killswitch 的 Dockerized Wireguard 不允许共享网络的服务本地访问

我在 Ubuntu(服务器)20.04 上有两个容器 linuxserver/wireguard 和 X。

X 在端口 q 上有一个 WebUI,我希望通过我的本地网络 (192.168.178.0/24 - fritzbox) 访问它。

它们配置为 X 使用与 linuxserver/wireguard 相同的“网络”(通过 docker 的 --net=container:wireguard)。此外,X 使用的端口 q 是通过 linuxserver/wireguard 上的 -pq:q 指定的。

所以

  • docker create --name=wireguard [...] -pq:q linuxserver/wireguard
  • docker create --name=X [...] --net=container:wireguard -e WebUI_Port=q X

另外我提供了 sysctlsnet.ipv4.conf.all.src_valid_mark=1net.ipv6.conf.all.disable_ipv6=0

wireguard的客户端文件wg0.conf没有设置,如下所示:

[Interface]
PrivateKey = [...]
Address = [...]
DNS = [...]

PostUp =  iptables -I OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT && ip6tables -I OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT
PreDown = iptables -D OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT && ip6tables -D OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT

[Peer]
PublicKey = [...]
AllowedIPs = 0.0.0.0/0,::0/0
Endpoint = [...]

启动两个容器时,我希望能够访问 WebUI,但不幸的是,事实并非如此。由于我不确定这是与 docker 还是 wireguard 相关的问题,希望您能在这里提供帮助。

我还尝试添加规则

ip route add 192.168.178.0/24 via $(ip route show default | awk '/default/ {print $3}')

(作为额外命令)和

! -d 192.168.178.0/24

(在 iptables 命令中),但没有得到任何结果。在 linuxserver/wireguard 的日志中,我只发现sysctl: setting key "net.ipv4.conf.all.src_valid_mark": Read-only file system不同的输出。

答案1

LOCAL如果您的 iptable 拒绝所有带有路由的内容,那么您的路由是什么并不重要。

注意!!我无法保证这个的安全性,因为它是我从各种来源拼凑起来的……

您需要做的只是允许您的服务的流量通过防火墙,并希望除单个端口之外的所有端口都保持终止开关。

在我添加了所需的路线之后,这对我有用:

在 PostUp 上:iptables -A INPUT -p tcp -m tcp --dport <port> -j ACCEPT 这个的语法或位置很重要。我相信-A将它添加到末尾,尽管iptables为了安全起见,我也将它添加到第一个命令之后。

在 PreDown 上:iptables -D INPUT -p tcp -m tcp --dport <port> -j ACCEPT

之后我就能够使用指定的端口了。确保您的路由也正确无误。linuxserver/wireguard 自述文件中有一对(非官方)脚本可以完成此操作,尽管他们指出这不是官方建议。

相关内容