使用 Wireguard VPN 配置内部组

使用 Wireguard VPN 配置内部组

我对 VPN 还很陌生,所以请耐心等待。WireGuard 是否可以使用这样的配置?:我需要创建只能互相看到且无法通过 VPN 访问互联网的 PC 组。它们使用自己的网关。例如:

  1. A 组有 10 个端点
  2. B 组有 40 个端点
  3. C 组有 6 个端点,依此类推 - 最多可以有 15 个不同的组,每个组有 6-40 个端点
  4. 每个组都有一些 SQL 服务,每个端点都有 VNC 启用
  5. 每个端点都可以访问其组中的唯一端点。
  6. 端点使用自己的网关连接互联网
  7. 端点之间的流量很低(每 60 秒进行一些 SQL 查询,有时进行 VNC 连接以提供支持)

可以使用 WireGuard 做到这一点吗?它是 WireGuard 的唯一配置吗?iptables 是否涉及很多?我可以寻求任何指导吗?

谢谢

答案1

为了隔离您的组,您需要配置具有多个路由表的 wireguard 的多个实例。

首先,为 vpn.example.com 创建 A 和 AAAA DNS 条目,解析为您的服务器的公共 IPv4 和 IPv6。

然后您就可以安装wireguard 包。(例如 dnf install wireguard-tools),然后生成私钥和公钥:

