Linux: работа с vpn, туннелями (gre, ipsec, stunnel, etc)

Зачем одному пользователю
  • Сбор информации за вами
  • Telegram
реализации

Их очень много, выбираем что нравится:

  • xSwan (StrongSwan, LibreSwan) и реализации на основе них (напр. ipsec-vpn-server ниже)
  • SoftEther
  • WireGuard – подробнее в отдельной статье, включая настройку Wireguard в Linux
  • ExpressVPN
  • Racoon
  • Accel-ppp (bras средне-провайдерского/энтерпрайз уровня)
  • RouterOS, pfSense
  • Juniper vSRX, PaloAlto, Fortigate, Checkpoint, Cisco, Sophos XG Firewall, etc. Лицензия только нужна (иногда есть и бесплатная, например для Sophos XG Home). Из плюса большого это возможность из коробки и SSL tunnel и все что угодно еще поднять.
StrongSwan
Очень сильная документация, сильно прокачан по функционалу, комьюнити большое и много статей. Единственный недостаток – мало контрибьютеров в код.
LibreSwan (ранее OpenSwan)
Слабее доки/функционал/количество статей в сравнении с StrongSwan, но контрибьютеров больше.
SOFTETHER
Самый лучший комментарий, который нашел на этот софт “ЗВЕЗДОЛЕТ ГОВНА”. Куча говнокода. Безусловно есть и плюсы – напр. поддерживает все ОС и все возможные реализации туннелей (включая L2).
https://www.softether.org/4-docs/9-research/Design_and_Implementation_of_SoftEther_VPN
https://www.softether-download.com/en.aspx?product=softether
https://www.softether.org/4-docs/1-manual/7._Installing_SoftEther_VPN_Server/7.3_Install_on_Linux_and_Initial_Configurations
https://www.softether.org/3-spec
Racoon (ipsec-tools)
Дырявый с точки зрения безопасности. Да и крайне ненадежен. Зато про него даже на харбре есть.
racoon is an alternative keying daemon, but it only implements the IKEv1 protocol and it's not actively developed anymore (unless you consider its forks in e.g. iOS/OS X and Android).
ipsec-vpn-server

Есть ipsec/l2tp vpn server как docker image, очень удобен по настройке и использованию, работает с клиентами iOS/MAC OS (проверял и Cisco IPsec и L2TP). “Под капотом” сервер использует Libreswan (IPsec VPN software) и xl2tpd (L2TP daemon). В целом все (деплой, настройка клиентской стороны) подробно описано по ссылке к серверу в header.

# create & start container
sudo docker run --name ipsec-vpn-server --env-file ./vpn.env --restart=always -v ikev2-vpn-data:/etc/ipsec.d -v /lib/modules:/lib/modules:ro -p 500:500/udp -p 4500:4500/udp -d --privileged hwdsl2/ipsec-vpn-server  

# users in container (врятли пригодится)
cat /etc/ipsec.d/passwd

# включение логов с username (по умолчанию отключены)
https://github.com/hwdsl2/docker-ipsec-vpn-server/blob/master/docs/advanced-usage.md#enable-libreswan-logs

Из особенностей:

  • пример ручной настройки того же (ipsec + l2tp)
  • если хочется из под одной учетной записи заходить с разных устройств, то это возможно, но оба устройства должны использовать один тип VPN
  • при настройке L2TP не забываем включать опцию по передаче всего трафика в туннель, по умолчанию во многих клиентах она отключена
  • нужно пробрасывать UDP порты 500/4500 для работы (IPSec NAT-T)
The ports that are exposed for this container to work are:
4500/udp and 500/udp for IPsec

a0e3be0f032a hwdsl2/ipsec-vpn-server "/opt/src/run.sh" 8 months ago Up 56 seconds 0.0.0.0:500->500/udp, 0.0.0.0:4500->4500/udp ipsec-vpn-server
  • статус сервера и подключенные клиенты (для быстрого доступа к командам)
sudo docker exec -it ipsec-vpn-server ipsec status
sudo docker exec -it ipsec-vpn-server ipsec whack --trafficstatus
sudo docker logs ipsec-vpn-server

# внутри контейнера
sudo docker exec -it ipsec-vpn-server bash
/etc/xl2tpd/xl2tpd.conf
cat /etc/ppp/options.xl2tpd
cat /etc/ipsec.d/passwd
-bash-4.2$ sudo docker exec -it ipsec-vpn-server ipsec whack --trafficstatus
006 #70: "l2tp-psk"[35] <in_ip>, type=ESP, add_time=1590312870, inBytes=65469, outBytes=312426, id='192.168.100.40'
006 #72: "l2tp-psk"[36] <in_ip>, type=ESP, add_time=1590312885, inBytes=8754, outBytes=7686, id='192.168.100.43'
006 #142: "xauth-psk"[16] <in_ip>, username=<username>, type=ESP, add_time=0, inBytes=225856, outBytes=316252, lease=192.168.43.10/32

Используя L2TP сервер (напр. docker ipsec-vpn-server) можно настроить устройства на iOS с опцией автоподключения к сети при разрыве с любых сетей, используя функционал “VPN On Demand”. Подробнее тут.

GRE

GRE поднимается в aws. Подробный пример настройки

1) Включить роутинг на Linux, применять не надо.
root@debian:~# cat /proc/sys/net/ipv4/ip_forward
1
2) Настроить gre tunnel на разных сторонах
Server1
ip tunnel add gre666 mode gre remote 172.16.0.2 local 172.16.0.1 ttl 255
ip link set gre666 up
ip addr add 1.1.1.1/24 dev gre666
ip route add 10.1.0.0/24 via 1.1.1.1
ip addr add 10.0.0.1/32 dev lo
ip link set gre666 mtu 1400 # при необходимости

Server2
ip tunnel add gre666 mode gre remote 172.16.0.1 local 172.16.0.2 ttl 255
ip link set gre666 up
ip addr add 1.1.1.2/24 dev gre666
ip route add 10.100.0.1/24 via 1.1.1.2
ip addr add 10.1.0.1/32 dev lo
ip link set gre666 mtu 1400 # при необходимости
3) Проверяем настройку
root@debian:~# ip tunnel
gre0: gre/ip remote any local any ttl inherit nopmtudisc
gre666: gre/ip remote 172.16.0.2 local 172.16.0.1 ttl 255
root@debian:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 10.0.0.1/32 scope global lo
       valid_lft forever preferred_lft foreve
10: gre666@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN group default qlen 1
    link/gre 172.16.0.1 peer 172.16.0.2
    inet 1.1.1.1/24 scope global gre666
       valid_lft forever preferred_lft forever
    inet6 fe80::5efe:ac10:1/64 scope link
       valid_lft forever preferred_lft forever

root@debian:~# ping 10.1.0.1 -M do -s 1500
PING 10.1.0.1 (10.1.0.1) 1500(1528) bytes of data.
ping: local error: Message too long, mtu=1400
ping: local error: Message too long, mtu=1400
ping: local error: Message too long, mtu=1400
ping: local error: Message too long, mtu=1400
ping: local error: Message too long, mtu=1400
4) Удаление интерфейса
ip link set gre0 down
ip tunnel del gre0
stunnel
Иногда используется для шифрования между девайсами с разными ОС (Windows, Linux, Android). Само шифрование осуществляется на базе SSL/TLS.

 

Leave a Reply