我正在尝试从互联网访问路由器设置网页。
我在 AWS EC2 上设置了 WireGuard VPN。路由器和 WireGuard 服务器之间的握手看起来不错,但我无法使用 ec2 实例的公共 IP 访问该 url - http://yyyy:51820。
有没有人有办法解决吗?
服务器
[Interface]
Address = 172.31.16.1/20
SaveConfig = true
ListenPort = 51820
PrivateKey = PrivateKey
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
握手详情如下
服务器
interface: wg0
public key: public key
private key: (hidden)
listening port: 51820
peer: public key
endpoint: x.x.x.x:6140
allowed ips: 172.31.16.2/32
latest handshake: 2 minutes, 1 second ago
transfer: 13.91 KiB received, 3.77 KiB sent
客户
interface: wg0
public key: public key
private key: (hidden)
listening port: 46734
peer: public key
endpoint: y.y.y.y:51820
allowed ips: 0.0.0.0/0
latest handshake: 2 minutes, 7 seconds ago
transfer: 3.77 KiB received, 16.08 KiB sent
persistent keepalive: every 25 seconds
看起来服务器 IP(端点)是 yyyy,但 51820 是 Wireguard 侦听端口。而且您的 iptables 命令似乎没有转发特定端口。
因此,http 请求将最终到达服务器,而不会传递到网络服务器套接字。
因此 yyyy:80 或 yyyy:8080 或 yyyy:443 或 yyyy:zzz (如果您有特定的网络服务器 zzz 侦听端口)可能更适合 http(s) 请求。
注意:关于 wg-quick 如何设置基于路由策略的路由以及Wireguard 路由页面的很好的解释
我相信你需要经历以下几个过程:
对客户端和服务器进行内部 Ping,以确保您可以在 10.8.0.1 和 10.8.0.2 之间的隧道中进行路由。只要两侧的端口都开放供 WG 进行通信,这里就不需要 iptables 工作:这一切都在 Wireguard 内部。
确认后,确保客户端(路由器)上的 Web 端口 XXX 在其 wg0 接口(或 Wireguard 在路由器上创建的任何接口)上打开。登录服务器并尝试卷曲 10.8.0.2:XXX。如果这有效,那么你就成功了 99%。–
将服务器端口转发到路由器客户端 将仅保留将服务器上输入的您选择的任何端口 YYYY 转发到 10.8.0.2 端口 XXX。我对 nftables 比 iptables 更熟悉。如果您使用的是类似 RedHat 的操作系统,firewalld 也可以让您通过非常短的命令来完成此操作。
你应该达到这样的目标。
线卫配置
您的 WG 子网与外部接口子网之间存在冲突。WG 子网需要独立。10.8.x.0/24 是常见的选择。放置一个随机的 x 可以“确保”它是唯一的。另外,在两侧设置 KeepAlive=20 将确保从路由器到 vps 的隧道数据包的防火墙冲孔保持打开。否则,如果一段时间没有通信,vps 可能无法通过隧道传输第一个数据包。
服务器wg0.conf
客户端配置
路由
在服务器(暴露在互联网上)上,检查以下命令输出:
应该显示类似
10.8.0.0/24 dev wg0 proto kernel scope link src 10.8.0.1
Or the most restrictive 的 内容10.8.0.2 dev wg0 proto kernel scope link src 10.8.0.1
。Ping
来自路由器的服务器,以及通过 10.8.0.0/24 子网的倒数。如果有效,WG 就会有效,您的路线也会有效。防火墙工作
首先需要检查路由器上的 Web 接口端口是否打开。因此,从服务器执行:
如果有效,转发到的端口将为 443,避免暴露 80,因为它会在互联网上被清除。 (如果只有普通 http 有效,您需要找到一种方法(如另一个 VPN)连接到您的服务器,以避免互联网上出现任何明文内容。或者使用 stunnel 进行封装,或者使用反向代理等。)
必须在内核中启用转发 echo 1 > /proc/sys/net/ipv4/ip_forward
现在有趣的来了! 参考号 http://www.do1618.com/wp-content/uploads/2016/06/netfilter_pkt_flow.png 需要以下规则。一旦确认其有效,您可以将它们全部嵌入由配置文件运行的服务器 Wiregard 命令中。让我们跟踪一个通过服务器的数据包。
(这将执行目标 nat:从互联网接收到的任何请求数据包都将看到其目标地址和端口被重写,甚至在到达路由检查之前。)
(内核路由系统将在路由检查时识别出它前往退出接口,而不是输入并传递到本地进程。因此数据包将通过前向钩子。此规则将允许来自外部的任何数据包需要转发的接口。
(然后数据包将根据路由表通过 wg0 发送出去。但是,如果保持原样,源 IP 地址仍然是来自互联网上请求者的 IP 地址。数据包将发送到路由器并被处理。但是路由器将回复原始源地址。如果没有更多信息并在路由器上进行工作,回复返回路径可能会有所不同。即使不进入内核反向路径策略设置故事,防火墙也可能不会让数据包到达或进入原始计算机.使用传出接口使用自动确定的源地址伪装 NAT。并且 NAT 在回复数据包上以另一种方式返回。参见下面的问题)
(这是为了允许回复数据包通过服务器从隧道到达互联网)。
(这是为了使路由器的回复不是来自 10.8.0.2,而是来自服务器公共地址。因此防火墙会让其返回到您的笔记本电脑。
陷阱
伪装wg0 接口有点肮脏。人们可能想要调整路由器,用一些元标记来标记传入数据包,并使用特定规则将回复标记的数据包路由回 WG 隧道。但这还需要一些工作,并且不确定路由器操作系统是否允许进行调整。这里唯一的缺点是路由器无法记录人们从哪里登录,它总是报告 10.8.0.1,无论你从哪里连接。
从安全角度来看,路由器上的 wg0 接口可让您访问路由器上的任何内容。看来它进入了Openwrt LAN 区域。 最初设置时没什么大不了的,但人们更愿意设置一个特定的防火墙区域,为其分配 wg0 接口,并仅允许端口 443 传入数据包。只要服务器是安全的,就不会发生任何其他事情它充当防火墙,但仍然如此。
提示 - 控制台上的网络分析器 Wireshark
在服务器上安装软件包“tshark”(Ubuntu)或wireshark-cli(Redhat)
将显示通过所有接口的数据包,不包括发送到笔记本电脑/PC 的 ssh 数据包,这会污染您的输出。