eth0:0 — это метка, а не устройство: исправьте совпадение SNAT
Нулевой счётчик означает, что правило называет интерфейс, которого не может быть. Прочитайте реальное устройство, исправьте совпадение -o и затем осознанно выберите транслируемый адрес.
Правило NAT, которое должно было дать одному пулу клиентов VPN собственный публичный адрес, стоит на нуле пакетов, а тот же пул продолжает уходить с неверным источником. Обычно правило ошибается не в адресе, а в интерфейсе. -o eth0:0 указывает на устройство, которого не существует, потому что eth0:0 это метка, привязанная к адресу на eth0. Смотреть на счётчики — самый быстрый способ это подтвердить, а исправление меньше, чем предполагает расследование.
Проверьте, как ядро называет устройство
Прочитайте два представления отдельно, прежде чем что-то менять:
ip link show
ip address show dev eth0
ip route get 203.0.113.20
Список связей показывает интерфейсы. Список адресов может показать второй адрес IPv4, несущий метку eth0:0, и устройством для этого адреса по-прежнему является eth0. Руководство по адресам iproute2 рассматривает метку как имя адреса, а не как вторую связь, и именно на этом различии держится вся проблема.
История объясняет путаницу. Старый ifconfig eth0:0 синтаксис действительно выглядел как новый интерфейс, и скрипты той эпохи до сих пор на него ссылаются. В современной системе псевдоним — это метка на адресе, и ничто на пути маршрутизации или netfilter не считает её отдельной точкой выхода.
Проверьте, с чем правило на самом деле совпало
Читайте счётчики вместе со списком правил, а не по памяти:
iptables -t nat -L POSTROUTING -v -n --line-numbers
Правило, счётчик пакетов которого остаётся на нуле, пока идёт подходящий трафик, не оценивается, и условие выходного интерфейса, называющее eth0:0 частая причина. Выходное устройство, выбранное маршрутом, — eth0, поэтому условие, ищущее другое имя, никогда не станет истинным, какой бы адрес источника ни выбрало ядро.
Измените условие на реальное устройство и оставьте метку вне его. Если нужно различить два пула клиентов, которые делят это устройство, различайте их по префиксу источника, а не по имени интерфейса, которого не может быть. Два правила с непересекающимися -s совпадениями читаемы и проверяемы; одно правило с вымышленным устройством — ни то, ни другое. Добавьте каждому правилу комментарий с именем пула, потому что через полгода один префикс никому не скажет, почему оно там.
Проверьте маршрут, выбравший устройство
NAT postrouting выполняется после того, как маршрут уже выбрал выходной интерфейс, поэтому интерфейс в правиле должен быть тем, который выбрал маршрут. Спросите ядро напрямую с помощью ip route get для представительского адреса клиента и прочитайте и устройство, и источник, который оно сообщает.
Если ответ называет eth0, часть правила, относящаяся к интерфейсу, решена. Если он называет туннельное устройство, пакет никогда не доходит до правила, которое вы редактируете, и поиск переходит к таблице маршрутизации и её приоритетам. Правило, которое никогда не совпадает, потому что пакет ушёл в другое место, в выводе счётчиков выглядит так же, как правило с неправильно написанным устройством. Прежде чем что-то менять, подтвердите, какой из двух случаев у вас, потому что второй требует изменения маршрутизации, а не текста.
Осознанно выберите транслируемый источник
Когда устройство верно, адрес источника — отдельное решение. Это лишь иллюстративный пул IPv4 и пример адреса:
iptables -t nat -A POSTROUTING -s 10.8.1.0/24 -o eth0 \
-j SNAT --to-source 203.0.113.20
Запись адреса в --to-source не заставит никого маршрутизировать его обратно к вам. Провайдер вышестоящей сети или владелец адреса должен доставлять ответы для этого адреса на этот хост, и адрес должен быть тем, который вам разрешено использовать. Если нет, правило совпадёт и транслирует, а ответы всё равно уйдут в другое место.
Смена адреса источника — не то же самое, что смена вышестоящего канала. Когда реальное требование — другой физический путь, политика маршрутизации должна сначала выбрать этот путь; затем SNAT переписывает источник на том устройстве, которое выбрала политика. Новые метки на eth0 не дают ни маршрута, ни разрешения.
Проверьте на только что открытом соединении
Откройте новое клиентское соединение вместо повторного использования существующего. Отслеживание соединений сохраняет трансляцию, записанную при старте потока, поэтому старая сессия может продолжать использовать прежний адрес источника и заставлять корректное новое правило выглядеть сломанным. Смотрите, как растёт счётчик, затем посмотрите на транслированный источник на линии или на дальнем конце.
Когда несколько пулов делят один интерфейс, дайте каждому явное совпадение по источнику и собственный адрес трансляции, держите их в управляемой конфигурации межсетевого экрана и записывайте порядок их вычисления. Затем запишите, что вы проверили: устройство из ip route get, счётчик, который сдвинулся, и источник, который увидела удалённая сторона. Эта запись отвечает на следующий отчёт, не повторяя путаницу с псевдонимом.