Я пытаюсь применить 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
приведен выше) от его гипервизора), соединенного с выходным интерфейсом. $ external_ip
(хотя и в той же подсети) Это Сервер 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
с iptables вы можете увидеть, сколько пакетов было запущено с каждым из ваших правил.
Вы работаете внутри виртуальной машины. Также проверьте правила iptables для вашего хост-узла! Ваше правило могло работать, но брандмауэр хост-узла перезаписал упакованный исходный IP-адрес, поступающий с вашей виртуальной машины, обратно на ваш внутренний IP-адрес. Похоже, вы проверяете пакеты где-то еще, т.е. не непосредственно на вашей виртуальной машине.