я хочу перенаправить веб-трафик следующим образом:
Каждый запрос к порту 80, который HTTP GET получает по данному адресу, должен быть перенаправлен на определенный порт (4444).
Все остальные запросы отправляются на порт 80.
Поскольку я не могу сделать это с помощью модулей веб-прокси и / или пересылки по разным причинам, я ищу способ сделать это с помощью iptables. Вдохновленный Эта статья, я использовал это правило для своих iptables:
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 \
-m string --algo bm --string 'GET /mjpegcgi.cgi' \
-j REDIRECT --to-port 4444
Затем я открыл два процесса netcat, которые прослушивают 4444 и 80. Однако, когда я пытаюсь проверить правило с помощью:
wget -qO- http://192.168.1.88/mjpegcgi.cgi
У меня всегда есть ответ только с порта 80. Что я делаю не так?
Вы не можете осмысленно перенаправить такое соединение, используя совпадение строки. К тому времени GET
по проводам приходит запрос, соединение уже установлено. Помните, что TCP-соединение начинается с трехстороннее рукопожатие; обмен, который устанавливает соединение, не включает никаких данных протокола HTTP.
Также, REDIRECT
правила не повлияют на трафик, исходящий от вашего локального хоста. Если вы тестируете REDIRECT
rules, также убедитесь, что вы тестируете из другой системы.
Вам действительно нужно реализовать прокси-сервер на уровне протокола, чтобы делать такие вещи (например, Apache mod_rewrite
с целью прокси будет работать).