В общем такая проблема, есть система RHEL 6.4 Server с парой сетевых интерфейсов, объединенных в один методом bonding. У этой системы IP адрес: 10.7.7.1
. Далее на системе запущено приложение, которому нужно подключиться к MySQL-серверу 10.7.7.2
на порт 3306 . И на самом деле MySQL работает на 10.7.7.3
. Параметры подключения в приложении жестко прописаны поэтому не могут быть изменены . Что можно услышать черезiptablesсделать преобразование адресов. Как сделать так, чтобы когда приложение попыталось10.7.7.2:3306
iptablesперехватывается и отправляется запрос 10.7.7.3:3306
, и получен ответ, и передается в приложение?
решение1
Это можно сделать с помощью правил NAT в iptables.
Если сервер MySQL находится на том же хосте, используйте правила REDIRECT. Перенаправьте все соединения на порт 3306, а не на 10.7.7.3, на требуемый адрес.
Если сервер MySQL находится не на том же хосте, используйте правило DNAT.
решение2
При условии, что
- .1, .2 и .3 — это разные машины
- Вы не можете поменять местами IP-адреса .2 и .3.
- .2 работает под управлением Linux
Вот что вам нужно добавить в .2:
-t nat -A PREROUTING -d 10.7.7.2 -p tcp --dport 3306 -j DNAT --to-destination 10.7.7.3
-t nat -A POSTROUTING -d 10.7.7.3 -p tcp --dport 3306 -j SNAT --to-source 10.7.7.2
ОДНАКО...
Если по каким-то причинам вы не можете создать правила iptables на .2 и/или хотите перехватывать трафик на .1, все, что вам нужно сделать на .1, это:
-t nat -A POSTROUTING -d 10.7.7.2 -p tcp --dport 3306 -j DNAT --to-destination 10.7.7.3