- Вопрос или проблема
- Настройка Strongswan в качестве VPN сервера IPSec/IKEv2
- Схема сети
- Конфигурации
- Сервер
- Android
- Попытка подключения
- Android
- iOS
- Ответ или решение
- Настройка StrongSwan как сервера VPN IPSec/IKEv2 для мобильных клиентов на Android и iOS
- Введение
- Конфигурация сети
- Конфигурация сервера StrongSwan
- Замечания по конфигурации:
- Конфигурация клиентов
- Android и iOS настройки:
- Логи
- Рекомендации для устранения неполадок
- Завершение
Вопрос или проблема
Настройка Strongswan в качестве VPN сервера IPSec/IKEv2
Я хочу настроить VPN сервер для моих мобильных устройств, чтобы они могли подключаться к моей домашней сети: смартфоны (iPhone, Android), планшеты (iPad) и ноутбуки (Windows и Linux).
Но устройства на Android и iOS не могут подключиться. Как я могу исправить конфигурацию, чтобы это работало?
Схема сети
raspi5 (RaspiOS:bookworm) --- модем --- интернет --- смартфон
настольный ПК ___________________| |_ планшет
локальные устройства _____________| |_ ноутбук
модем: статический публичный IP, частный IP в 192.168.X.0/30, переадресация портов 500 и 4500 на raspi
raspi5: 2 статических частных IP на одном интерфейсе 192.168.X.0/30 и 192.168.Y.0/24, DHCP сервер и основной шлюз для других домашних устройств
Конфигурации
Сервер
На raspi5 я установил Strongswan (v 5.9.8) и настроил следующим образом:
# ipsec.conf - файл конфигурации strongSwan IPsec
# базовая конфигурация
config setup
# strictcrlpolicy=yes
uniqueids = no
charondebug="ike 1, knl 1, cfg 0"
# Добавьте соединения здесь.
conn ikev2-vpn
auto=add
compress=no
type=tunnel
keyexchange=ikev2
fragmentation=yes
forceencaps=yes
dpdaction=clear
dpddelay=300s
rekey=no
left=%any
leftid=192.168.X.x
#leftid=81.56.120.104
leftcert=server-cert.pem
leftsendcert=always
leftsubnet=0.0.0.0/0
right=%any
rightid=%any
rightauth=eap-mschapv2
rightsourceip=192.168.Z.0/24
rightdns=192.168.X.x,192.168.Y.y
rightsendcert=never
eap_identity=%identity
ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024!
esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!
server-cert.pem — это сертификат, подписанный самоподписанным CA, уже импортированным и включенным на моих устройствах
Android
- Тип:
IKEv2/IPSec MSCHAPv2
- Адрес сервера:
my.public.static.ip
(адрес модема) - Идентификатор IPSec:
ikev2-vpn
(что-то случайное, не знаю, что нужно, нормально ли это?) - Сертификат CA IPSec:
мой самоподписанный сертификат CA
- Сертификат сервера IPSec:
(получен от сервера)
- Имя пользователя:
имя пользователя из ipsec.secrets
- Пароль:
пароль из ipsec.secrets
Попытка подключения
При попытке подключения к серверу с моих устройств это всегда неуспешно
, вот логи:
Android
# tcpdump -n ‘(udp port 500) or (udp port 4500)’ -vvv
tcpdump: слушаем на eth0, тип канала EN10MB (Ethernet), длина снимка 262144 байта
09:05:19.801204 IP (tos 0x48, ttl 57, id 47442, offset 0, flags [DF], proto UDP (17), length 1100)
android.public.ip.address.7540 > server.local.ip.address.500: [udp sum ok] isakmp 2.0 msgid 00000000 cookie eb888521dbd62292->0000000000000000: parent_sa ikev2_init[I]:
(sa: len=404
(p: #1 protoid=isakmp transform=21 len=200
(t: #1 type=encr id=#13 (type=keylen value=0100))
(t: #2 type=encr id=aes (type=keylen value=0100))
(t: #3 type=encr id=#13 (type=keylen value=00c0))
(t: #4 type=encr id=aes (type=keylen value=00c0))
(t: #5 type=encr id=#13 (type=keylen value=0080))
(t: #6 type=encr id=aes (type=keylen value=0080))
(t: #7 type=integ id=#14 )
(t: #8 type=integ id=#13 )
(t: #9 type=integ id=#12 )
(t: #10 type=integ id=aes-xcbc )
(t: #11 type=integ id=#8 )
(t: #12 type=dh id=modp4096 )
(t: #13 type=dh id=#31 )
(t: #14 type=dh id=modp3072 )
(t: #15 type=dh id=modp2048 )
(t: #16 type=prf id=hmac-sha )
(t: #17 type=prf id=aes128_xcbc )
(t: #18 type=prf id=#5 )
(t: #19 type=prf id=#6 )
(t: #20 type=prf id=#7 )
(t: #21 type=prf id=#8 ))
(p: #2 protoid=isakmp transform=20 len=204
(t: #1 type=encr id=#28 )
(t: #2 type=encr id=#20 (type=keylen value=0100))
(t: #3 type=encr id=#19 (type=keylen value=0100))
(t: #4 type=encr id=#18 (type=keylen value=0100))
(t: #5 type=encr id=#20 (type=keylen value=00c0))
(t: #6 type=encr id=#19 (type=keylen value=00c0))
(t: #7 type=encr id=#18 (type=keylen value=00c0))
(t: #8 type=encr id=#20 (type=keylen value=0080))
(t: #9 type=encr id=#19 (type=keylen value=0080))
(t: #10 type=encr id=#18 (type=keylen value=0080))
(t: #11 type=dh id=modp4096 )
(t: #12 type=dh id=#31 )
(t: #13 type=dh id=modp3072 )
(t: #14 type=dh id=modp2048 )
(t: #15 type=prf id=hmac-sha )
(t: #16 type=prf id=aes128_xcbc )
(t: #17 type=prf id=#5 )
(t: #18 type=prf id=#6 )
(t: #19 type=prf id=#7 )
(t: #20 type=prf id=#8 )))
(v2ke: len=512 group=modp4096 )
(nonce: len=32 nonce=() )
(n: prot_id=#0 type=16388(nat_detection_source_ip))
(n: prot_id=#0 type=16389(nat_detection_destination_ip))
(n: prot_id=#0 type=16430(status))
(n: prot_id=#0 type=16431(status))
09:05:19.801872 IP (tos 0x0, ttl 64, id 63842, offset 0, flags [DF], proto UDP (17), length 66)
server.local.ip.address.500 > android.public.ip.address.7540: [bad udp cksum 0xb3fe -> 0x71c8!] isakmp 2.0 msgid 00000000 cookie eb888521dbd62292->0000000000000000: parent_sa ikev2_init[R]:
(n: prot_id=#0 type=17(invalid_ke_payload))
09:05:20.343778 IP (tos 0x48, ttl 57, id 47555, offset 0, flags [DF], proto UDP (17), length 1100)
android.public.ip.address.7540 > server.local.ip.address.500: [udp sum ok] isakmp 2.0 msgid 00000000 cookie eb888521dbd62292->0000000000000000: parent_sa ikev2_init[I]:
(sa: len=404
(p: #1 protoid=isakmp transform=21 len=200
(t: #1 type=encr id=#13 (type=keylen value=0100))
(t: #2 type=encr id=aes (type=keylen value=0100))
(t: #3 type=encr id=#13 (type=keylen value=00c0))
(t: #4 type=encr id=aes (type=keylen value=00c0))
(t: #5 type=encr id=#13 (type=keylen value=0080))
(t: #6 type=encr id=aes (type=keylen value=0080))
(t: #7 type=integ id=#14 )
(t: #8 type=integ id=#13 )
(t: #9 type=integ id=#12 )
(t: #10 type=integ id=aes-xcbc )
(t: #11 type=integ id=#8 )
(t: #12 type=dh id=modp4096 )
(t: #13 type=dh id=#31 )
(t: #14 type=dh id=modp3072 )
(t: #15 type=dh id=modp2048 )
(t: #16 type=prf id=hmac-sha )
(t: #17 type=prf id=aes128_xcbc )
(t: #18 type=prf id=#5 )
(t: #19 type=prf id=#6 )
(t: #20 type=prf id=#7 )
(t: #21 type=prf id=#8 ))
(p: #2 protoid=isakmp transform=20 len=204
(t: #1 type=encr id=#28 )
(t: #2 type=encr id=#20 (type=keylen value=0100))
(t: #3 type=encr id=#19 (type=keylen value=0100))
(t: #4 type=encr id=#18 (type=keylen value=0100))
(t: #5 type=encr id=#20 (type=keylen value=00c0))
(t: #6 type=encr id=#19 (type=keylen value=00c0))
(t: #7 type=encr id=#18 (type=keylen value=00c0))
(t: #8 type=encr id=#20 (type=keylen value=0080))
(t: #9 type=encr id=#19 (type=keylen value=0080))
(t: #10 type=encr id=#18 (type=keylen value=0080))
(t: #11 type=dh id=modp4096 )
(t: #12 type=dh id=#31 )
(t: #13 type=dh id=modp3072 )
(t: #14 type=dh id=modp2048 )
(t: #15 type=prf id=hmac-sha )
(t: #16 type=prf id=aes128_xcbc )
(t: #17 type=prf id=#5 )
(t: #18 type=prf id=#6 )
(t: #19 type=prf id=#7 )
(t: #20 type=prf id=#8 )))
(v2ke: len=512 group=modp4096 )
(nonce: len=32 nonce=() )
(n: prot_id=#0 type=16388(nat_detection_source_ip))
(n: prot_id=#0 type=16389(nat_detection_destination_ip))
(n: prot_id=#0 type=16430(status))
(n: prot_id=#0 type=16431(status))
09:05:20.344349 IP (tos 0x0, ttl 64, id 63912, offset 0, flags [DF], proto UDP (17), length 66)
server.local.ip.address.500 > android.public.ip.address.7540: [bad udp cksum 0xb3fe -> 0x71c8!] isakmp 2.0 msgid 00000000 cookie eb888521dbd62292->0000000000000000: parent_sa ikev2_init[R]:
(n: prot_id=#0 type=17(invalid_ke_payload))
09:05:20.365424 IP (tos 0x48, ttl 57, id 47564, offset 0, flags [DF], proto UDP (17), length 844)
android.public.ip.address.7541 > server.local.ip.address.500: [udp sum ok] isakmp 2.0 msgid 00000000 cookie a9c211c9a1f5c955->0000000000000000: parent_sa ikev2_init[I]:
(sa: len=404
(p: #1 protoid=isakmp transform=21 len=200
(t: #1 type=encr id=#13 (type=keylen value=0100))
(t: #2 type=encr id=aes (type=keylen value=0100))
(t: #3 type=encr id=#13 (type=keylen value=00c0))
(t: #4 type=encr id=aes (type=keylen value=00c0))
(t: #5 type=encr id=#13 (type=keylen value=0080))
(t: #6 type=encr id=aes (type=keylen value=0080))
(t: #7 type=integ id=#14 )
(t: #8 type=integ id=#13 )
(t: #9 type=integ id=#12 )
(t: #10 type=integ id=aes-xcbc )
(t: #11 type=integ id=#8 )
(t: #12 type=dh id=modp4096 )
(t: #13 type=dh id=#31 )
(t: #14 type=dh id=modp3072 )
(t: #15 type=dh id=modp2048 )
(t: #16 type=prf id=hmac-sha )
(t: #17 type=prf id=aes128_xcbc )
(t: #18 type=prf id=#5 )
(t: #19 type=prf id=#6 )
(t: #20 type=prf id=#7 )
(t: #21 type=prf id=#8 ))
(p: #2 protoid=isakmp transform=20 len=204
(t: #1 type=encr id=#28 )
(t: #2 type=encr id=#20 (type=keylen value=0100))
(t: #3 type=encr id=#19 (type=keylen value=0100))
(t: #4 type=encr id=#18 (type=keylen value=0100))
(t: #5 type=encr id=#20 (type=keylen value=00c0))
(t: #6 type=encr id=#19 (type=keylen value=00c0))
(t: #7 type=encr id=#18 (type=keylen value=00c0))
(t: #8 type=encr id=#20 (type=keylen value=0080))
(t: #9 type=encr id=#19 (type=keylen value=0080))
(t: #10 type=encr id=#18 (type=keylen value=0080))
(t: #11 type=dh id=modp4096 )
(t: #12 type=dh id=#31 )
(t: #13 type=dh id=modp3072 )
(t: #14 type=dh id=modp2048 )
(t: #15 type=prf id=hmac-sha )
(t: #16 type=prf id=aes128_xcbc )
(t: #17 type=prf id=#5 )
(t: #18 type=prf id=#6 )
(t: #19 type=prf id=#7 )
(t: #20 type=prf id=#8 )))
(v2ke: len=256 group=modp2048 )
(nonce: len=32 nonce=() )
(n: prot_id=#0 type=16388(nat_detection_source_ip))
(n: prot_id=#0 type=16389(nat_detection_destination_ip))
(n: prot_id=#0 type=16430(status))
(n: prot_id=#0 type=16431(status))
09:05:20.368869 IP (tos 0x0, ttl 64, id 63918, offset 0, flags [DF], proto UDP (17), length 500)
server.local.ip.address.500 > android.public.ip.address.7541: [bad udp cksum 0xb5b0 -> 0x5b20!] isakmp 2.0 msgid 00000000 cookie a9c211c9a1f5c955->b3326e36bf2c9701: parent_sa ikev2_init[R]:
(sa: len=44
(p: #1 protoid=isakmp transform=4 len=44
(t: #1 type=encr id=aes (type=keylen value=0080))
(t: #2 type=integ id=#12 )
(t: #3 type=prf id=#5 )
(t: #4 type=dh id=modp2048 )))
(v2ke: len=256 group=modp2048 )
(nonce: len=32 nonce=() )
(n: prot_id=#0 type=16388(nat_detection_source_ip))
(n: prot_id=#0 type=16389(nat_detection_destination_ip))
(n: prot_id=#0 type=16430(status))
(n: prot_id=#0 type=16431(status))
09:05:20.647603 IP (tos 0x48, ttl 57, id 1, offset 0, flags [none], proto UDP (17), length 29)
android.public.ip.address.7543 > server.local.ip.address.4500: [no cksum] isakmp-nat-keep-alive
09:05:20.647753 IP (tos 0x48, ttl 57, id 47596, offset 0, flags [DF], proto UDP (17), length 576)
android.public.ip.address.7545 > server.local.ip.address.4500: [udp sum ok] NONESP-encap: isakmp 2.0 msgid 00000001 cookie a9c211c9a1f5c955->b3326e36bf2c9701: child_sa ikev2_auth[I]:
(v2e: len=512 )
09:05:20.669438 IP (tos 0x0, ttl 64, id 63927, offset 0, flags [DF], proto UDP (17), length 112)
server.local.ip.address.4500 > android.public.ip.address.7545: [bad udp cksum 0xb42c -> 0x6bd4!] NONESP-encap: isakmp 2.0 msgid 00000001 cookie a9c211c9a1f5c955->b3326e36bf2c9701: child_sa ikev2_auth[R]:
(v2e: len=48 )
# journalctl
09:05:15 server-hostname kernel: macb 1f00100000.ethernet eth0: вошел в режим прослушивания
09:05:19 server-hostname charon[127126]: 13[NET] получен пакет: от android.public.ip.address[7540] к server.local.ip.address[500] (1072 байта)
09:05:19 server-hostname charon[127126]: 13[ENC] разобран запрос IKE_SA_INIT 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) ]
09:05:19 server-hostname charon[127126]: 13[IKE] android.public.ip.address инициирует IKE_SA
09:05:19 server-hostname charon[127126]: 13[IKE] android.public.ip.address инициирует IKE_SA
09:05:19 server-hostname charon[127126]: 13[IKE] локальный хост находится за NAT, отправка поддержания соединения
09:05:19 server-hostname charon[127126]: 13[IKE] удаленный хост находится за NAT
09:05:19 server-hostname charon[127126]: 13[IKE] группа DH MODP_4096 недопустима, запрашивает MODP_2048
09:05:19 server-hostname charon[127126]: 13[ENC] генерируется ответ на IKE_SA_INIT 0 [ N(INVAL_KE) ]
09:05:19 server-hostname charon[127126]: 13[NET] отправка пакета: от server.local.ip.address[500] к android.public.ip.address[7540] (38 байт)
09:05:20 server-hostname charon[127126]: 14[NET] получен пакет: от android.public.ip.address[7540] к server.local.ip.address[500] (1072 байта)
09:05:20 server-hostname charon[127126]: 14[ENC] разобран запрос IKE_SA_INIT 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) ]
09:05:20 server-hostname charon[127126]: 14[IKE] android.public.ip.address инициирует IKE_SA
09:05:20 server-hostname charon[127126]: 14[IKE] android.public.ip.address инициирует IKE_SA
09:05:20 server-hostname charon[127126]: 14[IKE] локальный хост находится за NAT, отправка поддержания соединения
09:05:20 server-hostname charon[127126]: 14[IKE] удаленный хост находится за NAT
09:05:20 server-hostname charon[127126]: 14[ENC] генерируется ответ на IKE_SA_INIT 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(CHDLESS_SUP) N(MULT_AUTH) ]
09:05:20 server-hostname charon[127126]: 14[NET] отправка пакета: от server.local.ip.address[500] к android.public.ip.address[7541] (472 байта)
09:05:20 server-hostname charon[127126]: 01[NET] получен пакет: от android.public.ip.address[7545] к server.local.ip.address[4500] (544 байта)
09:05:20 server-hostname charon[127126]: 01[ENC] разобран запрос IKE_AUTH 1 [ IDi IDr N(MOBIKE_SUP) SA TSi TSr CPRQ(ADDR ADDR6 DNS DNS6 MASK VER) ]
09:05:20 server-hostname charon[127126]: 01[IKE] сторона поддерживает MOBIKE
09:05:20 server-hostname charon[127126]: 01[ENC] генерируется ответ на IKE_AUTH 1 [ N(AUTH_FAILED) ]
09:05:20 server-hostname charon[127126]: 01[NET] отправка пакета: от server.local.ip.address[4500] к android.public.ip.address[7545] (80 байт)
09:05:25 server-hostname kernel: macb 1f00100000.ethernet eth0: покинул режим прослушивания
iOS
# tcpdump -n ‘(udp port 500) or (udp port 4500)’ -vvv
tcpdump: слушаем на eth0, тип канала EN10MB (Ethernet), длина снимка 262144 байта
09:21:36.952657 IP (tos 0x48, ttl 57, id 3265, offset 0, flags [none], proto UDP (17), length 398)
ios.public.ip.address.28563 > server.local.ip.address.500: [udp sum ok] isakmp 2.0 msgid 00000000 cookie 79c6c3d8306c5c9a->0000000000000000: parent_sa ikev2_init[I]:
09:21:36.953312 IP (tos 0x0, ttl 64, id 25610, offset 0, flags [DF], proto UDP (17), length 66)
server.local.ip.address.500 > ios.public.ip.address.28563: [bad udp cksum 0xf50b -> 0x8309!] isakmp 2.0 msgid 00000000 cookie 79c6c3d8306c5c9a->0000000000000000: parent_sa ikev2_init[R]:
09:21:37.107647 IP (tos 0x48, ttl 57, id 17593, offset 0, flags [none], proto UDP (17), length 590)
ios.public.ip.address.28563 > server.local.ip.address.500: [udp sum ok] isakmp 2.0 msgid 00000000 cookie 79c6c3d8306c5c9a->0000000000000000: parent_sa ikev2_init[I]:
09:21:37.111165 IP (tos 0x0, ttl 64, id 25632, offset 0, flags [DF], proto UDP (17), length 500)
server.local.ip.address.500 > ios.public.ip.address.28563: [bad udp cksum 0xf6bd -> 0x8272!] isakmp 2.0 msgid 00000000 cookie 79c6c3d8306c5c9a->302ec77485b0d33e: parent_sa ikev2_init[R]:
09:21:37.237414 IP (tos 0x48, ttl 57, id 21341, offset 0, flags [none], proto UDP (17), length 400)
ios.public.ip.address.28575 > server.local.ip.address.4500: [udp sum ok] NONESP-encap: isakmp 2.0 msgid 00000001 cookie 79c6c3d8306c5c9a->302ec77485b0d33e: child_sa ikev2_auth[I]:
(v2e: len=336 )
09:21:37.259191 IP (tos 0x0, ttl 64, id 25640, offset 0, flags [DF], proto UDP (17), length 112)
server.local.ip.address.4500 > ios.public.ip.address.28575: [bad udp cksum 0xf539 -> 0x595e!] NONESP-encap: isakmp 2.0 msgid 00000001 cookie 79c6c3d8306c5c9a->302ec77485b0d33e: child_sa ikev2_auth[R]:
(v2e: len=48 )
09:21:37.375952 IP (tos 0x48, ttl 57, id 21341, offset 0, flags [none], proto UDP (17), length 398)
ios.public.ip.address.28563 > server.local.ip.address.500: [udp sum ok] isakmp 2.0 msgid 00000000 cookie f35c26cfc2577a80->0000000000000000: parent_sa ikev2_init[I]:
09:21:37.376433 IP (tos 0x0, ttl 64, id 25651, offset 0, flags [DF], proto UDP (17), length 66)
server.local.ip.address.500 > ios.public.ip.address.28563: [bad udp cksum 0xf50b -> 0xf6aa!] isakmp 2.0 msgid 00000000 cookie f35c26cfc2577a80->0000000000000000: parent_sa ikev2_init[R]:
09:21:37.538005 IP (tos 0x48, ttl 57, id 8345, offset 0, flags [none], proto UDP (17), length 590)
ios.public.ip.address.28563 > server.local.ip.address.500: [udp sum ok] isakmp 2.0 msgid 00000000 cookie f35c26cfc2577a80->0000000000000000: parent_sa ikev2_init[I]:
09:21:37.541420 IP (tos 0x0, ttl 64, id 25671, offset 0, flags [DF], proto UDP (17), length 500)
server.local.ip.address.500 > ios.public.ip.address.28563: [bad udp cksum 0xf6bd -> 0x1d5b!] isakmp 2.0 msgid 00000000 cookie f35c26cfc2577a80->8b8353a9949e18f6: parent_sa ikev2_init[R]:
09:21:37.682796 IP (tos 0x48, ttl 57, id 26036, offset 0, flags [none], proto UDP (17), length 400)
ios.public.ip.address.28575 > server.local.ip.address.4500: [udp sum ok] NONESP-encap: isakmp 2.0 msgid 00000001 cookie f35c26cfc2577a80->8b8353a9949e18f6: child_sa ikev2_auth[I]:
09:21:37.704385 IP (tos 0x0, ttl 64, id 25683, offset 0, flags [DF], proto UDP (17), length 112)
server.local.ip.address.4500 > ios.public.ip.address.28575: [bad udp cksum 0xf539 -> 0x1b71!] NONESP-encap: isakmp 2.0 msgid 00000001 cookie f35c26cfc2577a80->8b8353a9949e18f6: child_sa ikev2_auth[R]:
# journalctl
09:20:01 server-hostname CRON[154775]: pam_unix(cron:session): сеанс открыт для пользователя root(uid=0) от (uid=0)
09:20:01 server-hostname CRON[154776]: (root) CMD (( /home/rez/hub-ctrl/uhubctl/coolme.sh >> /home/rez/hub-ctrl/uhubctl/log.txt ))
09:20:02 server-hostname CRON[154775]: pam_unix(cron:session): сеанс закрыт для пользователя root
09:21:01 server-hostname CRON[154792]: pam_unix(cron:session): сеанс открыт для пользователя root(uid=0) от (uid=0)
09:21:01 server-hostname CRON[154793]: (root) CMD (( /home/rez/hub-ctrl/uhubctl/coolme.sh >> /home/rez/hub-ctrl/uhubctl/log.txt ))
09:21:01 server-hostname CRON[154792]: pam_unix(cron:session): сеанс закрыт для пользователя root
09:21:03 server-hostname kernel: macb 1f00100000.ethernet eth0: вошел в режим прослушивания
09:21:36 server-hostname charon[127126]: 01[NET] получен пакет: от ios.public.ip.address[28563] к server.local.ip.address[500] (370 байт)
09:21:36 server-hostname charon[127126]: 01[ENC] разобран запрос IKE_SA_INIT 0 [ SA KE No N(REDIR_SUP) N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) ]
09:21:36 server-hostname charon[127126]: 01[IKE] ios.public.ip.address инициирует IKE_SA
09:21:36 server-hostname charon[127126]: 01[IKE] ios.public.ip.address инициирует IKE_SA
09:21:36 server-hostname charon[127126]: 01[IKE] локальный хост находится за NAT, отправка поддержания соединения
09:21:36 server-hostname charon[127126]: 01[IKE] удаленный хост находится за NAT
09:21:36 server-hostname charon[127126]: 01[IKE] группа DH ECP_256 недопустима, запрашивает MODP_2048
09:21:36 server-hostname charon[127126]: 01[ENC] генерируется ответ на IKE_SA_INIT 0 [ N(INVAL_KE) ]
09:21:36 server-hostname charon[127126]: 01[NET] отправка пакета: от server.local.ip.address[500] к ios.public.ip.address[28563] (38 байт)
09:21:37 server-hostname charon[127126]: 06[NET] получен пакет: от ios.public.ip.address[28563] к server.local.ip.address[500] (562 байта)
09:21:37 server-hostname charon[127126]: 06[ENC] разобран запрос IKE_SA_INIT 0 [ SA KE No N(REDIR_SUP) N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) ]
09:21:37 server-hostname charon[127126]: 06[IKE] ios.public.ip.address инициирует IKE_SA
09:21:37 server-hostname charon[127126]: 06[IKE] ios.public.ip.address инициирует IKE_SA
09:21:37 server-hostname charon[127126]: 06[IKE] локальный хост находится за NAT, отправка поддержания соединения
09:21:37 server-hostname charon[127126]: 06[IKE] удаленный хост находится за NAT
09:21:37 server-hostname charon[127126]: 06[ENC] генерируется ответ на IKE_SA_INIT 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(CHDLESS_SUP) N(MULT_AUTH) ]
09:21:37 server-hostname charon[127126]: 06[NET] отправка пакета: от server.local.ip.address[500] к ios.public.ip.address[28563] (472 байта)
09:21:37 server-hostname charon[127126]: 05[NET] получен пакет: от ios.public.ip.address[28575] к server.local.ip.address[4500] (368 байт)
09:21:37 server-hostname charon[127126]: 05[ENC] неизвестный тип атрибута INTERNAL_DNS_DOMAIN
09:21:37 server-hostname charon[127126]: 05[ENC] разобран запрос IKE_AUTH 1 [ IDi N(INIT_CONTACT) IDr CPRQ(ADDR MASK DHCP DNS ADDR6 DHCP6 DNS6 DOMAIN) N(ESP_TFC_PAD_N) N(NON_FIRST_FRAG) SA TSi TSr N(MOBIKE_SUP) ]
09:21:37 server-hostname charon[127126]: 05[IKE] сторона поддерживает MOBIKE
09:21:37 server-hostname charon[127126]: 05[IKE] получен ESP_TFC_PADDING_NOT_SUPPORTED, не используется ESPv3 TFC padding
09:21:37 server-hostname charon[127126]: 05[ENC] генерируется ответ на IKE_AUTH 1 [ N(AUTH_FAILED) ]
09:21:37 server-hostname charon[127126]: 05[NET] отправка пакета: от server.local.ip.address[4500] к ios.public.ip.address[28575] (80 байт)
09:21:37 server-hostname charon[127126]: 07[NET] получен пакет: от ios.public.ip.address[28563] к server.local.ip.address[500] (370 байт)
09:21:37 server-hostname charon[127126]: 07[ENC] разобран запрос IKE_SA_INIT 0 [ SA KE No N(REDIR_SUP) N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) ]
09:21:37 server-hostname charon[127126]: 07[IKE] ios.public.ip.address инициирует IKE_SA
09:21:37 server-hostname charon[127126]: 07[IKE] ios.public.ip.address инициирует IKE_SA
09:21:37 server-hostname charon[127126]: 07[IKE] локальный хост находится за NAT, отправка поддержания соединения
09:21:37 server-hostname charon[127126]: 07[IKE] удаленный хост находится за NAT
09:21:37 server-hostname charon[127126]: 07[ENC] группа DH ECP_256 недопустима, запрашивает MODP_2048
09:21:37 server-hostname charon[127126]: 07[ENC] генерируется ответ на IKE_SA_INIT 0 [ N(INVAL_KE) ]
09:21:37 server-hostname charon[127126]: 07[NET] отправка пакета: от server.local.ip.address[500] к ios.public.ip.address[28563] (38 байт)
09:21:37 server-hostname charon[127126]: 09[NET] получен пакет: от ios.public.ip.address[28563] к server.local.ip.address[500] (562 байта)
09:21:37.server-hostname charon[127126]: 09[ENC] разобран запрос IKE_SA_INIT 0 [ SA KE No N(REDIR_SUP) N(NATD_S_IP) N(NATD_D_IP) ]
09:21:37.server-hostname charon[127126]: 09[IKE] ios.public.ip.address инициирует IKE_SA
09:21:37.server-hostname charon[127126]: 09[IKE] ios.public.ip.address инициирует IKE_SA
09:21:37.server-hostname charon[127126]: 09[IKE] локальный хост находится за NAT, отправка поддержания соединения
09:21:37.server-hostname charon[127126]: 09[IKE] удаленный хост находится за NAT
09:21:37.server-hostname charon[127126]: 09[ENC] генерируется ответ на IKE_SA_INIT 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(CHDLESS_SUP) N(MULT_AUTH) ]
09:21:37.server-hostname charon[127126]: 09[NET] отправка пакета: от server.local.ip.address[500] к ios.public.ip.address[28563] (472 байта)
09:21:37.server-hostname charon[127126]: 11[NET] получен пакет: от ios.public.ip.address[28575] к server.local.ip.address[4500] (368 байт)
09:21:37.server-hostname charon[127126]: 11[ENC] неизвестный тип атрибута INTERNAL_DNS_DOMAIN
09:21:37.server-hostname charon[127126]: 11[ENC] разобран запрос IKE_AUTH 1 [ IDi N(INIT_CONTACT) IDr CPRQ(ADDR MASK DHCP DNS ADDR6 DHCP6 DNS6 DOMAIN) N(ESP_TFC_PAD_N) N(NON_FIRST_FRAG) SA TSi TSr N(MOBIKE_SUP) ]
09:21:37.server-hostname charon[127126]: 11[IKE] сторона поддерживает MOBIKE
09:21:37.server-hostname charon[127126]: 11[IKE] получен ESP_TFC_PADDING_NOT_SUPPORTED, не используется ESPv3 TFC padding
09:21:37.server-hostname charon[127126]: 11[ENC] генерируется ответ на IKE_AUTH 1 [ N(AUTH_FAILED) ]
09:21:37.server-hostname charon[127126]: 11[NET] отправка пакета: от server.local.ip.address[4500] к ios.public.ip.address[28575] (80 байт)
09:21:53.server-hostname kernel: macb 1f00100000.ethernet eth0: покинул режим прослушивания
полные логи tcpdump на https://gist.github.com/lucarez/c84c1ac4394f04efea19c51033c6ecea
Ответ или решение
Настройка StrongSwan как сервера VPN IPSec/IKEv2 для мобильных клиентов на Android и iOS
Введение
Настройка VPN-сервера на основе StrongSwan — это отличный способ обеспечить безопасность вашего домашнего сетевого окружения. Однако, как показано в вашем запросе, возникают трудности с подключением мобильных устройств под управлением Android и iOS. В этом ответе мы рассмотрим основные проблемы конфигурации и предложим пути их решения.
Конфигурация сети
Исходя из предоставленного описания вашей сети:
raspi5 (RaspiOS:bookworm) --- модем --- интернет --- смартфон
desktop ___________________| |_ планшет
local_devices _____________| |_ ноутбук
Ваш модем имеет статический публичный IP-адрес и перенаправляет порты 500 (IKE) и 4500 (NAT-T) на Raspberry Pi (raspi5), который работает как VPN-сервер. Убедитесь, что перенаправление портов настроено правильно.
Конфигурация сервера StrongSwan
На вашем сервере rasp5 вы настроили StrongSwan с помощью следующей конфигурации в файле ipsec.conf
:
config setup
uniqueids = no
charondebug="ike 1, knl 1, cfg 0"
conn ikev2-vpn
auto=add
compress=no
type=tunnel
keyexchange=ikev2
fragmentation=yes
forceencaps=yes
dpdaction=clear
dpddelay=300s
rekey=no
left=%any
leftid=192.168.X.x
leftcert=server-cert.pem
leftsendcert=always
leftsubnet=0.0.0.0/0
right=%any
rightid=%any
rightauth=eap-mschapv2
rightsourceip=192.168.Z.0/24
rightdns=192.168.X.x,192.168.Y.y
rightsendcert=never
eap_identity=%identity
ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024!
esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!
Замечания по конфигурации:
-
leftid
иrightid
: Убедитесь, что идентификаторы корректно установлены. Если ваш сервер за NAT, пробуйте использовать публичный IP-адрес (81.56.120.104) вместо локального. -
DH группы: В логах указано, что группа DH MODP_4096 неприемлема и ваш сервер запрашивает MODP_2048. Попробуйте изменить конфигурацию на использование MODP_2048:
ike=aes256-sha1-modp2048!
-
Хэширование и шифрование: Использование шифров, совместимых с мобильными устройствами, как правило, рекомендуется. Избегайте устаревших алгоритмов, таких как DES и 3DES, если возможно.
-
rightauth
: Проверьте, правильно ли указаны учетные данные вipsec.secrets
.
Конфигурация клиентов
Android и iOS настройки:
Убедитесь, что вы используете правильные параметры при настройке VPN на мобильных устройствах:
- Тип подключения: IKEv2/IPSec
- IPSec идентификатор: Используйте
ikev2-vpn
или другое значение, соответствующееconn
в конфигурации. - CA сертификат: Убедитесь, что CA сертификат правильно импортирован.
- Сертификат сервера: Должен совпадать с
server-cert.pem
. - Имя пользователя и пароль: Должны совпадать с теми в
ipsec.secrets
.
Логи
Логи показывают, что ваш сервер генерирует ответы с ошибкой N(INVAL_KE)
и N(AUTH_FAILED)
. Это означает:
- Проблема с обменом ключами, скорее всего из-за несовместимых DH групп.
- Проблема с аутентификацией — убедитесь, что учетные данные совпадают.
Рекомендации для устранения неполадок
- Обновите конфигурацию сервера, чтобы исправить проблему с фонарями DH (исключив MODP_4096).
- Проверьте и повторно проверьте сертификаты на всех устройствах.
- Используйте простые алгоритмы для тестирования, чтобы обеспечить совместимость.
- Если проблема сохраняется, попытайтесь упростить конфигурацию — например, используйте пользовательский сертификат для тестирования, вместо использования EAP.
Завершение
Настройка VPN на базе StrongSwan может быть сложной, но с правильными шагами и конфигурацией, это можно сделать успешно. Если после всех предложенных изменений проблема сохраняется, пожалуйста, предоставьте дополнительные логи системы и конфигурации для дальнейшего анализа.