С помощью iptables в Linux можно настроить перенаправление запросов с одного сервера на другой. Расскажу как это делается.
Чтобы перенаправлить трафик с определённого порта на другой сервер, необходимо сначала включить такую возможность у пропускающего сервера. Если нужно, чтобы правило работало даже после перезагрузки, то в файл "/etc/sysctl.conf" добавляем строку:
net.ipv4.ip_forward=1
если нужно только для текущего сеанса, то можно сделать так:
echo "1" > /proc/sys/net/ipv4/ip_forward
или выполнить такую команду:
sysctl net.ipv4.ip_forward=1
После выполнения одной из этих команд, можно приступать к прописыванию правил iptables. А точнее нам нужно выполнить всего три команды на сервере, который будет перенаправлять трафик:
iptables -t nat -A PREROUTING -i интерфейс -p tcp --dport порт_принимающий -m state --state NEW -j DNAT --to ip_куда_направить:порт_куда_направить
iptables -t nat -A PREROUTING -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -p tcp -m tcp --dport порт_принимающий -j SNAT --to-source ip_этого_сервера
"порт_принимающий" - это порт на текущем сервере, на который будет приходить запрос
"порт_куда_направить" - это порт на удалённом сервере, куда будет передаваться запрос
Первая команда перенаправит трафик (DNAT изменяет сетевой адрес получателя).
Вторая команда будет разрешать уже установленные соединения.
А третья строка изменит сетевой адрес отправителя. Если оба сервера не имеют белых ip, то стоит переписать последнюю строку на
iptables -A POSTROUTING -t nat -j MASQUERADE
SNAT можно применять только если оба ip белые. Он работает быстрее, чем MASQUERADE, потому что последний непрерывно спрашивает у сетевой карты какой у неё IP.
Если использовать SNAT, то при кратковременном обрыве соединения есть вероятность, что пакет всё-таки дойдёт до адресата. Потому что пакет не будет отброшен. А вот с MASQUERADE пакет будет отброшен и не дойдёт, даже когда соединение восстановится.
P.S.
На этом механизме перенаправления можно сделать примитивный балансировщик нагрузки. Он будет распределять запросы между серверами. (в будущем, возможно, напишу статью про это...)
При перечислении трёх правил iptables, ближе к концу статьи, вы, видимо, пропустили черточку перед "j".
Поправил. Благодарю!
Алекс, а подскажите пожалуйста, а как сохранить на втором сервере ip кто заходит, а то он всем показывает ip первого сервера. Спасибо
Алекс, подскажите пожалуйста, Ваша статья очень помогла, единственное не понимаю можно ли сделать чтобы сервер 2 видел реальный ip адрес
Рад помочь! К сожалению, быстро не подскажу - уже давно не занимаюсь сетями, нужно разбираться. Если когда-нибудь появится подобная задача, то напишу тут решение.