Iptables

使用 Wireguard VPN 配置內部組

  • November 12, 2020

我是 VPN 的新手,所以請耐心等待。是否可以讓 WireGuard 使用這樣的配置工作?:我需要創建只能彼此看到且無法通過 VPN 訪問網際網路的電腦組。他們使用自己的網關。例如:

  1. A組有10個端點
  2. B組有40個端點
  3. C 組有 6 個端點,依此類推 - 最多可以有 15 個不同的組,有 6-40 個端點
  4. 每個組都有一些 SQL 服務,每個端點都啟用了 VNC
  5. 每個端點都可以訪問其組中的唯一端點。
  6. 端點使用自己的網際網路網關
  7. endints 之間的流量很低(一些 sql 查詢每 60 秒,有時 vnc 連接以獲得支持)

是否可以使用 WireGuard 做到這一點?它是 WireGuard 的唯一配置嗎?iptables 涉及很多嗎?我可以要求任何指導嗎?

謝謝

為了隔離您的組,您需要使用多個路由表配置多個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 的傳入流量進入 groupa 路由表,並且我們僅使用 groupa 網路(沒有預設路由,沒有 groupb 網路)填充 groupa 路由表,所以groupa 發起的流量只能訪問 groupa 機器。

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 名稱更改 FQDSERVER 值,或者改為設置伺服器 IP 地址。

您正在為客戶端配置文件生成私鑰,並為伺服器配置文件生成關聯的公鑰。CLIENT 變數只是擷取最後使用的 IP,所以如果是 192.168.2.10,下一個客戶端將使用 192.168.2.11。由於我們使用之前的 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 wg-quick@wg2.service' >> /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 wg-quick@wg3.service' >> /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 wg-quick@wg2.service wg-quick@wg3.service --now

現在,您可以看到您的介面、地址、路由表、指向路由表的規則和線保護客戶端。

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 wg-quick@clientaxx.service --now啟用並啟動它。

引用自:https://serverfault.com/questions/1040635