# Configure Wireguard folder
mkdir /etc/wireguard
cd /etc/wireguard
wg genkey | tee /etc/wireguard/privatekey | wg pubkey > /etc/wireguard/publickey
chmod 600 /etc/wireguard/*

接下来,在您的 VPN 服务器上启用转发:

# Enable forwarding
echo "net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1" > /etc/sysctl.d/89-forward.conf
sysctl --system

您现在可以配置您的组 A。大部分配置都在这里,在 PostUp 命令中。一旦创建了 wg2 接口,我们就会刷新 nftables,然后指定来自 wg2 ips 的传入流量进入组 A 路由表,并且我们只使用组 A 网络(没有默认路由,没有组 B 网络)填充组 A 路由表,因此组 A 发起的流量只能访问组 A 机器。

PreDown 取消了 PostUp 所做的配置,所有 [Interface] 部分都是服务器配置,[Peer] 部分是每个单独的 VPN 客户端。

服务器私钥在这里,公钥在客户端配置文件中(稍后)。客户端私钥在客户端配置文件中,公钥在这里。

# Configure groupA
echo "[Interface]
Address = 192.168.2.1/24, fd00:2::1/48
PrivateKey = [/etc/wireguard/privatekey value here]
PostUp=nft -f /etc/nftables.conf && ip rule add from 192.168.2.0/24 lookup groupa && ip -6 rule add from fd00:2::/48 lookup groupa && ip route add 192.168.2.0/24 dev wg2 proto kernel scope link src 192.168.2.1 table groupa && ip route add fd00:2::/48 dev wg2 proto kernel metric 256 pref medium table groupa
PreDown=nft -f /etc/nftables.conf && ip route del 192.168.2.0/24 dev wg2 proto kernel scope link src 192.168.2.1 table groupa && ip route del fd00:2::/48 dev wg2 proto kernel metric 256 pref medium table groupa
ListenPort = 51820
[Peer]
PublicKey = bbb
PresharedKey = ccc
AllowedIPs = 192.168.2.2/32, fd00:2::2/128
[Peer]
PublicKey = ddd
PresharedKey = eee
AllowedIPs = 192.168.2.3/32, fd00:2::3/128" > /etc/wireguard/wg2.conf

B 组,有新的路由表、新的 wg3 接口、新的监听端口和新的网络:

# Configure groupB
echo "[Interface]
Address = 192.168.3.1/24, fd00:3::1/48
PrivateKey = [/etc/wireguard/privatekey value here]
PostUp=nft -f /etc/nftables.conf && ip rule add from 192.168.3.0/24 lookup groupb && ip -6 rule add from fd00:3::/48 lookup groupb && ip route add 192.168.3.0/24 dev wg3 proto kernel scope link src 192.168.3.1 table groupb && ip route add fd00:3::/48 dev wg3 proto kernel metric 256 pref medium table groupb
PreDown=nft -f /etc/nftables.conf && ip route del 192.168.3.0/24 dev wg3 proto kernel scope link src 192.168.2.1 table groupb && ip route del fd00:3::/48 dev wg3 proto kernel metric 256 pref medium table groupb
ListenPort = 51821
[Peer]
PublicKey = ggg
PresharedKey = hhh
AllowedIPs = 192.168.2.2/32, fd00:2::2/128
[Peer]
PublicKey = iii
PresharedKey = jjj
AllowedIPs = 192.168.2.3/32, fd00:2::3/128" > /etc/wireguard/wg3.conf

我不再使用 iptables,这是 nftables 版本,这样我就不会犯愚蠢的错误。您可以使用它或将其转换为 iptables。这是一个简单的配置:在输入中接受 icmp、ssh 和 wireguard,在输出中接受任何内容,以及允许 wireguard 客户端进行通信的转发部分。如果您只想允许某些端口,则可以在过滤中更具体。

# Configure nftables
echo 'flush ruleset
define wan = eth0
define groupa = wg2
define groupb = wg3
table inet x {
chain input {
type filter hook input priority filter; policy drop;
ct state established,related counter packets 0 bytes 0 accept
iifname "lo" accept
icmp type echo-request accept
icmpv6 type { nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert, echo-request } accept
tcp dport 22 ct state new,untracked accept
udp dport { 51820, 51821 } iif $wan ct state new,untracked accept
ip6 daddr fe80::/64 udp dport 546 ct state new,untracked accept
}
chain output {
type filter hook output priority filter; policy accept;
}
chain forward {
type filter hook forward priority 0; policy drop;
ct state established,related counter packets 0 bytes 0 accept
ip protocol { icmp, tcp, udp } iif $groupa oif $groupa accept
ip6 nexthdr { icmpv6, tcp, udp } iif $groupa oif $groupa accept
ip protocol { icmp, tcp, udp } iif $groupb oif $groupb accept
ip6 nexthdr { icmpv6, tcp, udp } iif $groupb oif $groupb accept
}
}
' > /etc/nftables.conf

这里有一个在 A 组中创建新客户端的脚本。您必须通过在开始时设置的 DNS 名称更改 FQDNSERVER 值,或者设置服务器 IP 地址。

您正在为客户端配置文件生成私钥,并为服务器配置文件生成关联的公钥。CLIENT 变量仅捕获上次使用的 IP,因此如果它是 192.168.2.10,则下一个客户端将使用 192.168.2.11。由于我们使用上一个 IP 来生成下一个 IP,因此请不要删除服务器配置文件中的示例地址。

在 [Peer] 部分中,AllowedIPs 是一个 ACL。服务器端,我们仅授权客户端 IP。客户端,我们授权 groupa 网络。

echo '#!/bin/bash
FQDNSERVER="vpn.example.com"
PRIVATE=`wg genkey`
PUBLIC=`echo ${PRIVATE} | wg pubkey`
PSK=`wg genpsk`
SRVPUBLICKEY=`cat /etc/wireguard/publickey` 
CLIENT="$((`cat wg2.conf | tail -n 1 | cut -d . -f 4 | cut -d / -f 1` + 1))"
echo "[Peer]
PublicKey = ${PUBLIC}
PresharedKey = ${PSK}
AllowedIPs = 192.168.2.${CLIENT}/32, fd00:2::${CLIENT}/128" >> wg2.conf
echo "[Interface]
Address = 192.168.2.${CLIENT}/32, fd00:2::${CLIENT}/48
PrivateKey = ${PRIVATE}' > /etc/wireguard/newgroupa.sh
echo "[Peer]
PublicKey = ${SRVPUBLICKEY}
PresharedKey = ${PSK}
AllowedIPs = 192.168.2.0/24, fd00:2::/48
Endpoint = ${FQDNSERVER}:51820" >> /etc/wireguard/newgroupa.sh
echo 'PersistentKeepalive = 30" > client${CLIENT}.conf
cat clienta${CLIENT}.conf
systemctl restart [email protected]' >> /etc/wireguard/newgroupa.sh 
chmod +x newgroupa.sh

B组脚本:

echo '#!/bin/bash
FQDNSERVER="vpn.example.com"
PRIVATE=`wg genkey`
PUBLIC=`echo ${PRIVATE} | wg pubkey`
PSK=`wg genpsk`
SRVPUBLICKEY=`cat /etc/wireguard/publickey` 
CLIENT="$((`cat wg3.conf | tail -n 1 | cut -d . -f 4 | cut -d / -f 1` + 1))"
echo "[Peer]
PublicKey = ${PUBLIC}
PresharedKey = ${PSK}
AllowedIPs = 192.168.3.${CLIENT}/32, fd00:3::${CLIENT}/128" >> wg3.conf
echo "[Interface]
Address = 192.168.3.${CLIENT}/32, fd00:3::${CLIENT}/48
PrivateKey = ${PRIVATE}' > /etc/wireguard/newgroupb.sh
echo "[Peer]
PublicKey = ${SRVPUBLICKEY}
PresharedKey = ${PSK}
AllowedIPs = 192.168.3.0/24, fd00:3::/48
Endpoint = ${FQDNSERVER}:51821" >> /etc/wireguard/newgroupb.sh
echo 'PersistentKeepalive = 30" > client${CLIENT}.conf
cat clientb${CLIENT}.conf
systemctl restart [email protected]' >> /etc/wireguard/newgroupb.sh 
chmod +x newgroupb.sh

在这里,我们添加新的路由表。

# Configure table
echo '2 groupa' >> /etc/iproute2/rt_tables 
echo '3 groupb' >> /etc/iproute2/rt_tables 

由于我在这里使用 nftables,因此我禁用了任何其他防火墙并确保它已启用。此外,我们可以启用 wireguard 服务。

# Disable firewalld (or ufw or else)
systemctl disable firewalld
systemctl stop firewalld

# Enable services on boot
systemctl enable nftables --now
systemctl enable [email protected] [email protected] --now

现在您可以看到您的接口、地址、路由表、指向路由表的规则和 wireguard 客户端。

ip l
ip a 
ip r 
ip r show table groupa 
ip r show table groupb 
ip rule 
wg show

配置和脚本基于我在生产中使用的 Wireguard,尽管我确实在未经测试的情况下为您重写了它们,因此仅通过复制/粘贴可能无法正常工作。不过,这可能是一个很好的起点,如果您有问题,我会回答您的问题。

当您使用 newgroupa.sh 或 newgroupb.sh 时,会生成一个配置文件。您可以将其复制到客户端计算机,然后将其导入wireguard 客户端

如果客户端是 Windows / MacOS / Android / iOS,您可以使用图形界面来导入它。如果是 Linux,您可以安装 wireguard,将 clientaxx.conf 复制到 /etc/wireguard,然后启用并启动它。systemctl enable [email protected] --now

相关内容