我对 VPN 还很陌生,所以请耐心等待。WireGuard 是否可以使用这样的配置?:我需要创建只能互相看到且无法通过 VPN 访问互联网的 PC 组。它们使用自己的网关。例如:
- A 组有 10 个端点
- B 组有 40 个端点
- C 组有 6 个端点,依此类推 - 最多可以有 15 个不同的组,每个组有 6-40 个端点
- 每个组都有一些 SQL 服务,每个端点都有 VNC 启用
- 每个端点都可以访问其组中的唯一端点。
- 端点使用自己的网关连接互联网
- 端点之间的流量很低(每 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