Туннелирование и IPSec
?Определение?: инкапсуляция трафика внутрь специального сетевого протокола
Задачи:
- Организация общего адресного пространства
- Аутентификация и шифрование трафика целиком
Простейшее решение: использовать прикладной уровень:
- Подключение и авторизация
Клиент Сервер VPN-клиент ---> eth0: 5.6.7.8 ---> (Интернет) ---> eth0: 1.2.3.4 ---> VPN-сервер
- Создание виртуальных сетевых tun или tap интерфейсов и настройка их как обычных сетевых карт:
Клиент Сервер VPN-клиент <--> eth0: 5.6.7.8 <--> (Интернет) <--> eth0: 1.2.3.4 <--> VPN-сервер | | tun0: 192.168.10.2 tun0: 192.168.10.1
- Обмен данными через туннель:
VPN-клиент <--> eth0: 5.6.7.8 <--> (Интернет) <--> eth0: 1.2.3.4 <--> VPN-сервер | | tun0: 192.168.10.2 <-- (Пакет для 102.168.10.1) ? <-- tun0: 192.168.10.1
На всем протяжении пути от 5.6.7.8 до 1.2.3.4 пакет не меняется.- TCP over TCP ? использование UDP
- Паразитная нагрузка (поля транспортного и прикладного уровней)
Использовать сетевой уровень ( ?IP over IP?) :
- Параметры виртуального сетевого интерфейса: собственный IP-адрес и IP-адреса концов туннеля
Всякий попавший в tun0 пакет инкапсулируется в IP-пакет (например, протокола GRE) с адресами конца туннеля, а этот пакет маршрутизируется
- Проблемы с NAT вида ?много в один?
- Шифрование и аутентификация отсутствуют
Пример: настройка GRE-тоннеля
- На одной стороне:
# ip a show dev enp0s8 2: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000 link/ether 08:00:27:4c:12:2a brd ff:ff:ff:ff:ff:ff inet 10.30.50.3/24 brd 10.30.50.255 scope global enp0s8 inet6 fe80::a00:27ff:fe4c:122a/64 scope link valid_lft forever preferred_lft forever # ip tunnel add tun mode gre remote 10.50.70.3 local 10.30.50.3 # ip a a 192.168.0.30/24 dev tun # ip l set up dev tun [root@uneexclient ~]# ip a show dev tun 5: tun: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN link/gre 10.30.50.3 peer 10.50.70.3 inet 192.168.0.30/24 scope global tun inet6 fe80::5efe:a1e:3203/64 scope link valid_lft forever preferred_lft forever
На другой строне:# ip a show dev enp0s8 2: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000 link/ether 08:00:27:d8:46:fd brd ff:ff:ff:ff:ff:ff inet 10.50.70.3/24 brd 10.50.70.255 scope global enp0s8 inet6 fe80::a00:27ff:fed8:46fd/64 scope link valid_lft forever preferred_lft forever # ip tunnel add tun mode gre remote 10.30.50.3 local 10.50.70.3 # ip a a 192.168.0.50/24 dev tun # ip a show dev tun 5: tun: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN link/gre 10.50.70.3 peer 10.30.50.3 inet 192.168.0.50/24 scope global tun inet6 fe80::5efe:a32:4603/64 scope link valid_lft forever preferred_lft forever # ping 192.168.0.30 PING 192.168.0.30 (192.168.0.30) 56(84) bytes of data. 64 bytes from 192.168.0.30: icmp_req=1 ttl=64 time=1.54 ms ? # traceroute -n 192.168.0.30 traceroute to 192.168.0.30 (192.168.0.30), 30 hops max, 60 byte packets 1 192.168.0.30 1.145 ms 1.145 ms 1.195 ms
Виртуальные машины с GRE-туннелем: одна, другая, маршрутизатор (замена интернету) .
IPSec
Базовая статья: An Illustrated Guide to IPsec, смотреть на картинки обязательно.
- Происхождение: IPv6.
- Назначение: ?прозрачный? IP с аутентификацией и шифрованием
- ? универсальность
- ? задача: аутентификация
- ? задача: шифрование
- ? свойство: сохранение (по возможности) исходных IP-полей
- Использование различных алгоритмов шифрования (как стороны договорятся)
- Протокол обмена ключами с множеством вариантов использования
Четыре вида (2?2):
- Сокрытие трафика:
(нет): Authentication Header (AH)
(да): Encapsulating Security Payload (ESP)
- Какой уровень протоколов защищаем:
(транспортный): Transport Mode
(сетевой): Tunnel Mode
Authentication Header (AH)
Только аутентификация (контрольные суммы), все IP-поля, по возможности, сохраняются
AH + Transport
Структура IPSec-пакета (на примере TCP-контента):
- Поля IP-пакета остаются неизменными, кроме:
proto=TCP ? proto=AH (51)
pkt_len=size ? pkt_len=size+AH_size
Между заголовком и контентом IP-пакета добавляется сам AH (с полем next=TCP)
В целях аутентификации вычисляется контрольная сумма всех полей, кроме тех, что меняются по дороге, а также контента (TCP-пакета)
? вычисляется контрольная сумма полей src_IP и dst_IP
AH + Tunnel
Структура IPSec-пакета (на примере TCP-контента):
- Поля IP-пакета остаются неизменными, кроме:
proto=TCP ? proto=AH (51)
pkt_len=size ? pkt_len=size+AH_size+IP_header_size`
Между заголовком и исходным IP-пакетом в неизменном виде вставляется сам AH (с полем next=IP)
В целях аутентификации вычисляется контрольная сумма всех полей, кроме тех, что меняются по дороге, а также контента (IP-пакета)
? вычисляется контрольная сумма полей src_IP и dst_IP как IPSec-пакета, так и туннелируемого IP-пакета
Encapsulating Security Payload (ESP)
Шифрование и (по необходимости) аутентификация.
ESP + Transport
Структура IPSec-пакета (на примере TCP-контента):
- Поля IP-пакета остаются неизменными, кроме:
proto=TCP ? proto=ESP (50)
pkt_len=size ? pkt_len=new_size
- Далее следует ESP-секция, содержащая заголовок ESP, исходный TCP-пакет и метаданные TCP-пакета, в которой шифруется все, кроме заголовка
? шифруются также метаданные, например поле next=TCP
Далее может (должна) следовать дополнительная аутентификационная секция, в которой считается контрольная сумма всей ESP-секции.
ESP + Tunnel
Структура IPSec-пакета (на примере TCP-контента):
Поля IP-пакета никого не интересуют, потому что они есть внутри туннелируемого контента; поле proto=ESP (50)
- Далее следует ESP-секция, содержащая заголовок ESP, исходный IP-пакет и метаданные IP-пакета, в которой шифруется все, кроме заголовка
? шифруются также метаданные, например поле next=IP
Далее может (должна) следовать дополнительная аутентификационная секция, в которой считается контрольная сумма всей ESP-секции.
?And the winner is? oops? er? never mind?
Вывод: в жизни можно использовать только ESP и лучше в туннельном виде:
- AH не совместим с NAT вида ?много?один?
- ESP+Transport требует настройки IPSec на всех абонентах сети
Ну, и чем это лучше других туннелей?
Виды VPN (первый заход)
- ?Old Windows style?: PPP+GRE
- ?New Windows style?: ipsec+l2tp
- OpenVPN
- ?