IPSec между Cisco и Linux, при помощи systemd-networkd и VTI

Соберём простую топологию, как на изображении ниже.

ipsec-topology

Адресация:

  1. 1.1.1.0/24 - сеть провайдера для точки с роутером Cisco
  2. 2.2.2.0/24 - сеть провайдера для точки с роутером Linux
  3. 3.3.3.3/32 - loopback интерфейс, имитирующий удалённую сеть
  4. 10.10.10.0/30 - сеть для туннельных интерфейсов
  5. 192.168.100.0/24 - локальная сеть за роутером Cisco
  6. 192.168.200.0/24 - локальная сеть за роутером Linux

Будет использоваться:

  1. Для настройки сети - systemd-networkd
  2. Для настройки IPSec - strongswan
  3. Для настройки OSPF - frr

По умолчанию Debian 11 использует файлы из директории /etc/network для конфигурации сети.

Т.к. мы будем использовать systemd-networkd, то первым делом переименуем стандартный конфигурационный файл и отключим соответствующий сервис:

Необходимо не забывать, что после этого пропадёт удалённый доступ, если он был. Так что все действия необходимо делать, имея локальный доступ.

mv /etc/network/interfaces /etc/network/interfaces.save
systemctl disable networking.service
systemctl stop networking.service

Далее включим и запустим сервис:

systemctl enable systemd-networkd
systemctl start systemd-networkd

Конфигурационные файлы хранятся в /etc/systemd/network/, т.к. директория по умолчанию пустая, то нам необходимо создать файлы с расширениями: .network - для конфигурации сетевых параметров, .netdev - для создания виртуальных интерфейсов.

Настройка WAN интерфейса

1.Создадим файл с любым названием и расширением .network (systemd проверяет файлы по алфавитному порядку, поэтому удобней использовать число в названии, для управления последовательностью запуска)

touch 10-wan.network

2.Зададим настройки подключения (т.к. в текущей лабораторной нет DNS-сервера, то строку с настройкой закомментирую)

[Match]
Name=ens3
 
[Network]
Address=2.2.2.2/24
Gateway=2.2.2.254
#DNS=2.2.2.254
IPForward=ipv4
IPMasquerade=ipv4
Tunnel=vti0

ens3 - имя интерфейса, который смотрит в сторону провайдера (на топологии в EVE-NG он e0, но это неверно, нумерация, в моем случае, начинается с ens3), в другом образе имя может быть другим.

Tunnel=vti0 - имя туннельного интерфейса, который создадим следующим шагом.

В реальном мире настройка NAT будет производиться с помощью nftables или iptables, в этом примере будет использоваться IPMasquerade=ipv4 (хотя в этой лабораторной NAT не нужен вообще)

Перезагрузим сервис, после чего доступ в интернет (в нашем случае до loopback интерфейса на роутере ISP) должен появиться.

networkctl reload
ping 3.3.3.3
PING 3.3.3.3 (3.3.3.3) 56(84) bytes of data.
64 bytes from 3.3.3.3: icmp_seq=1 ttl=254 time=1.27 ms
64 bytes from 3.3.3.3: icmp_seq=2 ttl=254 time=1.92 ms
64 bytes from 3.3.3.3: icmp_seq=3 ttl=254 time=1.58 ms

Настройка LAN интерфейса

Настройка для LAN интерфейса проста. Создадим файл с расширением .network и просто назначим IP адрес на интерфейс, смотрящий в сторону ПК (ens4).

touch 15-lan.network
[Match]
Name=ens4
 
[Network]
Address=192.168.200.1/24
networkctl reload

Настройка VTI интерфейса

Для использования в Route-based VPN нам необходимо создать VTI интерфейс, для этого:

1.Создадим файл виртуального устройства, с расширением .netdev

touch 25-vti0.netdev

Зададим следующую конфигурацию, в секции [NetDev] укажем название, тип интерфейса и MTU.

В секции [Tunnel] - адрес локального интерфейса, удалённого роутера и ключ (данный ключ будет использоваться в настройках strongswan, для определения трафика, который пойдёт через vti интерфейс).

[NetDev]
Name=vti0
Kind=vti
MTUBytes=1400
 
[Tunnel]
Local=2.2.2.2
Remote=1.1.1.1
Key=69

Имя vti0 используется выше в конфигурации wan интерфейса, эти имена должны совпадать

2.Создадим .network файл, отвечающий за конфигурацию vti интерфейса

touch 25-vti0.network

Просто задаём IP адрес для интерфейса vti0.

[Match]
Name=vti0
 
[Network]
Address=10.10.10.2/30

Для настройки необходим установленный пакет strongswan.

1.Отключаем установку маршрутов при помощи IKE демона, т.к. маршрутизацию мы настроим далее, с помощью пакета frr. Для этого в файле /etc/strongswan.d/charon.conf находим строку с параметром install_routes, раскомментируем её и установим значение в no.

install_routes = no

2.В файле /etc/ipsec.conf настроим параметры IPSec: значения left и leftsubnet используются для локальных адресов, right и rightsubnet - для удалённых.

