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

Я пытаюсь применить SNAT к клиенту PPTP. Пакеты TCP/1723 обрабатываются правильно, но не 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 SNATed брандмауэром (но не GRE); Я эффективно пытаюсь использовать IPTables как обходной путь к недостатку брандмауэра. Предположительно IPTables не заботится о том, как пакеты туда попали?
  • Выходной интерфейс / мост имеет статический IP-адрес, который отличается от $external_ip (хотя и в одной подсети)

Это сервер Ubuntu 14.04, работающий 3.13.0-123-generic

1 ответ

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

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

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

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

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

Другие вопросы по тегам