Amazon Linux - правила iptables NAT не соответствуют трафику GRE

Я пытаюсь прототипировать что-то в AWS VPC/EC2, но не могу заставить работать мои правила NAT. У меня есть следующие настройки (все экземпляры работают под Amazon Linux AMI):

  • Туннель GRE между экземплярами 10.0.0.10 и 10.1.0.10
  • Экземпляр 10.0.0.10 использует 10.0.1.20 в качестве шлюза для 10.1.0.10
  • Я хочу, чтобы 10.0.1.20 маскировал трафик с 10.0.0.10

Кажется, что 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

Мои приемлемые правила предельно просты; только одно правило 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 показывает запись для внешнего пинга и отсутствие записи для внутреннего пинга.

1 ответ

После долгих часов поисков я наконец нашел ответ:
Пример многоадресной пересылки NAT для IPTPable в PPTP/GRE

Мне просто нужно было установить следующие модули ядра:

sudo modprobe ip_gre
sudo modprobe nf_nat_proto_gre
sudo modprobe nf_conntrack_proto_gre

nf_conntrack_proto_gre это единственный модуль, необходимый для работы NAT, но я установил два других для хорошей меры.

Другие вопросы по тегам