conn vti-to-cisco
   left=2.2.2.2
        leftsubnet=0.0.0.0/0
        right=1.1.1.1
        rightsubnet=0.0.0.0/0
        ike=aes256-sha2_256-modp1024
        esp=aes-sha2_256
        authby=secret
        auto=start
        keyexchange=ikev2
        lifetime=1440m
        mark=69
        type=tunnel

3.В файле /etc/ipsec.secrets укажем пароль для данного туннеля.

2.2.2.2 : PSK 'IPSEC_KEY'

4.В файле /etc/sysctl.conf необходимо добавить строку для отключения поиска политик для vti интерфейса, т.к. данный интерфейс используется в route-based, а не policy-based VPN.\

Необходимо обратить внимание на имя интерфейса в данной строке (vti0), оно должно совпадать с ранее созданным именем vti.

net.ipv4.conf.vti0.disable_policy=1

5.Перезагрузим сервисы и на этом настройка на роутере с Linux заканчивается (маршрутизацию настроим позже).

systemctl restart systemd-networkd.service
ipsec restart

Вдаваться в детальные настройки не будем, просто приведу последовательность.

1.Настройка WAN и LAN интерфейсов и маршрута по умолчанию:

configure terminal
 interface Ethernet0/1
 ip address 1.1.1.1 255.255.255.0
 ip nat outside
 no shutdown
exit
interface Ethernet0/0
 ip address 192.168.100.1 255.255.255.0
 ip nat inside
 no shutdown
 exit
ip route 0.0.0.0 0.0.0.0 1.1.1.254

2.Настройка NAT (в лабораторной он не нужен, просто для полноты картины):

ip access-list extended NAT
 permit ip 192.168.100.0 0.0.0.255 any
 exit
ip nat inside source list NAT interface Ethernet0/1 overload

3.Настройка IPSec:

crypto ikev2 proposal LINUX_PROPOSAL
 encryption aes-cbc-256
 integrity sha256
 group 2
 
crypto ikev2 policy LINUX_POLICY
 proposal LINUX_PROPOSAL
 
crypto ikev2 keyring LINUX_KEYRING
 peer LINUX
  address 2.2.2.2
  pre-shared-key IPSEC_KEY
 
crypto ikev2 profile LINUX_PROFILE
 match identity remote address 2.2.2.2 255.255.255.255
 authentication remote pre-share
 authentication local pre-share
 keyring local LINUX_KEYRING
 
crypto ipsec transform-set TSET esp-aes esp-sha256-hmac
 mode tunnel
 
crypto ipsec profile LINUX_IPSEC
 set transform-set TSET
 set ikev2-profile LINUX_PROFILE

4.Настройка VTI интерфейса:

interface Tunnel0
 ip address 10.10.10.1 255.255.255.252
 ip mtu 1400
 tunnel source Ethernet0/1
 tunnel mode ipsec ipv4
 tunnel destination 2.2.2.2
 tunnel protection ipsec profile LINUX_IPSEC

На Linux роутере:

root@linuxrouter:~# ipsec status
Security Associations (1 up, 0 connecting):
vti-to-cisco[1]: ESTABLISHED 103 seconds ago, 2.2.2.2[2.2.2.2]...1.1.1.1[1.1.1.1]
vti-to-cisco{1}:  INSTALLED, TUNNEL, reqid 1, ESP SPIs: c0b60312_i 3a106abb_o
vti-to-cisco{1}:   0.0.0.0/0 === 0.0.0.0/0
root@linuxrouter:~# ip tunnel show vti0
vti0: ip/ip remote 1.1.1.1 local 2.2.2.2 dev ens3 ttl inherit nopmtudisc key 69
root@linuxrouter# ping -c 2 10.10.10.1
PING 10.10.10.1 (10.10.10.1) 56(84) bytes of data.
64 bytes from 10.10.10.1: icmp_seq=1 ttl=255 time=0.930 ms
64 bytes from 10.10.10.1: icmp_seq=2 ttl=255 time=0.865 ms
--- 10.10.10.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.865/0.897/0.930/0.032 ms

На роутере Cisco:

CiscoRouter#show crypto ikev2 sa remote 2.2.2.2
Tunnel-id Local   Remote                fvrf/ivrf            Status
1         1.1.1.1/4500          2.2.2.2/4500          none/none            READY
      Encr: AES-CBC, keysize: 256, PRF: SHA256, Hash: SHA256, DH Grp:2, Auth sign: PSK, Auth verify: PSK
      Life/Active Time: 86400/223 sec
CiscoRouter#show ip int br tu0
Interface                  IP-Address      OK? Method Status                Protocol
Tunnel0                    10.10.10.1      YES NVRAM  up                    up
CiscoRouter#ping 10.10.10.2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.10.10.2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 6/6/7 ms

На Linux роутере будет использоваться пакет frr, он должен быть установлен (в собранном для EVE-NG образе он уже присутствует).

