Рейтинг:0

Маршрутизация трафика через туннель IPSec с узлом шлюза

флаг pk

Принимая во внимание вики, кажется, это стандартная проблема, но я не могу заставить ее работать правильно.

Схема сети

схема сети

Местный сайт (клиент и шлюз) находится под моим контролем, удаленный сайт (удаленный шлюз и удаленный сервер) не является. Туннель IPSec представляет собой разделенный туннель таким образом, что только запросы к 10.10.0.0/16 подсети отправляются через туннель IPSec.

Цель

я бы хотел клиент общаться с удаленный сервер, например создать ssh или кто-л. связь.

Что я уже сделал

  • Я установил туннель IPSec между шлюз и удаленный шлюз.

  • Я включил переадресацию ip на шлюз:

    sysctl net.ipv4.ip_forward=1
    
  • Я создал NAT на шлюз:

    iptables -t nat -I POSTROUTING -m policy --pol ipsec --dir out -j ПРИНЯТЬ
    iptables -t nat -A POSTROUTING -j MASQUERADE
    
  • На клиент Я направил трафик через шлюз:

    ip маршрут по умолчанию
    ip route добавить по умолчанию через 192.168.144.4
                           # 192.168.144.4 это шлюз
    

Что работает

  • Туннель IPSec установлен и работает стабильно.
  • При входе в шлюз, Я могу пинг в удаленный шлюз и удаленный сервер успешно. я тоже могу пинг в клиент. И я могу пропинговать google.com.
  • При входе в клиент, Я могу пропинговать google.com и я могу пинг в шлюз. С tcpdump icmp на шлюз я вижу, что пропинговать google.com от клиент проходит через шлюз.

Что еще не работает

Я не могу пинг в удаленный сервер от клиент по его ИП.

клиент$ пинг -c 1 10.10.12.7
PING 10.10.12.7 (10.10.12.7): 56 байт данных

--- 10.10.12.7 статистика пинга ---
1 пакет передан, 0 пакетов получен, 100% потери пакетов

От tcpdump на шлюз, похоже на пинг отправляется, но не пересылается через туннель:

шлюз$ tcpdump icmp
13:19:18.122999 IP 192.168.144.7 > 10.10.12.7: эхо-запрос ICMP, идентификатор 15, последовательность 0, длина 64
13:19:18.123038 IP-шлюз > 10.10.12.7: эхо-запрос ICMP, идентификатор 15, последовательность 0, длина 64
13:19:18.127534 IP-адрес ac5.nue3.m-online.net > шлюз: сеть ICMP 10.10.12.7 недоступна, длина 36
13:19:18.127556 ​​IP-адрес ac5.nue3.m-online.net > 192.168.144.7: сеть ICMP 10.10.12.7 недоступна, длина 36

Как ac5.nue3.m-онлайн.net является интернет-провайдером локального сайта, я думаю, что пакет маршрутизируется не через туннель IPSec, а через интернет-соединение шлюз, который, конечно, не может достичь удаленный сервер. (Если я сделаю туннель IPSec полным туннелем, а не разделенным туннелем, я получу тот же результат.)

Любая помощь или понимание будут действительно оценены!

РЕДАКТИРОВАТЬ: статус ipsecвсе на шлюз

шлюз > состояние ipsecвсе
Состояние демона IKE charon (strongSwan 5.8.2, Linux 5.4.0-88-generic, x86_64):
  время безотказной работы: 7 минут, с 08 октября 08:18:24 2021
  malloc: sbrk 3112960, mmap 0, используется 1081456, бесплатно 2031504
  рабочие потоки: 11 из 16 бездействующих, 5/0/0/0 рабочих, очередь заданий: 0/0/0/0, запланированных: 4
  загруженные плагины: charon test-vectors ldap pkcs11 tpm aesni aesni aes rc2 sha2 sha1 md5 mgf1 rdrand random nonce x509 ограничения отзыва pubkey pkcs1 pkcs7 pkcs8 pkcs12 pgp dnskey sshkey pem openssl gcrypt af-alg fips-prf gmp curve25 cmm ctrc macac xcb chapoly ntru drbg curl attr ядро-netlink разрешить сокет-по умолчанию connmark farp инсульт updown eap-identity eap-aka eap-md5 eap-gtc eap-mschapv2 eap-dynamic eap-radius eap-tls eap-ttls eap-peap eap-tnc xauth- универсальный xauth-eap xauth-pam tnc-tnccs dhcp lookip error-notify certexpire led addrblock счетчики единства
Прослушиваемые IP-адреса:
  192.168.144.4
