24

我对 Wireguard 的理解是服务端和客户端的接口(虽然看起来听不清?)都有自己的.conf文件。例如考虑以下.conf文件。

[Interface]
PrivateKey = some_key_1
Address = 10.193.130.174/16


[Peer]
PublicKey = some_key_2
PresharedKey = some_key_3
AllowedIPs = 10.129.130.1/32
Endpoint = 54.91.5.130:1952

如何判断这是客户端文件还是服务器.conf文件(如果可能的话)?Endpoint这可能是一个非常简单的问题,但是和AllowedIPs字段之间有什么区别[Peer]?我从CryptoKey Routing推断,一旦interface接收到一个数据包,它就会使用interface私钥对其进行解密,并AllowedIPs根据所有内容检查发件人 IP peers,如果凭据实际上与它匹配,peer它是否接受它。另一方面,如果interface要发送一个数据包,它会使用peer公钥对其进行加密,但它会将其发送到Endpoint或其中一个AllowedIPs

编辑 1:我确实使用man wg过,但对我来说,定义Endpoint仍然很模糊。然而,该AllowedIPs领域似乎更容易掌握。

编辑 2:经过进一步研究,我认为该AllowedIPs字段指定了对等方可用于接收流量或向其发送流量的 IP 地址。如果有人可以确认或纠正这一点,我将不胜感激。

4

3 回答 3

54

是的,每个接口都有自己的配置文件。WireGuard 没有内置的“客户端”或“服务器”角色——每个节点都被视为“对等点”。

如果您有两个对等点,对等点 A 和对等点 B,则对等点 A 的配置文件将在部分中包含其自己的本地接口[Interface]的设置,并在部分中包含其与对等点 B 的远程连接的设置[Peer]。类似地,Peer B 的配置文件将在该部分中具有其自己的本地接口[Interface]的设置,并在一个部分中具有其与 Peer A 的远程连接的设置[Peer]。所以[Interface]Peer A 的配置中的[Peer]部分对应于 Peer B 的配置中的部分;并且[Interface]Peer B 的配置部分对应于[Peer]Peer A 的配置部分。


端点[Peer]配置部分)是远程对等方的“真实”IP 地址和端口,在 WireGuard VPN 之外。此设置告诉本地主机如何连接到远程对等方以设置 WireGuard 隧道。

在示例配置中,Endpoint = 54.91.5.139:1952对于远程对等点,通过该对等点的虚拟 WireGuard 隧道路由的任何数据包实际上都将被加密,包装在一组新的 UDP 数据包中,并通过 Internet(或其他一些“真实”网络,像您的公司网络)到54.91.5.139UDP 端口1952

除非您还在 WireGuard 之外的本地主机上进行一些花哨的路由,如果您尝试从本地主机发送 ping 数据包到此端点(例如ping 54.91.5.139),或者如果您尝试从远程对等点访问其他服务通过此端点地址的本地主机(例如,http://54.91.5.139/在 Web 浏览器中导航到),您将不会使用 WireGuard 隧道——您将使用常规 Internet(或其他“真实”网络)连接。

AllowedIPs[Peer]配置部分)是本地主机应通过 WireGuard 隧道路由到远程对等方的 IP 地址集。此设置告诉本地主机隧道中的内容。

在示例配置中,AllowedIPs = 10.129.130.1/32对于远程对等点,本地主机上的任何数据包10.129.130.1都不会直接通过您的常规 Internet(或其他“真实”网络)连接发送,而是首先发送到虚拟 WireGuard 隧道。WireGuard 将对它们进行加密,将它们包装在一组新的 UDP 数据包中,然后通过 Internet(或其他“真实”网络)将它们发送到对等端的端点,54.91.5.139. 从那里,对等方将解包和解密数据包,并尝试将它们转发到10.129.130.1.

因此,如果您尝试将 ping 数据包从本地主机发送到10.129.130.1(例如ping 10.129.130.1),或尝试访问其他服务10.129.130.1(例如,http://10.129.130.1在 Web 浏览器中导航到),您使用 WireGuard 隧道。

相反,就像您提到的那样,对于从该远程对等方通过隧道到达的数据包,如果它们一旦解包和解密,则具有由指定的块之外的源 IP AllowedIPs(例如,源 IP 是10.1.1.1而不是10.129.130.1),本地主机将删除它们。

地址[Interface]配置部分)是本地主机的虚拟 IP 地址,在 WireGuard VPN 中。此设置会影响进出 WireGuard 隧道的数据包的路由,因此不应可在 VPN 之外路由的“真实”IP 地址。

