Я пытаюсь заставить один компьютер использовать удаленный прозрачный прокси-сервер squid, перенаправляя все исходящие пакеты, направляемые на порт 80, на прокси-сервер squid, хотя у меня возникают некоторые трудности с точной командной строкой iptables.

В мини-HOWTO по адресу http://tldp.org/HOWTO/TransparentProxy-6.html есть несколько хороших ссылок для двух «крайних» случаев: установка из трех (или более) машин с клиентом, маршрутизатором и прокси, и установка на одной машине, где все три находятся на одной машине.

В моей настройке у меня есть машина (называемая foo) с IP-адресом 192.168.1.100. Обычно он подключается к Интернету через маршрутизатор 192.168.1.1, который выполняет NAT и имеет общедоступный IP-адрес. В этом случае foo также подключается через туннель OpenVPN (адрес туннеля foo - 10.8.0.5/6) к машине с именем bar (удаленный адрес 10.8.0.1), на которой работает squid. Я хочу использовать iptables для маршрутизации всех исходящих пакетов из foo, направляемых на порт 80, на прокси-сервер squid bar на порту 3128.

Я не смог понять, какую цепочку и какие цели использовать; все мои попытки были либо незаконными (-A ВЫХОД без -t nat и --to-destination), либо просто бесполезны (различные комбинации -A PREROUTING, OUTPUT, POSTROUTING и т. д.).

РЕДАКТИРОВАТЬ: самое близкое, что я думаю, было это:

iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to 10.8.0.1:3128

Теперь трафик порта 80 никуда не попадает, но, по крайней мере, он обрабатывается. Использование -A PREROUTING не работает ... может быть, потому что пакеты исходят локально, а не маршрутизируются через машину?

answer

Если я вас правильно понимаю, то, что вы хотите сделать, не будет выполнено простой настройкой iptables. Цель REDIR может использоваться только для целевых процессов, запущенных в локальной системе. Я считаю, что попытка использовать цель DNAT для пересылки на удаленный блок squid удалит часть информации, необходимой удаленному блоку squid для правильной обработки запроса.

Если вы позволите мне немного угадать. Я думаю, вы пытаетесь оставить шлюз по умолчанию 192.168.1.1 на своем хосте, а затем отправить трафик порта 80 через vpn, верно?

Удаленному squid нужна некоторая конфигурация, чтобы он действительно мог действовать как прозрачный прокси. Если вы можете настроить правильное перенаправление iptables на хосте squid, а удаленный хост находится на сетевом пути, то можно использовать некоторую расширенную маршрутизацию для пересылки всех запросов порта 80 через vpn.

PS Если я правильно понимаю ваши потребности, добавьте комментарий, я могу обновить свой ответ более подробной информацией о том, как настроить маршрутизацию.

Зайдите в foo и сделайте следующее: telnet 10.8.0.1 3128

Это работает? В этом случае ваш vpn работает!

Вы можете сделать

GET / HTTP/1.1
Host: www.heise.de

Будет ли отображаться страница? Тогда squid настроен на работу как прозрачный прокси!

В этом случае должны работать простые правила из вашей ссылки:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 10.8.0.1:3128
iptables -t nat -A POSTROUTING -o eth0 -s local-network -d 10.8.0.1 -j SNAT --to iptables-box

(foo - это iptables-box, над которым вы работаете)

Это работает?

здесь вы можете увидеть краткую статью про прозрачный прокси с squid и iptables http://www.linuxconfig.net/2009/11/14/creating-transparent-proxy-with-squid-and-iptables.html