Назад | Перейти на главную страницу

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

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

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

Прежде всего, отсутствует ваша команда 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 switch с помощью iptables вы можете увидеть, сколько пакетов было запущено с каждым из ваших правил.

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