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