Первым делом необходимо включить демон ospf. Для этого в файле /etc/frr/daemons выставить значение ospfd=yes, после чего перезапустить frr.service.

systemctl restart frr.service

Теперь перейдём в интерактивный shell пакета frr, который имеет Cisco-like синтаксис. Для этого наберем vtysh.

Детальной настройки делать не будем, просто укажем сети, которые используются в OSPF процессе:

configure terminal
router ospf
 network 10.10.10.0/30 area 0
 network 192.168.200.0/24 area 0
 end
write memory

Настройки на роутере Cisco:

configure terminal
 router ospf 1
 network 10.10.10.0 0.0.0.3 area 0
 network 192.168.100.0 0.0.0.255 area 0
 end
write memory

Проверим доступность не directly connected сетей.

Со стороны Linux-роутера:

linuxrouter# sh ip ospf neighbor
Neighbor ID     Pri State   Dead Time Address         Interface                        RXmtL RqstL DBsmL
192.168.100.1     1 Full/DROther      37.158s 10.10.10.1      vti0:10.10.10.2                      0     0     0
linuxrouter# show ip route ospf
...
O   10.10.10.0/24 [110/10] is directly connected, vti0, weight 1, 00:17:04
O   10.10.10.0/30 [110/1010] via 10.10.10.1, vti0 inactive, weight 1, 00:15:12
O>* 192.168.100.0/24 [110/20] via 10.10.10.1, vti0, weight 1, 00:15:03
O   192.168.200.0/24 [110/1] is directly connected, ens4, weight 1, 00:16:53
linuxrouter# ping 192.168.100.1
PING 192.168.100.1 (192.168.100.1) 56(84) bytes of data.
64 bytes from 192.168.100.1: icmp_seq=1 ttl=255 time=2.95 ms
64 bytes from 192.168.100.1: icmp_seq=2 ttl=255 time=0.927 ms
64 bytes from 192.168.100.1: icmp_seq=3 ttl=255 time=1.46 ms
--- 192.168.100.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 0.927/1.779/2.954/0.858 ms

Со стороны Cisco:

CiscoRouter#show ip ospf neighbor
Neighbor ID     Pri   State   Dead Time   Address         Interface
192.168.200.1     0   FULL/  -        00:00:32    10.10.10.2      Tunnel0
CiscoRouter#show ip route ospf
...
      10.0.0.0/8 is variably subnetted, 3 subnets, 3 masks
O        10.10.10.0/24 [110/1010] via 10.10.10.2, 00:18:32, Tunnel0
O     192.168.200.0/24 [110/1001] via 10.10.10.2, 00:18:32, Tunnel0
CiscoRouter#ping 192.168.200.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.200.1, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 3/5/7 ms

В качестве образа для ПК будет использоваться встроенный в EVE-NG образ Virtual PC.

Настроим ПК в сети 192.168.100.0/24.

VPCS> set pcname PC-1
PC-1> ip 192.168.100.100/24 192.168.100.1
PC-1> save

Такая же конфигурация для ПК в сети 192.168.200.0/24.

VPCS> set pcname PC-2
PC-2> ip 192.168.200.200/24 192.168.200.1
PC-2> save

Проверим доступность с PC-1 до PC-2 и наоборот, как видно все работает.

PC-1> ping 192.168.200.200
84 bytes from 192.168.200.200 icmp_seq=1 ttl=62 time=2.765 ms
84 bytes from 192.168.200.200 icmp_seq=2 ttl=62 time=1.810 ms
84 bytes from 192.168.200.200 icmp_seq=3 ttl=62 time=2.045 ms
84 bytes from 192.168.200.200 icmp_seq=4 ttl=62 time=2.146 ms
84 bytes from 192.168.200.200 icmp_seq=5 ttl=62 time=2.854 ms
 
PC-1> trace 192.168.200.200
trace to 192.168.200.200, 8 hops max, press Ctrl+C to stop
 1   192.168.100.1   0.606 ms  0.350 ms  0.871 ms
 2   10.10.10.2   2.068 ms  0.916 ms  0.961 ms
 3   *192.168.200.200   1.975 ms (ICMP type:3, code:3, Destination port unreachable
PC-2> ping 192.168.100.100
84 bytes from 192.168.100.100 icmp_seq=1 ttl=62 time=1.832 ms
84 bytes from 192.168.100.100 icmp_seq=2 ttl=62 time=2.061 ms
84 bytes from 192.168.100.100 icmp_seq=3 ttl=62 time=2.307 ms
84 bytes from 192.168.100.100 icmp_seq=4 ttl=62 time=1.803 ms
84 bytes from 192.168.100.100 icmp_seq=5 ttl=62 time=2.827 ms
 
PC-2> trace 192.168.100.100
trace to 192.168.100.100, 8 hops max, press Ctrl+C to stop
 1   192.168.200.1   0.639 ms  0.237 ms  0.218 ms
 2   10.10.10.1   1.875 ms  1.319 ms  1.065 ms
 3   *192.168.100.100   1.133 ms (ICMP type:3, code:3, Destination port unreachable