背景:
我已在本地(专用)网络上配置了 Wireguard VPN 服务器。[假设专用网络:192.168.1.0/24] Wireguard 客户端具有相同的 IP 网络 192.168.1.X
我的网络中存在一些具有静态本地 IP 地址的非 Wireguard 兼容设备(IP 摄像机、DVR)。
查询:
当我作为 Wireguard 客户端连接到 Wireguard 服务器(从本地网络外部)时,我想使用其本地静态 IP 地址访问那些非 Wireguard 兼容设备。我已经确保不会有任何IP冲突。
以下是我想要实现的目标。有人可以提出具有具体步骤的解决方案吗?如果 Wireguard 无法满足要求,替代解决方案是什么?
两个站点(RA 和 RB)上的路由器都有静态公共 (WAN) IP 地址和域名。每个站点上都有一个运行的 Wireguard 服务器。
两个站点上的所有设备都有静态 LAN 地址。
某些设备不具备支持 Wireguard 客户端连接到 Wireguard 服务器的功能。
两个站点都具有相同的本地网络 (192.168.1.0/24)。
两个路由器都有不同的 DHCP 范围。大多数设备都位于静态 LAN 地址上。
要求:
当两台 Wireguard 服务器均已启动并运行时。我可以将每台服务器作为 Wireguard 客户端连接到其他 Wireguard 服务器,以便可以连接这两个站点吗?
当两个站点都通过 Wireguard 连接时,我可以从站点 B 访问站点 A 设备吗?反之亦然?
如果我可以从外部 Wireguard 客户端连接到任何 Wireguard 服务器,我可以访问两个站点上的设备吗?
操作系统:Debian 12
我经常从事 OPSEC 工作,因为安全对我来说非常重要。现在我有一个新的路由器,当我插入 LAN 电缆时,它会在我的计算机上打开一个端口。当我断开 LAN 电缆时,该端口被关闭。我的路由器上没有配置端口转发
未插入 LAN:
$ sudo ss -lntup
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
udp UNCONN 0 0 192.168.122.1:53 0.0.0.0:* users:(("dnsmasq",pid=2717,fd=5))
tcp LISTEN 0 32 192.168.122.1:53 0.0.0.0:* users:(("dnsmasq",pid=2717,fd=6))
Run Code Online (Sandbox Code Playgroud)
局域网已插入:
$ sudo ss -lntup
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
udp UNCONN 0 0 192.168.122.1:53 0.0.0.0:* users:(("dnsmasq",pid=2717,fd=5))
udp UNCONN 0 0 0.0.0.0:33955 0.0.0.0:*
tcp LISTEN 0 32 192.168.122.1:53 0.0.0.0:* users:(("dnsmasq",pid=2717,fd=6))
Run Code Online (Sandbox Code Playgroud)
当我重新插入 LAN 时,它会打开另一个端口:
$ sudo ss -lntup
udp …
Run Code Online (Sandbox Code Playgroud) 我有两个家庭 LAN(相距 100 公里)通过互联网提供商路由器连接到互联网,并希望它们通过两台单板计算机(NanoPi R2S)与wireguard VPN 连接。NanoPi R2S 板已经安装了armbian 和wireguard。
其中一个互联网连接具有静态和其他动态互联网 IP。两者都是在动态DNS中输入的,现在我有机会在nanopis上安装动态DNS客户端,因为路由器上的客户端不能很好地工作。我可以通过两个互联网路由器上的 NAT 虚拟服务器功能公开wireguard 计算机。
站点A:
站点B:
我认为站点 B 会建立从动态 IP 站点到站点 B 公开的服务器端口的连接。
那么站点 A (192.168.0.0/24) 上的所有计算机都应该有一条附加路由,该路由将通过 192.168.0.250 将流量引导至站点 B (192.168.1.0/24)。同样,站点 B (192.168.1.0/24) 上的所有计算机都应具有通过 192.168.1.250 引导站点 A (192.168.0.0/24) 流量的路由。那行得通吗?
我应该为 wg0 接口分配哪些 IP?10.0.0.0/24?那么路线会是什么样子呢?那么如何路由 10.0.0.0/24 流量呢?我需要路由它吗?我应该如何配置wireguard?我想我不需要 Wireguard 的确切命令。我只需要指导,如何组织流量(IP、路由)。
使用 eth0 和 wg0,NanoPi …
有没有办法将 Linuxwireguard 模块配置为仅侦听特定 IP 地址的传入连接,而不是默认侦听所有可用地址?我找不到这方面的任何文档。
wg0
假设我有一个名为的wireguard 网络10.0.0.1/24
。我使用 systemd 在启动时启动它:
# systemctl enable wg-quick@wg0
Run Code Online (Sandbox Code Playgroud)
我希望 sshd 仅侦听wireguard 地址 ,10.0.0.1
而不是0.0.0.0
。所以我设置ListenAddress
了/etc/ssh/sshd_config
:
ListenAddress 10.0.0.1
#ListenAddress ::
AddressFamily inet
Run Code Online (Sandbox Code Playgroud)
注意:我设置了地址族,因为我在这里仅使用 IPv4 而不是 IPv6。我认为如果不设置,ssh将继续监听::
IPv6。
如果我保存配置并重新启动 sshd,效果很好。但是服务器重新启动后,尽管在 systemd 中启用了 ssh,但仍无法启动。系统日志输出告诉我们原因:
sshd[xxx]: error: Bind to port 22 on 10.0.0.1 failed: Cannot assign requested address.
Run Code Online (Sandbox Code Playgroud)
显然,我们有一个竞争条件,即 sshd 在 Wireguard 接口准备好之前尝试(但失败)启动。
显而易见的解决方案是编辑/etc/systemd/system/sshd.service
并添加wg-quick@wg0
为依赖项。After=
然而, 、Wants=
、 或的组合并Requires=
不能解决问题。似乎wg-quick@wg0
报告它已经完成,尽管网络接口实际上还没有准备好。
是否可以将配置命令拆分为多行而不是一个长字符串?
例如
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)
当使用更多命令时,该行会变得很长且难以阅读。我想将其拆分,以便每个命令可以使用一行。就像是:
PostUp = iptables -A FORWARD -i %i -j ACCEPT; \
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)
手册页说它基于 ini 格式,但对此主题没有任何帮助。
我与 5 个对等点建立了 Wireguard 网络。所有这些作品之间的联系。但对于一个对等点,我必须对他执行 ping 操作,或者采取其他措施来保持连接。如果我有几分钟没有使用 Wireguard 上的对等点,我必须重新启动 Wireguard 接口才能再次获得连接。
客户端是一个虚拟机,运行在 KVM / Debian 11 上。
公共IP上的Web服务器始终可以访问。