1. apt install strongswan
2. В /etc/ipsec.secrets добавляем
<client_ID> <server_ID> : PSK <key>
!Ключ в такой записи добавляем без кавычек!
3. В /etc/ipsec.conf
conn VPN
dpdaction=restart
dpddelay=35s
dpdtimeout=300s
rekey=no
left=%any
leftid=<private_IP>
right=<public_ip>
rightsubnet = 0.0.0.0/0
ike=aes256-sha2_256-modp1024!
esp=aes256-sha2_256!
authby=secret
auto=add
leftsourceip=%config
Комментарии:
- по умолчанию 'left' это локальная сторона. Только если IP адрес или разрешенный FQDN в "right" совпадает с локальным IP адресом стороы меняются местами.
- конфиги dpd - Dead peer detection
- left/right - IP адрес, leftid/rightid - идентификатор, т.е. если клиент за натом в качестве leftid указываем адрес на интерфейсе
- leftsourceip=%config - клиент запросит у сервера виртуальный адрес
- с помощью настроек left/rightsubnet можно организовать split tunnel. В моей конфигурации на leftsubnet на сервере и rightsubnet на клиенте 0.0.0.0/0 т.е. весь трафик заворачивается в туннель
4. Логи.
4.1. Самый простой вариант: на любой стороне можно добавить в /etc/ipsec.conf
config setup
charondebug="cfg 2, dmn 2, ike 2, net 1"
Тогда в /var/log/syslog будут писаться довольно подробные логи
4.2. Вообще, в strongswan достаточно гибгкий механизм логирования, можно использовать stdout/stderr, файл или syslog
По умолчанию, strongswan не может писать логи в файлы в Убунту (вероятно, эта же проблема не позволяет корректно перехватывать сообщения от strongswan из stderr).
Решение я нашел здесь:
http://tiebing.blogspot.com/2015/10/ubuntu-1404-strongswan-not-logging.html
It turns out that ubuntu uses "AppArmor" to limit where strongswan can write files. You can install apparmor-utils and use the command "aa-complain" to turn strongswan binaries from "enforce" mode to "complain" mode:
# apt-get install apparmor-utils
# aa-status
# aa-complain /usr/lib/ipsec/charon
Setting /usr/lib/ipsec/charon to complain mode.
После применения этого фикса, можно настроить логгирование в в /etc/strongswan.config. Пример (логи пишутся в stdout и /var/log/charon.log):
charon {
load_modular = yes
plugins {
include strongswan.d/charon/*.conf
}
filelog {
/var/log/charon.log {
append = no
default = 0
ike = 1
knl = 1
flush_line = yes
}
stdout {
default = 0
ike = 1
knl = 1
}
}
}
5. Полезные команды:
-перечитать конфиги и перезапустить ipsec:
ipsec reload && ipsec restart
-включить/вылючить конкретное соединение (conn XXXX в ipsec.conf):
ipsec up/down XXXX
-перечитать настройки в ipsec.secrets:
ipsec rereadsecrets
6. Проще всего включать/выключать соединение на клиенте из консоли. Лично мне все графические клиенты показались неудобными.
Если конечный пользователь совсем не дружит с консолью, можно использовать вот этот простой скрипт на Python (для нормальной работы, требуется чтобы charon писал логи в /var/log/charon.log, см. пример выше):
#!/usr/bin/env python3
import subprocess
import time
def execute(cmd):
popen = subprocess.Popen(cmd, stdout=subprocess.PIPE)
for out_line in popen.stdout:
yield str(out_line)
started = False
for line in execute(['tail', '-n 1', '-F', '/var/log/charon.log']):
#print(f'TEST:{line}')
if not started:
subprocess.Popen(['sudo', 'ipsec', 'up', 'VPN'], stdout=subprocess.PIPE)
started = True
if 'retransmit 2' in line:
print("Connection timeout. Try again later")
subprocess.run(['sudo', 'ipsec', 'down', 'VPN'], stdout=subprocess.PIPE)
time.sleep(3)
break
if 'established with SPIs' in line:
print('Connection established.')
while True:
try:
run = input('Ctrl+C to terminate\n')
except KeyboardInterrupt:
print('\nClosing connection')
subprocess.run(['sudo', 'ipsec', 'down', 'VPN'], stdout=subprocess.PIPE)
time.sleep(3)
break
2. В /etc/ipsec.secrets добавляем
<client_ID> <server_ID> : PSK <key>
!Ключ в такой записи добавляем без кавычек!
3. В /etc/ipsec.conf
conn VPN
dpdaction=restart
dpddelay=35s
dpdtimeout=300s
rekey=no
left=%any
leftid=<private_IP>
right=<public_ip>
rightsubnet = 0.0.0.0/0
ike=aes256-sha2_256-modp1024!
esp=aes256-sha2_256!
authby=secret
auto=add
leftsourceip=%config
Комментарии:
- по умолчанию 'left' это локальная сторона. Только если IP адрес или разрешенный FQDN в "right" совпадает с локальным IP адресом стороы меняются местами.
- конфиги dpd - Dead peer detection
- left/right - IP адрес, leftid/rightid - идентификатор, т.е. если клиент за натом в качестве leftid указываем адрес на интерфейсе
- leftsourceip=%config - клиент запросит у сервера виртуальный адрес
- с помощью настроек left/rightsubnet можно организовать split tunnel. В моей конфигурации на leftsubnet на сервере и rightsubnet на клиенте 0.0.0.0/0 т.е. весь трафик заворачивается в туннель
4. Логи.
4.1. Самый простой вариант: на любой стороне можно добавить в /etc/ipsec.conf
config setup
charondebug="cfg 2, dmn 2, ike 2, net 1"
Тогда в /var/log/syslog будут писаться довольно подробные логи
4.2. Вообще, в strongswan достаточно гибгкий механизм логирования, можно использовать stdout/stderr, файл или syslog
По умолчанию, strongswan не может писать логи в файлы в Убунту (вероятно, эта же проблема не позволяет корректно перехватывать сообщения от strongswan из stderr).
Решение я нашел здесь:
http://tiebing.blogspot.com/2015/10/ubuntu-1404-strongswan-not-logging.html
It turns out that ubuntu uses "AppArmor" to limit where strongswan can write files. You can install apparmor-utils and use the command "aa-complain" to turn strongswan binaries from "enforce" mode to "complain" mode:
# apt-get install apparmor-utils
# aa-status
# aa-complain /usr/lib/ipsec/charon
Setting /usr/lib/ipsec/charon to complain mode.
После применения этого фикса, можно настроить логгирование в в /etc/strongswan.config. Пример (логи пишутся в stdout и /var/log/charon.log):
charon {
load_modular = yes
plugins {
include strongswan.d/charon/*.conf
}
filelog {
/var/log/charon.log {
append = no
default = 0
ike = 1
knl = 1
flush_line = yes
}
stdout {
default = 0
ike = 1
knl = 1
}
}
}
5. Полезные команды:
-перечитать конфиги и перезапустить ipsec:
ipsec reload && ipsec restart
-включить/вылючить конкретное соединение (conn XXXX в ipsec.conf):
ipsec up/down XXXX
-перечитать настройки в ipsec.secrets:
ipsec rereadsecrets
6. Проще всего включать/выключать соединение на клиенте из консоли. Лично мне все графические клиенты показались неудобными.
Если конечный пользователь совсем не дружит с консолью, можно использовать вот этот простой скрипт на Python (для нормальной работы, требуется чтобы charon писал логи в /var/log/charon.log, см. пример выше):
#!/usr/bin/env python3
import subprocess
import time
def execute(cmd):
popen = subprocess.Popen(cmd, stdout=subprocess.PIPE)
for out_line in popen.stdout:
yield str(out_line)
started = False
for line in execute(['tail', '-n 1', '-F', '/var/log/charon.log']):
#print(f'TEST:{line}')
if not started:
subprocess.Popen(['sudo', 'ipsec', 'up', 'VPN'], stdout=subprocess.PIPE)
started = True
if 'retransmit 2' in line:
print("Connection timeout. Try again later")
subprocess.run(['sudo', 'ipsec', 'down', 'VPN'], stdout=subprocess.PIPE)
time.sleep(3)
break
if 'established with SPIs' in line:
print('Connection established.')
while True:
try:
run = input('Ctrl+C to terminate\n')
except KeyboardInterrupt:
print('\nClosing connection')
subprocess.run(['sudo', 'ipsec', 'down', 'VPN'], stdout=subprocess.PIPE)
time.sleep(3)
break