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

OpenVPN: перенаправить весь HTTP-трафик от клиентов на Squid

Я пытаюсь настроить Squid как прозрачный прокси в моей сети OpenVPN:

 __________               ________________                    _____________
| Client   |             | OpenVPN server |                  | Squid Proxy |
| 10.8.0.3 |-------------|    10.8.0.1    |------------------|  10.8.0.2   |
|__________|             |________________|                  |_____________|

По сути, я хочу добиться, чтобы весь HTTP-трафик от клиента проходил через прокси-сервер Squid; Я следую официальному руководству (https://wiki.squid-cache.org/ConfigExamples/Intercept/IptablesPolicyRoute), который рекомендует отмечать весь 80-портовый трафик и затем перенаправлять его на прокси:

# mark everything on port 80 to be routed to the Squid box
iptables -t mangle -A PREROUTING -i tun0 -p tcp --dport 80 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -m mark --mark 2 -j ACCEPT
ip rule add fwmark 2 table proxy
ip route add default via 10.8.0.2 table proxy

Так я и сделал ip route get 8.8.8.8 mark 2 возвращается

8.8.8.8 via 10.8.0.2 dev tun0 table proxy src 10.8.0.1 mark 2 uid 1000

Я проверил iptables и я вижу, что 80-портовые запросы отмечены. Но трафик не приходит 10.8.0.2 - вроде как игнорируется моя маршрутизация (tcpdump port 80 -i tun0 пусто в 10.8.0.2).

Есть ли другое решение для маршрутизации HTTP-трафика внутри сети OpenVPN?

Во-первых, шлюз на самом деле ничего не делает для tun маршрут. Чтобы клиент стал шлюзом (под) сети, вам необходимо иметь iroute(s) в его CCD (client-config-dir) файл. Имя файла должно быть его общим именем (CN).

Скажите, что у вас есть client-config-dir /etc/openvpn/ccd/ в конфигурации openvpn server, а CN прокси-сервера squid, иметь:

iroute 0.0.0.0 0.0.0.0

в /etc/openvpn/ccd/squid.

(Примечание: вам, вероятно, следует избегать нажатия redirect-gateway или route 0.0.0.0 0.0.0.0 с конфигурацией сервера, так как вам не нужен маршрут по умолчанию через собственный tun на прокси-сервере. Вы должны иметь возможность обойти это, установив директиву в /etc/openvpn/ccd/DEFAULT вместо этого, если вы не можете / не хотите иметь его в клиентской конфигурации. Но вам нужно добавить маршрут по умолчанию для других клиентов, чтобы iroute имеет значение.)

Поскольку вы хотите, чтобы прокси-сервер использовался в качестве «шлюза» только для определенных трафиков, убедитесь, что у вас нет client-to-client в конфигурации сервера openvpn, иначе tun на клиентах будет направлять трафик на прокси-сервер напрямую (например, они не покидают туннель, когда достигают сервера openvpn, так что вы можете выборочно перенаправлять их на уровне IP, но внутренне перенаправляются openvpn).

Когда вы выполняете пересылку на уровне IP, убедитесь, что пересылка IP включен с участием sysctl, и разрешается в вашем брандмауэре (например, iptables). Последнее должно использоваться по умолчанию, если вы (или что бы вы ни использовали) не указали иное.

Затем на сервере:

ip route add default dev tun0 table proxy

Вам, наверное, даже не нужно fwmark (и соответствующие iptables rules) для вашего варианта использования, но вместо этого:

ip rule add iif tun0 ipproto tcp dport 80 table proxy

(Примечание: AFAICR iroute 0.0.0.0 0.0.0.0 не предотвратил бы доступ к любому клиенту через tun сервера. Вот почему указанные выше маршрут и правило должны позволять ответам от прокси-сервера также доходить до клиентов.)

РЕДАКТИРОВАТЬ: Если вы хотите, чтобы трафик TCP 80 самого сервера openvpn также направлялся на прокси-сервер, это должно делать:

ip rule add iif lo ippproto tcp dport 80 table proxy