Я установил следующее правило таблиц 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