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

Как настроить трафик с определенного IP-адреса, жестко запрограммированного на IP-адрес, для пересылки на другой IP-адрес: PORT с помощью iptables?

К сожалению, у нас есть клиент, который жестко запрограммировал устройство, чтобы оно указывало на определенный IP-адрес и порт. Мы хотели бы перенаправить трафик с их IP-адресов на наш балансировщик нагрузки, который будет отправлять HTTP-запросы POST на пул серверов, способных обрабатывать этот запрос. Я бы хотел, чтобы существующий трафик со всех других IP-адресов не пострадал.

Я считаю, что iptables - лучший способ добиться этого, и я думаю, что эта команда должна работать:

/sbin/iptables -t nat -A PREROUTING -s $CUSTIP -j DNAT -p tcp --dport 8080 -d $CURR_SERVER_IP --to-destination $NEW_SERVER_IP:8080

К сожалению, это не работает должным образом. Я не уверен, нужно ли мне добавлять еще одно правило, возможно, в POSTROUTING цепь?

Ниже я заменил указанные выше переменные реальными IP-адресами и попытался воспроизвести макет в моей тестовой среде поэтапно.

$CURR_SERVER_IP = 192.168.2.11  
$NEW_SERVER_IP = 192.168.2.12  
$CUST_IP = 192.168.0.50  

Работает точно так, как ожидалось.

Соединения, кажется, истекли.

Я добавил ACCEPT правило, как предложил @Massimo, но до сих пор не добился успеха.

Я начал все заново и выполнил следующие команды:

# /sbin/iptables -t nat -A PREROUTING -p tcp -d 192.168.2.11 --dport 16000 -j DNAT --to-destination 192.168.2.12:8080   
# iptables -A FORWARD -j ACCEPT

А теперь правила выглядят так:

# iptables -L  -v --line-numbers  (see FORWARD rule 7)

Chain INPUT (policy ACCEPT 1115M packets, 889G bytes)  
num   pkts bytes target     prot opt in     out     source               destination           
1        0     0 ACCEPT     udp  --  virbr0 any     anywhere             anywhere            udp dpt:domain   
2        0     0 ACCEPT     tcp  --  virbr0 any     anywhere             anywhere            tcp dpt:domain   
3        0     0 ACCEPT     udp  --  virbr0 any     anywhere             anywhere            udp dpt:bootps   
4        0     0 ACCEPT     tcp  --  virbr0 any     anywhere             anywhere            tcp dpt:bootps   

Chain FORWARD (policy ACCEPT 112 packets, 5936 bytes)  
num   pkts bytes target     prot opt in     out     source               destination           
1        0     0 ACCEPT     all  --  any    virbr0  anywhere             192.168.122.0/24    state RELATED,ESTABLISHED 
2        0     0 ACCEPT     all  --  virbr0 any     192.168.122.0/24     anywhere              
3        0     0 ACCEPT     all  --  virbr0 virbr0  anywhere             anywhere              
4        0     0 REJECT     all  --  any    virbr0  anywhere             anywhere            reject-with icmp-port-unreachable 
5        0     0 REJECT     all  --  virbr0 any     anywhere             anywhere            reject-with icmp-port-unreachable 
6        0     0 ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED 
7        6   336 ACCEPT     all  --  any    any     anywhere             anywhere            

Chain OUTPUT (policy ACCEPT 813M packets, 428G bytes)
num   pkts bytes target     prot opt in     out     source               destination         

и

# iptables -L -t nat -v --line-numbers
Chain PREROUTING (policy ACCEPT 3108K packets, 242M bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 DNAT       tcp  --  any    any     anywhere             192.168.2.11 tcp dpt:16000 to:192.168.2.12:8080 

Chain POSTROUTING (policy ACCEPT 13M packets, 790M bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1     8644 1979K MASQUERADE  all  --  any    any     192.168.122.0/24     anywhere            

Chain OUTPUT (policy ACCEPT 13M packets, 792M bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Видит ли кто-нибудь очевидные проблемы, из-за которых время ожидания браузера зависает, когда я перехожу в http://192.168.2.11:16000?

Ваше правило NAT кажется нормальным, но вы также добавили правило ACCEPT для этого трафика?

В противном случае NAT будет работать нормально, но затем полученный пакет будет отброшен без уведомления ...


Обновить:

Вам нужно это правило в цепочке FORWARD (где обрабатываются пакеты, проходящие через брандмауэр, но не связанные напрямую с ним).

Применяются правила FORWARD после Правила PREROUTING (например, NAT), поэтому при применении этого правила пакеты будут выглядеть так, как будто они поступают с исходного IP-адреса, но направлены на измененный новый IP-адрес назначения. Таким образом, правило должно быть примерно таким:

/sbin/iptables -A FORWARD -s $CUSTIP -d $NEW_SERVER_IP -j ACCEPT

Существует настройка sysctl, предотвращающая повторное выполнение dnat. замените eth0 ниже на ваш внешний интерфейсный трафик.

Позволить это

sysctl -w net.ipv4.conf.eth0.route_localnet=1

или

echo 1 > /proc/sys/net/ipv4/conf/eth0/route_localnet

и проверить настройку.

cat /proc/sys/net/ipv4/conf/eth0/route_localnet

теперь вы можете dnat до 127.0.0.1

Я предполагаю, что вы используете Linux-сервер в качестве маршрутизатора и этот Linux-ящик может видеть новый IP-адрес.

Я считаю, что таблица NAT срабатывает только тогда, когда / proc / sys / net / ipv4 / ip_forward установлено в 1. Чтобы сделать это постоянным, поместите следующую строку в /etc/sysctl.conf:

net.ipv4.ip_forward = 1

Я отправил аналогичный вопрос и сам нашел на него ответ. Вот ссылка : -

Как использовать iptables для пересылки запросов на сервер jBoss, работающий на другом компьютере?