我运行一个服务器,其中一个 Web 服务器作为无根 podman 容器运行。这会暴露端口 10080 和 10443,因为作为无根容器,不允许暴露端口 80 和 443。
为了可以从外部访问我的网站,我使用 ufw 作为防火墙并在那里设置了端口转发。为此,我将以下行添加到文件的开头/etc/ufw/before.rules
:
*nat
:PREROUTING ACCEPT [0:0]
-A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 10080
-A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 10443
COMMIT
到目前为止一切正常。
我现在想运行另一个运行 Wireguard 服务器的容器。这会在其日志中输出以下内容,并且似乎将其设置为防火墙中的规则:
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.13.13.1 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] ip -4 route add 10.13.13.2/32 dev wg0
[#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth+ -j MASQUERADE
如果我在没有激活 ufw 防火墙的情况下运行 Wireguard 容器 - 特别是没有定义的端口转发 - 一切都会正常。我可以与客户端连接,其流量通过隧道路由并到达互联网。
另一方面,如果我激活 ufw 防火墙(包括定义的端口转发),然后使用客户端连接到 Wireguard VPN,则所有页面视图似乎都会到达我的服务器本身 - 至少我会收到如下错误消息:
This server could not prove that it is www.google.de. Its security certificate comes from <myServer>.de
如何配置 ufw 防火墙以便
- 来自外部到端口 80 或 443 的请求将转发到端口 10080 或 10443,从而到达我的 Web 服务器
- 来自我的 VPN 客户端的请求通过 WireGuard 隧道到达 Internet,而不是我自己的服务器?
(在另一台服务器上,我在 docker 下运行 WebServer 和 WireGuard - 一切正常,因为 Docker WebServer 直接公开端口 80 和 443,因此我不需要任何端口转发。)
非常感谢您的帮助。
答案1
经过重新思考,解决方案很简单:仅当目标是我的服务器IP时才进行端口转发,所以我将 before.rules 更改为:
*nat
:PREROUTING ACCEPT [0:0]
-A PREROUTING -d <ServerIP> -p tcp --dport 80 -j REDIRECT --to-port 10080
-A PREROUTING -d <ServerIP> -p tcp --dport 443 -j REDIRECT --to-port 10443
COMMIT