Как я могу изменить исходный IP-адрес входящего пакета до того, как он достигнет работающей службы
У меня есть два устройства, менеджер и сервер, подключенные через VPN и между ними есть NAT.
IP интерфейса менеджера: A IP интерфейса сервера: B
Менеджер подключается к серверу, используя NAT IP Y, и сервер видит IP X, когда менеджер подключается
Как настроить iptables на сервере таким образом, чтобы при поступлении пакета с исходным IP-адресом X преобразовать его в IP-адрес.
Я знаю, что это не должно быть проблемой в хорошо спроектированной сети и продукте, но на данный момент нам нужен обходной путь, пока он не будет исправлен на стороне программного обеспечения.
Пока что следующие правила iptables не помогли:
iptables -t nat -A POSTROUTING -s <X> -o eth0 -j SNAT --to <A>
Любая помощь приветствуется.
NAT зависит от сервисов, "запрошенных" iptables и предоставлено Conntrack подсистема. SNAT не доступен до принятия решения о маршрутизации, но все еще доступен после того, как пакет был выбран для маршрутизации на хост: в редко используемых nat / INPUT цепочка, как указано в страница руководства:
SNAT
Эта цель действительна только в таблице nat, в
POSTROUTING
иINPUT
цепочки и определенные пользователем цепочки, которые вызываются только из этих цепочек. [...]
Итак, пока сервер получает трафик (не маршрутизируя его дальше), при получении пакета с IP-адреса источника <X> на IP-адрес назначения сервера <B> через интерфейс eth0, можно указать SNAT, чтобы он отображался как адрес источника <A> (который был исходным IP-адресом источника, но эта информация утеряна), а именно:
iptables -t nat -A INPUT -s <X> -d <B> -i eth0 -j SNAT --to <A>
Или используя более простую версию:
iptables -t nat -A INPUT -s <X> -j SNAT --to <A>
Вы можете добавить больше ограничений, например -p tcp --dport XXXX
(XXXX для фактического обслуживания), и вам, вероятно, следует: если вы столкнетесь с проблемой, описанной ниже, вы можете помешать себе получить доступ к системе через VPN. Используйте метод резервного копирования или не делайте это удаленно, если не уверены.
Приведенного выше правила может быть недостаточно из-за маршрутизации. Если IP-адрес <A> не находится на известном маршруте к Серверу (это может произойти только в том случае, если у Сервера нет дефолт маршрут). Хотя система никогда не отправит пакет обратно (IP или даже ARP) этому месту назначения (ответы не имеют SNAT), маршрут к нему все еще необходим для правильной обработки стеком маршрутизации, который не знает, что произошло SNAT.
Так что если iptables приведенного выше правила недостаточно (возможно, если у Сервера нет маршрута по умолчанию), вы можете добавить:
ip route add <A>/32 dev eth0