Я играю с nftables и наблюдаю странное поведение, которое не могу объяснить.
У меня есть три ВМ, источник
, маршрутизатор
и пункт назначения
. Все работают под управлением последней версии Oracle EL 8.5 и настраиваются через nft.
источник
имеет единый сетевой интерфейс enp0s8
с IP 10.111.111.1 в подсети /24.
маршрутизатор
имеет два сетевых интерфейса: enp0s8
с IP 10.111.111.2 в подсети /24 и enp0s9
с IP 10.100.100.2 в подсети /24.
пункт назначения
имеет единый сетевой интерфейс enp0s8
с IP 10.100.100.1 в подсети /24.
Моя цель - иметь пункт назначения
спрятано от источник
за NAT, с IP 10.200.200.1. Что я сделал:
- Включена IP-маршрутизация
маршрутизатор
.
- Заблокирован прямой доступ с 10.111.111.0/24 на 10.100.100.0/24 в
маршрутизатор
.
- Добавлен статический маршрут 10.200.200.0/24 через 10.111.111.2 (
маршрутизатор
) на источник
.
- Настроил NAT на
маршрутизатор
следующее:
предварительная маршрутизация цепи {
type nat hook prerouting priority dstnat; политика принять;
iifname "enp0s8" IP-адрес 10.200.200.1 dnat до 10.100.100.1
}
посттрассировка цепи {
введите nat hook приоритет постмаршрутизации srcnat; политика принять;
ip saddr 10.100.100.1 oifname "enp0s8" snat to 10.200.200.1
}
Все работает как положено, пункт назначения
доступен из источник
только как 10.200.200.1, а не как 10.100.100.1 (конечно, я знаю, что под рутом работать плохо, это просто экспериментальные ВМ):
[root@source ~]# пинг 10.100.100.1
PING 10.100.100.1 (10.100.100.1) 56 (84) байт данных.
^ С
--- Статистика пинга 10.100.100.1 ---
15 пакетов передано, 0 получено, 100% потери пакетов, время 14320 мс
[root@source ~]# пинг 10.200.200.1
PING 10.200.200.1 (10.200.200.1) 56 (84) байт данных.
64 байта из 10.200.200.1: icmp_seq=1 ttl=63 время=0,554 мс
64 байта из 10.200.200.1: icmp_seq=2 ttl=63 время=1,80 мс
64 байта из 10.200.200.1: icmp_seq=3 ttl=63 время=1,84 мс
^ С
--- Статистика пинга 10.200.200.1 ---
3 пакета передано, 3 получено, 0% потери пакетов, время 2043 мс
rtt min/avg/max/mdev = 0,554/1,397/1,836/0,598 мс
Но когда я делаю traceroute или отправляю ping с TTL=1, ответ имеет IP 10.200.200.1 вместо маршрутизатор
IP-адрес 10.111.111.2:
[root@source ~]# трассировка 10.200.200.1
traceroute до 10.200.200.1 (10.200.200.1), макс. 30 переходов, пакеты по 60 байт
1 10.200.200.1 (10.200.200.1) 0,752 мс 0,679 мс 0,984 мс
2 10.200.200.1 (10.200.200.1) 1,181 мс 1,130 мс 1,070 мс
[root@source ~]# ping 10.200.200.1 -c 1 -t 1
PING 10.200.200.1 (10.200.200.1) 56 (84) байт данных.
Из 10.200.200.1 icmp_seq=1 Превышено время жизни
--- Статистика пинга 10.200.200.1 ---
1 пакет передан, 0 получен, +1 ошибка, 100% потеря пакетов, время 0 мс
Если я сделаю то же самое для любого другого адреса в подсети 10.200.200.0/24, ответы будут иметь правильные IP-адреса:
[root@source ~]# ping 10.200.200.2 -c 1 -t 1
PING 10.200.200.2 (10.200.200.2) 56(84) байт данных.
Из 10.111.111.2 icmp_seq=1 Превышено время жизни
--- Статистика пинга 10.200.200.2 ---
1 пакет передан, 0 получен, +1 ошибка, 100% потеря пакетов, время 0 мс
Кто-нибудь может пояснить, почему в первом случае превышение TTL ICMP имеет IP-адрес конечного пункта назначения, а во втором случае - IP-адрес маршрутизатора?