Назад | Перейти на главную страницу

Изменить IP-адрес источника входящего пакета

Как я могу изменить исходный 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