Динамическая маршрутизация трафика через несколько туннелей GRE через IPsec
Исходные данные
Я изучаю сетевые вещи и правильную настройку StrongSwan.
Используя мой собственный SSL-сертификат с подстановочными знаками. Все туннели успешно подняты и авторизованы между собой, пингуются в любую из сторон, обозначенных в конфигурациях. Удаленные устройства успешно подключаются к хосту, но их трафик остается внутри этого хоста без дальнейшей пересылки. Авторизация удаленных пользователей осуществляется через плагин Radius.
Проблема, которую нужно решить
Организация VPN сети с общей точкой входа и несколькими точками выхода (динамический IP)
Доступны следующие выделенные хосты Ubuntu 20.04:
- Хост А (главный) — xx110.138
- Хост B (ведомый1) — xx166.115
- Хост C (ведомый2) — xx178.214
- Хост D (ведомый3) — xx140.120
Клиент RoadWarrior (macOS, iPhone, Android, Win10/11) подключается кmaster
хозяин. Далее клиентский трафик маршрутизируется случайным образом (в ближайшее время хотелось бы реализовать этот момент через балансировку нагрузки, но сначала нужно разобраться с основными настройками) на один из хостов. Если какой-либо из туннелей GRE к хосту не работает, исключите его из общей системы маршрутизации. При доступе к сети черезslave
хост, клиенту предоставляется IP-адрес хоста, на который он был перенаправлен.
Конфигурации выделенного хостинга
Мастер-хост (xx110.138)
/etc/sysctl.conf
net.ipv4.ip_forward = 1
/etc/netplan/01-grecfg.yaml
network:
version: 2
tunnels:
tunToSlave1:
mode: gre
local: x.x.110.138
remote: x.x.166.115
addresses: [10.0.2.1/24]
mtu: 1442
ttl: 255
tunToSlave2:
mode: gre
local: x.x.110.138
remote: x.x.178.214
addresses: [10.0.3.1/24]
mtu: 1442
ttl: 255
tunToSlave3:
mode: gre
local: x.x.110.138
remote: x.x.140.120
addresses: [10.0.4.1/24]
mtu: 1442
ttl: 255
/etc/ipsec.conf
config setup
charondebug="cfg 2, dmn 2, ike 2, net 2"
strictcrlpolicy = yes
conn %default
reauth = yes
rekey = yes
keyingtries = %forever
keyexchange = ikev2
dpdaction = restart
dpddelay = 5s
mobike = yes
conn tun-slave1
left = %defaultroute
right = x.x.166.115
authby = pubkey
leftcert = cert.pem
leftsendcert = always
leftauth = pubkey
rightauth = pubkey
leftid = @mydomain.com
rightid = @mydomain.com
rightrsasigkey = /etc/central/rsa.cert.pem
leftsubnet = %dynamic[gre]
rightsubnet = %dynamic[gre]
type = transport
ike = aes256gcm16-sha384-x25519!
esp = aes256gcm16-sha384-x25519!
auto = start
conn tun-slave2
left = %defaultroute
right = x.x.178.214
authby = pubkey
leftcert = cert.pem
leftsendcert = always
leftauth = pubkey
rightauth = pubkey
leftid = @mydomain.com
rightid = @mydomain.com
rightrsasigkey = /etc/central/rsa.cert.pem
leftsubnet = %dynamic[gre]
rightsubnet = %dynamic[gre]
type = transport
ike = aes256gcm16-sha384-x25519!
esp = aes256gcm16-sha384-x25519!
auto = start
conn tun-slave3
left = %defaultroute
right = x.x.140.120
authby = pubkey
leftcert = cert.pem
leftsendcert = always
leftauth = pubkey
rightauth = pubkey
leftid = @mydomain.com
rightid = @mydomain.com
rightrsasigkey = /etc/central/rsa.cert.pem
leftsubnet = %dynamic[gre]
rightsubnet = %dynamic[gre]
type = transport
ike = aes256gcm16-sha384-x25519!
esp = aes256gcm16-sha384-x25519!
auto = start
conn remote-mobile
dpddelay = 30s
left = %any
leftid = @mydomain.com
leftcert = cert.pem
leftsendcert = always
leftsubnet = 0.0.0.0/0,::/0
right = %any
rightid = %any
rightauth = eap-radius
rightsendcert = never
eap_identity = %identity
rightsourceip = 10.10.10.0/24
rightdns = 8.8.8.8
type = tunnel
ike=aes128gcm16-sha2_256-prfsha256-ecp256!
esp=aes128gcm16-sha2_256-ecp256!
auto = add
dpdaction = restart
ikelifetime = 240m
keylife = 60m
conn remote-pc
ike=aes256gcm16-aes256gcm12-aes128gcm16-aes128gcm12-sha256-sha1-modp2048-modp4096-modp1024,aes256-aes128-sha256-sha1-modp2048-modp4096-modp1024,3des-sha1-modp1024!
esp=aes128gcm12-aes128gcm16-aes256gcm12-aes256gcm16-modp2048-modp4096-modp1024,aes128-aes256-sha1-sha256-modp2048-modp4096-modp1024,aes128-sha1-modp2048,aes128-sha1-modp1024,3des-sha1-modp1024,aes128-aes256-sha1-sha256,aes128-sha1,3des-sha1!
ikelifetime=720m
keylife=60m
Хост-ведомый1 (xx166.115)
/etc/sysctl.conf
/etc/netplan/01-grecfg.yaml
network:
version: 2
tunnels:
tunToMaster:
mode: gre
local: x.x.166.115
remote: x.x.110.138
addresses: [10.0.2.2/24]
mtu: 1442
ttl: 255
/etc/ipsec.conf
config setup
charondebug="cfg 2, dmn 2, ike 2, net 2"
strictcrlpolicy = yes
conn %default
reauth = yes
rekey = yes
keyingtries = %forever
keyexchange = ikev2
dpdaction = restart
dpddelay = 5s
mobike = yes
conn gre-master
left = %defaultroute
right = x.x.110.138 <- slave1 local ip
authby = pubkey
leftcert = cert.pem
leftsendcert = always
leftauth = pubkey
rightauth = pubkey
leftid = @mydomain.com
rightid = @mydomain.com
rightrsasigkey = /etc/central/rsa.cert.pem
leftsubnet = %dynamic[gre]
rightsubnet = %dynamic[gre]
type = transport
ike = aes256gcm16-sha384-x25519!
esp = aes256gcm16-sha384-x25519!
auto = add
Хост-ведомый2 (xx178.214)
/etc/sysctl.conf
/etc/netplan/01-grecfg.yaml
network:
version: 2
tunnels:
tunToMaster:
mode: gre
local: x.x.178.214
remote: x.x.110.138
addresses: [10.0.3.3/24]
mtu: 1442
ttl: 255
/etc/ipsec.conf
config setup
charondebug="cfg 2, dmn 2, ike 2, net 2"
strictcrlpolicy = yes
conn %default
reauth = yes
rekey = yes
keyingtries = %forever
keyexchange = ikev2
dpdaction = restart
dpddelay = 5s
mobike = yes
conn gre-master
left = %defaultroute
right = <- slave2 local ip
authby = pubkey
leftcert = cert.pem
leftsendcert = always
leftauth = pubkey
rightauth = pubkey
leftid = @mydomain.com
rightid = @mydomain.com
rightrsasigkey = /etc/central/rsa.cert.pem
leftsubnet = %dynamic[gre]
rightsubnet = %dynamic[gre]
type = transport
ike = aes256gcm16-sha384-x25519!
esp = aes256gcm16-sha384-x25519!
auto = add
Хост-ведомый3 (xx140.120)
/etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv4.ip_no_pmtu_disc = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv6.conf.all.disable_ipv6 = 1
/etc/netplan/01-grecfg.yaml
network:
version: 2
tunnels:
tunToMaster:
mode: gre
local: x.x.140.120
remote: x.x.110.138
addresses: [10.0.4.4/24]
mtu: 1442
ttl: 255
/etc/ipsec.conf
config setup
charondebug="cfg 2, dmn 2, ike 2, net 2"
strictcrlpolicy = yes
conn %default
reauth = yes
rekey = yes
keyingtries = %forever
keyexchange = ikev2
dpdaction = restart
dpddelay = 5s
mobike = yes
conn gre-master
left = %defaultroute
right = x.x.110.138 <- slave3 local ip
authby = pubkey
leftcert = cert.pem
leftsendcert = always
leftauth = pubkey
rightauth = pubkey
leftid = @mydomain.com
rightid = @mydomain.com
rightrsasigkey = /etc/central/rsa.cert.pem
leftsubnet = %dynamic[gre]
rightsubnet = %dynamic[gre]
type = transport
ike = aes256gcm16-sha384-x25519!
esp = aes256gcm16-sha384-x25519!
auto = add
Вопросы
Как правильно определить параметры интерфейса для динамической маршрутизации? В частности, у меня возникли проблемы с правильной настройкой сетей/подсетей на уровне локального хоста. С помощью этого руководства мне удалось добиться рабочей схемы master->slave1 , но со многими хостами я испытываю трудности с пониманием :(
Для перечисленных конфигураций ipsec также открыт вопрос правильного определения сетей/подсетей - как правильно определить
leftsubnet/rightsubnet
параметры для каждого хоста в этой схеме взаимодействия или можно оставить просто%dynamic
ценить?Излишне ли в этом случае использовать Quagga для динамической маршрутизации?
Правильно ли определена схема взаимодействия набора хостов (master->slave) с ранее описанной задачей? Кстати, я пытался поднять туннели от подчиненных хостов до главного хоста, но каждый последующий туннель переопределяет предыдущий :\
Есть ли ошибки в параметрах интерфейсов и общих конфигах ipsec?
Какие правила мне следует установить для iptables на каждом хосте? Я предполагаю, что на каждом из трех подчиненных хостов необходимо как минимум назначить правило таблицы nat для маскировки. Не так давно я поднял всего 1 сервер с StrongSwan на борту и настроил следующие общие правила:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -p udp --dport 500 -j ACCEPT iptables -A INPUT -p udp --dport 4500 -j ACCEPT iptables -A FORWARD --match policy --pol ipsec --dir in --proto esp -s 10.10.10.0/24 -j ACCEPT iptables -A FORWARD --match policy --pol ipsec --dir out --proto esp -d 10.10.10.0/24 -j ACCEPT iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -m policy --pol ipsec --dir out -j ACCEPT iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE iptables -t mangle -A FORWARD --match policy --pol ipsec --dir in -s 10.10.10.0/24 -o eth0 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360 iptables -A INPUT -p icmp -j DROP iptables -A INPUT -j DROP iptables -A FORWARD -j DROP
Буду очень признателен за любую помощь, пояснения и полезную информацию.
Приветствую <3