К сожалению, у нас есть клиент, который жестко запрограммировал устройство, чтобы оно указывало на определенный 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
Переадресация порта на том же IP
/sbin/iptables -t nat -A PREROUTING -p tcp -d 192.168.2.11 --dport 16000 -j DNAT --to-destination 192.168.2.11:8080
Работает точно так, как ожидалось.
IP и порт переадресованы на другую машину
/sbin/iptables -t nat -A PREROUTING -p tcp -d 192.168.2.11 --dport 16000 -j DNAT --to-destination 192.168.2.12:8080
Соединения, кажется, истекли.
Ограничить переадресацию IP-адресов и портов, чтобы они применялись только к запросам с определенного IP-адреса
/sbin/iptables -t nat -A PREROUTING -p tcp -s 192.168.0.50 -d 192.168.2.11 --dport 16000 -j DNAT --to-destination 192.168.2.12:8080
Я добавил 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, работающий на другом компьютере?