Динамическая маршрутизация трафика через несколько туннелей GRE через IPsec

Исходные данные

Я изучаю сетевые вещи и правильную настройку StrongSwan.

Используя мой собственный SSL-сертификат с подстановочными знаками. Все туннели успешно подняты и авторизованы между собой, пингуются в любую из сторон, обозначенных в конфигурациях. Удаленные устройства успешно подключаются к хосту, но их трафик остается внутри этого хоста без дальнейшей пересылки. Авторизация удаленных пользователей осуществляется через плагин Radius.


Проблема, которую нужно решить

Организация VPN сети с общей точкой входа и несколькими точками выхода (динамический IP)

Доступны следующие выделенные хосты Ubuntu 20.04:

  1. Хост А (главный) — xx110.138
  2. Хост B (ведомый1) — xx166.115
  3. Хост C (ведомый2) — xx178.214
  4. Хост 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

Вопросы

  1. Как правильно определить параметры интерфейса для динамической маршрутизации? В частности, у меня возникли проблемы с правильной настройкой сетей/подсетей на уровне локального хоста. С помощью этого руководства мне удалось добиться рабочей схемы master->slave1 , но со многими хостами я испытываю трудности с пониманием :(

  2. Для перечисленных конфигураций ipsec также открыт вопрос правильного определения сетей/подсетей - как правильно определитьleftsubnet/rightsubnetпараметры для каждого хоста в этой схеме взаимодействия или можно оставить просто%dynamicценить?

  3. Излишне ли в этом случае использовать Quagga для динамической маршрутизации?

  4. Правильно ли определена схема взаимодействия набора хостов (master->slave) с ранее описанной задачей? Кстати, я пытался поднять туннели от подчиненных хостов до главного хоста, но каждый последующий туннель переопределяет предыдущий :\

  5. Есть ли ошибки в параметрах интерфейсов и общих конфигах ipsec?

  6. Какие правила мне следует установить для 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

0 ответов

Другие вопросы по тегам