在示例配置中Address = 10.193.130.174/16,WireGuard VPN 中本地主机的虚拟 IP 地址为10.193.130.174。因此,本地主机通过 WireGuard 隧道发送的来自本地套接字的任何数据包的源地址都将为10.193.130.174,并且它从隧道接收到的目标地址10.193.130.174为WireGuard 之外的精美路由)。

假设主机的“真实”网络地址是10.10.10.10. 如果从主机运行ping 10.129.130.1,主机将生成源地址为10.193.130.174,目的地址为 的ping 数据包10.129.130.1,并通过 WireGuard 隧道发送。WireGuard 将加密这些数据包,并用源地址为 的 UDP 数据包包装它们10.10.10.10,源端口为51820(WireGuard 默认,因为ListenPort在配置中未指定),目标地址为54.91.5.139,目标端口为1952。然后它将这些 UDP 数据包发送到“真实”网络。

54.91.5.139当远程对等点在 IP 地址和 UDP 端口上侦听“真实”网络接口时1952,接收到这些数据包,它将解包和解密它们。然后,它将以原始形式在自己的网络堆栈上重新排队,作为源地址为10.193.130.174、目标地址为 的 ICMP 数据包10.129.130.1

如果原始主机收到来自该远程对等方的 ping 回复,它最初会从“真实”网络接口作为 UDP 数据包接收,源地址为54.91.5.139,源端口为1952,目标地址为10.10.10.10,并且的目的港51820。WireGuard 会将这些数据包解包并解密回它们的原始形式,作为具有源地址10.129.130.1和目标地址的ICMP 数据包10.193.130.174,然后将它们重新排队。由于虚拟 WireGuard 接口的 IP 地址是10.193.130.174(通过Address设置配置),本地主机将知道将这些数据包路由回本地套接字。


请注意,为Address设置指定网络掩码(/16在我们的示例中)会影响本地主机做出的关于应该将哪些流量发送到隧道(以及如何处理隧道接收的流量)的路由决策,其方式可以是多余的,或与AllowedIPs设置有交叉的目的。在我们的示例中Address = 10.193.130.174/16,这通常会导致发往该10.193.x.x范围内任何地址的所有流量都被路由到本地主机上的这个 WireGuard 接口(不包括接口自己的地址,10.193.130.174它将被路由到环回接口)。

但是,AllowedIPs我们示例中唯一对等点的设置不包括10.193.x.x范围内的任何内容。因此,如果我们ping 10.193.0.1在主机上运行,​​主机会生成源地址为10.193.130.174,目的地址为 的ping 数据包10.193.0.1,并通过 WireGuard 隧道发送。但由于该目标地址不适合AllowedIPs任何已配置的对等方,WireGuard 会丢弃这些数据包。

所以通常最简单的方法是在Address设置中省略网络掩码(对于 IPv4 地址,或使用/32,具有相同的效果),并且仅使用AllowedIPs每个对等方的设置来控制路由到它的内容。通常,只有当您有许多不同的对等点使用相同的虚拟子网时(或者如果您在 WireGuard 之外进行一些花哨的路由),您才会指定网络掩码。


还有一点需要了解的Endpoint是,您只需将其设置在 WireGuard 隧道的一侧(但如果双方都有静态 IP,则可以在两侧设置)。如果您Endpoint在 Peer A 的配置中为 Peer B 设置了一个,但在 Peer B 的配置中为 Peer A 省略了它,则 Peer A 将能够启动并设置与 Peer B 的隧道,而 Peer B 不必提前知道 Peer A 的端点的时间。

如果对等点 A 具有动态分配的公共 IP 地址,这是理想的;但缺点是对等点 B 将无法启动隧道——它必须等待对等点 A 连接到它。如果您有时需要 Peer B 启动与 Peer A 的连接,您可以通过PersistentKeepalive在 Peer A 的配置中包含 Peer B 的设置来缓解这种情况——这将指示 Peer A 每 N 秒主动伸出并连接到 Peer B(其中 N 是您在PersistentKeepalive设置中输入的值)。

于 2020-12-26T02:05:32.420 回答
1

对于路德维希先生的回答,我真的没什么可补充的。WireGuard 的设计有点简单。尽管如此,这是我当前设置的一个示例,包括“服务器”端的 nftables 规则,允许所有“客户端”对等方 ping 我的 LAN 上的机器。

