使用 Wireguard VPN 配置內部組
我是 VPN 的新手,所以請耐心等待。是否可以讓 WireGuard 使用這樣的配置工作?:我需要創建只能彼此看到且無法通過 VPN 訪問網際網路的電腦組。他們使用自己的網關。例如:
- A組有10個端點
- B組有40個端點
- C 組有 6 個端點,依此類推 - 最多可以有 15 個不同的組,有 6-40 個端點
- 每個組都有一些 SQL 服務,每個端點都啟用了 VNC
- 每個端點都可以訪問其組中的唯一端點。
- 端點使用自己的網際網路網關
- 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
啟用並啟動它。