Я пытаюсь создать прототип в AWS VPC / EC2, но не могу заставить работать правила NAT. У меня следующая настройка (все экземпляры с AMI Amazon Linux):
Кажется, что NAT работает должным образом для всего, кроме трафика GRE:
10.0.0.10] ping -c 1 10.1.0.10
На шлюзе (10.0.1.20) tcpdump показывает, что выполняется NAT, как и ожидалось:
10.0.1.20] tcpdump -i eth0
IP 10.0.0.10 > 10.1.0.10: ICMP echo request, id 30493, seq 1, length 64
IP 10.0.1.20 > 10.1.0.10: ICMP echo request, id 30493, seq 1, length 64
Однако, если я пингуюсь внутри туннеля GRE, трафик пересылается без преобразования NAT:
10.0.0.10] ping -c 1 10.2.0.10 # 10.2/16 is routed through the GRE tunnel
------
10.0.1.20] tcpdump -i eth0
IP 10.0.0.10 > 10.1.0.10: GREv0, length 88: IP 10.0.0.10 > 10.2.0.10: ICMP echo request, id 30237, seq 1, length 64
IP 10.0.0.10 > 10.1.0.10: GREv0, length 88: IP 10.0.0.10 > 10.2.0.10: ICMP echo request, id 30237, seq 1, length 64
Мои правила iptable чрезвычайно просты; всего одно правило NAT POSTROUTING:
10.0.1.20] sudo iptables -v -t nat -L POSTROUTING
Chain POSTROUTING (policy ACCEPT 6 packets, 411 bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE all -- any any 10.0.0.10 10.1.0.10
Глядя на счетчики пакетов iptables, когда я проверяю связь за пределами туннеля GRE, я вижу, что счетчики предварительной и последующей маршрутизации NAT увеличиваются вместе с счетчиком пересылки таблицы фильтров. Когда я прохожу через туннель GRE, я вижу только приращение счетчика прямого фильтра. Точно так же conntrack -L показывает запись для внешнего ping и нет записи для внутреннего ping.
После многих часов поиска в Google я наконец нашел ответ:
Пример PPTP / GRE Multi-forwarding NAT IPTables
Мне просто нужно было установить следующие модули ядра:
sudo modprobe ip_gre
sudo modprobe nf_nat_proto_gre
sudo modprobe nf_conntrack_proto_gre
nf_conntrack_proto_gre
- это единственный модуль, необходимый для работы NAT, но я установил два других на всякий случай.