服务器配置(Ubuntu),存储在/etc/wireguard/wg0.conf. 本地 LAN 地址192.168.2.0/24,此特定服务器地址位于192.168.2.1LAN 接口和192.168.3.1VPN (WireGuard) 接口 ( wg0) 上。分配给 WireGuard VPN 的地址是192.168.3.0/24

[Interface]
Address = 192.168.3.1/24
#SaveConfig = true
ListenPort = 51820
PrivateKey = +N3K<redacted>

# Peer configurations
[Peer]
PublicKey = h/tr<redacted>
AllowedIPs = 192.168.3.0/24

客户端(或对等)配置(Windows),存储在 Windows 的官方 WireGuard 客户端上(不确定文件或注册表当前所在的位置)。本地 VPN 地址为192.168.3.2

[Interface]
PrivateKey = gIIB<redacted>
Address = 192.168.3.2/24

[Peer]
PublicKey = od4j<redacted>
AllowedIPs = 192.168.3.0/24, 192.168.2.0/24
Endpoint = <MyFreeDdnsDomainOn>.duckdns.org:51820
PersistentKeepalive = 25

Ubuntu(服务器)端的nftables/etc/nftables.conf规则,存储在 中,包括我的防火墙规则:

define wan = "eth0"
define lan = "br0"
define lo = "lo"
define vpn = "wg0"

table ip nat {
        chain PREROUTING {
                # priority dstnat = -100.
                type nat hook prerouting priority dstnat; policy accept;
        }

        chain INPUT {
                # priority srcnat = 100.
                type nat hook input priority 100; policy accept;
        }

        chain OUTPUT {
                # priority dstnat = -100.
                type nat hook output priority -100; policy accept;
        }

        # For all packets to WAN (eth0), after routing, replace the source address
        # with the primary IP of WAN interface (masquerade).
        # Also necessary to enable masquerade on LAN for WireGuard (VPN).
        chain POSTROUTING {
                # priority srcnat = 100.
                type nat hook postrouting priority srcnat; policy accept;
                oifname $wan counter masquerade
                oifname $lan counter masquerade
        }
}

# Allow all outgoing, but drop incoming and forwarding packets by default:
table ip filter {
        chain INPUT {
                type filter hook input priority filter; policy drop;
                # Boilerplate acceptance policy.
                iifname $lo counter accept
                iifname $lan counter accept
                iifname $vpn counter accept
                # Accept already established and related connections.
                iifname $wan ct state established,related counter accept
                # Drop invalid packets.
                iifname $wan ct state invalid counter drop
                # Pass traffic to protocol-specific chains:
                # Only allow new connections (established and related should already be handled)
                # For TCP, additionally only allow new SYN packets since that is the only valid
                # method for establishing a new TCP connection.
                iifname $wan ip protocol udp ct state new counter jump UDP
                iifname $wan tcp flags & (fin | syn | rst | ack) == syn ct state new counter jump TCP
                iifname $wan ip protocol icmp ct state new counter jump ICMP
                # Drop anything that's fallen through to this point.
                counter drop
        }

        chain FORWARD {
                type filter hook forward priority filter; policy drop;
                # Forward filtering boilerplate rules.
                iifname $wan oifname $lan ct state established,related counter accept
                iifname $vpn oifname $lan counter accept
                iifname $lan oifname $vpn counter accept
                iifname $lan oifname $wan counter accept
        }

        chain OUTPUT {
                type filter hook output priority filter; policy accept;
        }

        # Custom per-protocol chains:
        chain ICMP {
        }

        # Acceptable TCP traffic:
        chain TCP {
                # Example:
                #iifname $wan tcp dport 51413 counter accept
        }

        # Acceptable UDP traffic:
        chain UDP {
                # Allow WireGuard
                iifname $wan udp dport 51820 counter accept
        }
}

于 2021-07-20T19:40:44.700 回答
0

端点是wireguard 可以通过云连接的URL。所以它应该包含公共 IP 地址和端口号。

Allowed-ips 是将路由到对等方的地址列表。确保指定至少一个包含 WireGuard 连接的内部 IP 地址的地址范围。

所以 Endpoint 有公共 IP 地址,但 Allowed-ips 是地址列表(Wireguard 连接的内部 IP 地址)

于 2020-12-25T03:02:22.830 回答