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