В Linux я создал туннель GRE с именем gre1 172.17.1 -> 172.17.2. IP-адрес Linux-бокса - 10.10.100.100, IP-адрес конечной точки - 10.10.101.101.
Я пытаюсь сделать источник NAT (НЕ NAT назначения) для туннелирования трафика, идущего от Linux, чтобы фактически идти в туннель, если порт назначения - 80. Я безуспешно пробовал что-то в этом направлении:
iptables -t nat -A OUTPUT -p tcp --dport 80 -j SNAT --to 172.17.1.1
iptables -t nat -A FORWARD -p tcp --dport 80 -j SNAT --to 172.17.1.1
Большинство примеров, которые я нашел для туннелирования GRE, относятся к DNAT, а не к SNAT. Любой пример, который подойдет для моего случая?
Если я правильно прочитал ваш вопрос, вы хотите, чтобы трафик порта 80 шел по вашему туннелю. Это делается не с помощью SNAT, а с политикой маршрутизации.
Сначала нам нужно настроить новую таблицу маршрутизации:
# echo "2 tunnel" >> /etc/iproute2/rt_tables
Далее нам нужно настроить таблицу маршрутизации для отправки всего трафика через туннель:
# ip route add default via 172.16.1.2 dev gre1 table tunnel
Теперь нам нужно заставить некоторый трафик использовать эту таблицу маршрутизации, а не таблицу маршрутизации по умолчанию. Это делается путем маркировки пакетов и последующего добавления правила для использования указанной таблицы для этих помеченных пакетов:
# iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --mark 200
# ip rule add fwmark 200 table tunnel
Замените OUTPUT на FORWARD, если вы хотите, чтобы трафик пересылался по туннелю. Это работает только для локально генерируемого трафика с OUTPUT.
Вы можете найти более подробную информацию в Расширенная маршрутизация и управление трафиком Linux (LARTC) руководство.