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

Перенаправление портов с помощью iptables не работает для команд, отправляемых напрямую с консоли

Я установил следующее правило таблиц IP:

sudo iptables -t nat -I PREROUTING --dst 192.168.0.116  -p tcp --dport 80 -j REDIRECT --to-ports 8000


sudo iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
REDIRECT   tcp  --  anywhere             static.snake2.test tcp dpt:www redir   ports 8000

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

Цепочка OUTPUT (policy ACCEPT) target prot opt ​​source destination

Это перенаправит любой трафик с порта 80 данного IP-адреса на порт 8000 того же IP-адреса. Прекрасно работает через браузер.

Что не работает, если я попытаюсь запустить какой-то тест прямо с консоли:

рысь-голова-свалка http://192.168.0.116

или что я намеревался сделать

ab -n 1000 -c20 192.168.0.116

В этом случае правило переадресации просто не работает. Заголовок, возвращаемый обратно, по-прежнему с порта 80 (apache) и не такой, как ожидалось от nginx (8000).

Я почти уверен, что причина, по которой вы это видите, заключается в том, что цепочка PREROUTING не применима к пакетам, которые проходят через интерфейс обратной связи. Когда вы говорите, что он работает в браузере, я предполагаю, что вы имеете в виду с другого компьютера, и в этом случае будет применяться ваше правило. Вам также нужно будет добавить правило в цепочку OUTPUT, чтобы оно работало с трафиком localhost. Что-то вроде этого:

iptables -t nat -I OUTPUT --source 0/0 --destination 0/0 -p tcp --dport 80 -j REDIRECT --to-ports 8000