среда, 22 мая 2019 г.

Сервер strongswan ipsec + клиенты на Win10 и Ubuntu ч.4: настройка клиента на Ubuntu

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

1 комментарий:

  1. The merit casino in CA - Casino Review
    Merkur's Gold Coast Casino is a gaming 제왕카지노 site in the beautiful and vibrant Gold 샌즈카지노 Coast. It is the deccasino flagship of the Merkur Silver Star Gold Coast

    ОтветитьУдалить