Я пытаюсь настроить 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