Настройка внутренних групп с помощью Wireguard VPN

Я очень новичок в VPN, так что проявите терпение. Можно ли заставить WireGuard работать с таким конфигом ?: Мне нужно создать группы компьютеров, которые могут видеть только друг друга и не имеют доступа к Интернету через VPN. Они используют свой собственный шлюз. Например:

  1. Группа A имеет 10 конечных точек
  2. Группа B имеет 40 конечных точек
  3. Группа C имеет 6 конечных точек и так далее - может быть до 15 различных групп с 6-40 конечными точками
  4. каждая группа имеет некоторый SQL служба, и каждая конечная точка имеет VNC позволяет
  5. каждая конечная точка может получить доступ к единственной конечной точке из своей группы.
  6. конечная точка использует свой собственный шлюз для Интернета
  7. трафик между конечными точками низкий (некоторые запросы sql каждые 60 секунд, а иногда vnc соединение для поддержки)

Возможно ли это с WireGuard? Это единственный конфиг с WireGuard? Много ли задействован iptables? Могу я спросить какие-либо рекомендации?

спасибо

1
задан 30 October 2020 в 19:02
1 ответ

Чтобы изолировать ваши группы, вам необходимо настроить несколько экземпляров wireguard с несколькими таблицами маршрутизации.

Сначала создайте DNS-запись A и AAAA для vpn.example.com, разрешающую доступ к общедоступным 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. Мы обновляем nftables после создания интерфейса wg2, затем указываем, что входящий трафик от ips wg2 направляется в таблицу маршрутизации groupa, и мы заполняем таблицу маршрутизации groupa только сетью groupa (нет маршрута по умолчанию, нет сети groupb), поэтому Трафик, исходящий от группы, может получить доступ только к машинам группы.

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. Вам нужно изменить значение FQDNSERVER на DNS-имя, которое вы установили в начале, или вместо этого установить 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

Теперь вы можете видеть свои интерфейсы, адреса, таблицы маршрутизации, правила для направления к таблицам маршрутизации и клиентов 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 (hidden) --now, чтобы включить и запустить его.

2
ответ дан 3 November 2020 в 17:03

Теги

Похожие вопросы