Соединения:
пример-ipsec: %any...vpn1.example.com IKEv2, dpddelay=300s
example-ipsec: local: [[email protected]] использует аутентификацию с предварительным общим ключом
example-ipsec: remote: [[email protected]] использует аутентификацию с предварительным общим ключом
пример-ipsec: child: dynamic === 0.0.0.0/0 TUNNEL, dpdaction=clear
Ассоциации безопасности (1 вверх, 0 соединение):
example-ipsec[1]: УСТАНОВЛЕНО 7 минут назад, 192.168.144.4[[email protected]]...<публичный-ip-удаленного-шлюза>[[email protected]]
пример-ipsec[1]: I: 9d7c74f670bbda86_i* c12b3b4a236b7018_r, предварительная повторная аутентификация общего ключа через 2 часа
пример-ipsec[1]: предложение IKE: AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048
пример-ipsec{1}: УСТАНОВЛЕНО, TUNNEL, reqid 1, ESP в UDP SPI: cf66ad72_i af3c9348_o
пример-ipsec{1}: AES_CBC_256/HMAC_SHA2_256_128, 442 байт_i (4 пкт, 434 с назад), 485 байт_о (6 пкт, 433 с назад), изменение ключа за 38 минут
пример-ipsec{1}: 10.10.102.235/32 === 0.0.0.0/0

Это результат статус ipsecвсе на шлюз после неудачной отправки пинг от клиент к удаленный сервер. пинг от шлюз не изменяет «байты» на выходе. «Байты» на выходе соответствуют пинг Я отправил из шлюз к удаленный сервер.

РЕДАКТИРОВАТЬ: /etc/ipsec.conf на шлюз:

# /etc/ipsec.conf

пример соединения-ipsec
  слева = % defaultroute
  левый исходный код = %config
  leftid = "[email protected]"
  справа = vpn1.example.com
  rightid = "[email protected]"
  правая подсеть = 0.0.0.0/0
  левый брандмауэр = да
  политика установки = да
  обмен ключами = ikev2
  тип = туннель
  авто = старт
  левая авторизация = пск
  правоаутент = пск
  dpdaction = очистить
  dpddelay = 300 с
флаг cn
Что такое согласованный селектор локального трафика для шлюза? (т.е. опубликуйте вывод состояния strongSwan, либо `ipsec statusall`, либо `swanctl -l`)
флаг pk
Спасибо @ecdsa, я опубликовал вывод `ipsec statusall`.
флаг pk
О, я думаю, вы могли бы быть на что-то! Если последняя строка вывода `ipsec statusall` также является селектором трафика, она может не соответствовать моему NAT. Но на самом деле я не знаю, откуда берется этот диапазон `10.10.102.235/32`, потому что он не из моей собственной конфигурации. Возможно, это селектор, навязанный удаленным шлюзом :/
флаг pk
Вот и все, @ecdsa, я добавил `iptables -t nat -A POSTROUTING -j SNAT --to-source 10.10.102.235; iptables -t nat -A POSTROUTING -m policy --dir out --pol ipsec -j ACCEPT` (взято с https://wiki.strongswan.org/issues/2355), и тогда все работает! Не могли бы вы написать правильный ответ?
drookie avatar
флаг za
Похоже, у вас действительно неправильно настроен селектор трафика. Добавьте некоторые конфиги, относящиеся к этому.
флаг pk
Спасибо, @drookie, я добавил свой `/etc/ipsec.conf`.
Рейтинг:1
флаг cn

Поскольку для соединения используется виртуальный IP-адрес (leftsourceip=%config, что приводит к 10.10.102.235/32 как селектор локального трафика), вы должны направить трафик NAT на этот адрес, а не на физический адрес хоста, который вы получаете через МАСКАРАД, чтобы соответствовать политикам IPsec и туннелировать трафик ( чтобы вставить его вверху):

iptables -t nat -I POSTROUTING -j SNAT --to-source 10.10.102.235

Если виртуальный IP-адрес не назначен статически (например,на основе идентификатора клиента) и может измениться, вы можете динамически установить/удалить правило SNAT в пользовательский скрипт updown (настраивается через левый вверх вниз), которому передается виртуальный IP-адрес $PLUTO_MY_SOURCEIP.

Как вы изначально сказали, это должна быть установка с раздельным туннелированием (которую удаленный селектор трафика 0.0.0.0/0 на самом деле не отражает), вы также можете добавить, например. -д 10.10.0.0/16 к правилу SNAT, чтобы обрабатывать пакеты только для этой подсети, другой трафик не будет перенаправлен и туннелирован (вы можете оставить МАСКАРАД правило для этого трафика). Это также может быть реализовано с помощью политики IPsec (правая подсеть = 10.10.0.0/16), который вы затем получите в $PLUTO_PEER_CLIENT в восходящем сценарии.

флаг pk
Большое спасибо за вашу помощь и за этот отличный ответ, который не только показывает, что делать, но и почему это нужно делать!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.