iptables SNAT не работает для пакетов GRE

Я пытаюсь применить SNAT к клиенту PPTP. Пакеты TCP / 1723 правильно привязаны к SNAT, но не GRE. Может ли кто-нибудь заметить, что не так?

У меня следующая конфигурация iptables:

$ sudo iptables -t nat -L POSTROUTING -v -n
Chain POSTROUTING (policy ACCEPT 616 packets, 37030 bytes)
pkts bytes target     prot opt in     out     source               destination         
   0     0 SNAT       47   --  *      *       $internal_ip         0.0.0.0/0            to:$external_ip

При проверке исходящего трафика на исходящем интерфейсе с помощью tcpdump я вижу следующее:

<timestamp> IP $internal_ip > $target_ip: GREv1, call 31607, seq 1, length 36: LCP, Conf-Request (0x01), id 1, length 22

... вместо ожидаемого $ external_ip > очевидно, что перевод SNAT не работает (как видно из 0 pkts 0 bytes ).

У меня загружены следующие модули (среди прочих) :

nf_nat_proto_gre
nf_conntrack_proto_gre   
nf_conntrack_pptp
nf_nat_pptp

Несколько примечаний на случай, если это актуально:

  • Маршрутизация происходит в восходящем направлении с использованием стороннего межсетевого экрана (так что исходящие пакеты уже находятся на правильном исходящем интерфейсе).
  • Межсетевой экран фактически работает на виртуальной машине (приведенный выше список iptables приведен выше) от его гипервизора), соединенного с выходным интерфейсом.
  • Пакеты TCP / 1723 передаются межсетевым экраном по протоколу SNAT (но не GRE); Я эффективно пытаюсь использовать IPTables в качестве обходного пути к недостатку брандмауэра. Предположительно IPTables не заботится о том, как туда попали пакеты?
  • Выходной интерфейс / мост имеет статический IP-адрес, который отличается от $ external_ip (хотя и в той же подсети)

Это Сервер Ubuntu 14.04 под управлением 3.13.0-123-generic

1
задан 10 July 2017 в 13:01
1 ответ

Прежде всего, в вашей команде iptables отсутствует часть -t nat . Но это должно вызвать ошибку, поскольку по умолчанию в таблице фильтров нет таблицы POSTROUTING. Убедитесь, что вы добавляете это в правильную таблицу. Это очень похоже на этот вопрос: NAT GRE (IP-протокол 47) через маршрутизатор Linux

Затем убедитесь, что вы указали правильный $ internal_ip и что он соответствует тому, который вы видите в вашем tcpdump. Иногда простая опечатка ускользает из поля зрения и усложняет ситуацию.

Также проверьте, что в ваших правилах iptables нет предыдущего правила, которое срабатывает перед правилом SNAT. В этом случае Netfilter инициирует только первое совпадение. Ваше примечание о том, что TCP / 1723 имеет natted, на самом деле означает, что у вас есть другие правила.

Если это не помогает, обязательно проверьте и опубликуйте свою подробную конфигурацию с помощью iptables -t nat -L -v -n и такие вещи, как ip rule ls && ip route ls . С помощью переключателя -v с iptables вы можете увидеть, сколько пакетов было запущено с каждым из ваших правил.

Вы работаете внутри виртуальной машины. Также проверьте правила iptables для вашего хост-узла! Ваше правило могло работать, но брандмауэр хост-узла перезаписал упакованный исходный IP-адрес, поступающий с вашей виртуальной машины, обратно на ваш внутренний IP-адрес. Похоже, вы проверяете пакеты где-то еще, т.е. не непосредственно на вашей виртуальной машине.

1
ответ дан 3 December 2019 в 23:28

Теги

Похожие вопросы