Как изменить исходный IP-адрес входящего пакета до того, как он достигнет работающей службы?
У меня есть два устройства, Manager и Server, подключенные через 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>
Любая помощь приветствуется.
решение1
NAT зависит от услуг, «запрошенных»iptablesи предоставленоconntrackподсистема. SNAT недоступен до принятия решения о маршрутизации, но остается доступным после того, как пакет был выбран для маршрутизации на хост: в редко используемомнац/ВХОДцепь, как описано встраница руководства:
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> не находится в известном маршруте к Серверу (это может произойти только в том случае, если Сервер не имеетпо умолчаниюroute). Хотя система никогда не отправит пакет обратно (IP или даже ARP) в этот пункт назначения (ответы не SNAT-активируются), маршрут к нему все равно необходим для правильной обработки стеком маршрутизации, который не знает о том, что SNAT произошел.
Так что еслиiptablesПравило выше недостаточно (вероятно, если на сервере нет маршрута по умолчанию), вы можете добавить:
ip route add <A>/32 dev eth0