我在 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=1和net.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 自述文件中有一对(非官方)脚本可以完成此操作,尽管他们指出这不是官方建议。