
Я уже писал как можно просто поднять VPN-сервер заранее настроенный и подружить его с MikroTik, но сейчас планы внезапно поменялись и мне помимо L2TP понадобился еще и OpenVPN и SOCKS5 и SQUID и желательно все в одном месте и волшебное слово недорого.
Ну как говорится если надо, значит надо. Разобьем статью на несколько частей и сегодня начнем с настройки SQUID с поддержкой авторизации.
Squid (англ. squid — «кальмар») — программный пакет, реализующий функцию кэширующего прокси-сервера для протоколов HTTP, FTP, Gopher и (в случае соответствующих настроек) HTTPS. Разработан сообществом как программа с открытым исходным кодом (распространяется в соответствии с GNU GPL). Все запросы выполняет как один неблокируемый процесс ввода-вывода.
(C) Wikipedia
Из предварительной подготовки было сделано:
Соответственно у меня есть контейнер и в нем мы будем устанавливать и настраивать Squid в качестве HTTP/HTTPS-прокси с авторизацией.
Установка прокси-сервера SQUID
Первым делом залезем в контейнер, обновим ОС и установим несколько пакетов которые нам пригодятся.
# lxc exec srv-lxc-squid /bin/bash
# apt-get update
# apt-get upgrade
# apt-get install aptitude mc curl wget
Если на этапе обновления ловим ошибку.
Err:2 http://security.ubuntu.com/ubuntu jammy-security InRelease
Temporary failure resolving 'security.ubuntu.com'
Проверьте ваш файл /etc/resolv.conf вероятно там будет вот такое.
nameserver 127.0.0.53
options edns0 trust-ad
search .
И что интересно после перезагрузки содержимое вернется как и было и вот в этом случае виноват уже не Cloud Init а systemd-resolved и мы его смело отключаем.
# systemctl disable systemd-resolved.service
# systemctl stop systemd-resolved.service
# rm /etc/resolv.conf
И создаем файл /etc/resolv.conf следующего содержания.
nameserver 8.8.8.8
Перезагружаем контейнер и проверяем, что все с DNS в порядке. Следовательно, можем приступать к установке пакетов собственно HTTP/HTTPS-прокси.
# apt-get install squid
Настройка прокси-сервера SQUID
Прокси мы установили, теперь его надо сконфигурировать под наши нужды. Вот здесь есть небольшой нюанс, если мы посмотрим на его конфигурационный файл, то становится ясно, что это практически его документация по всем возможным параметрам.
Давайте скопируем файл конфигурации отдельно и в качестве конфигурационного файла будем использовать выжимку из исходного.
# cp /etc/squid/squid.conf /etc/squid/squid.conf.source
# cat /etc/squid/squid.conf.source | grep -v "^#" | grep -v "^$" > /etc/squid/squid.conf
И теперь вместо бесконечной простыни текста конфигурации которую если распечатать можно небольшую брошюрку сделать мы получили небольшой лаконичный конфиг.
acl localnet src 0.0.0.1-0.255.255.255 # RFC 1122 "this" network (LAN)
acl localnet src 10.0.0.0/8 # RFC 1918 local private network (LAN)
acl localnet src 100.64.0.0/10 # RFC 6598 shared address space (CGN)
acl localnet src 169.254.0.0/16 # RFC 3927 link-local (directly plugged) machines
acl localnet src 172.16.0.0/12 # RFC 1918 local private network (LAN)
acl localnet src 192.168.0.0/16 # RFC 1918 local private network (LAN)
acl localnet src fc00::/7 # RFC 4193 local private network range
acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localhost
include /etc/squid/conf.d/*.conf
http_access deny all
http_port 3128
coredump_dir /var/spool/squid
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern \/(Packages|Sources)(|\.bz2|\.gz|\.xz)$ 0 0% 0 refresh-ims
refresh_pattern \/Release(|\.gpg)$ 0 0% 0 refresh-ims
refresh_pattern \/InRelease$ 0 0% 0 refresh-ims
refresh_pattern \/(Translation-.*)(|\.bz2|\.gz|\.xz)$ 0 0% 0 refresh-ims
refresh_pattern . 0 20% 4320
В сухом остатке мы видим.
- refresh_pattern – это про кэширование, что кешировать и когда обновлять и нас это вполне устроит бай дизайн
- coredump_dir – куда складывать дампы при некорректном завершении приложения
- http_port – порт на котором приложение будет ожидать входящие подключения
- http_access – ограничиваем доступы по ряду правил
- acl – собственно правила
Мы будем разрешать доступ с любых адресов и везде, но по паролю и начнем с банального конфигурационного файла под это, но сменим порт, что бы нас сразу не стали использовать как халявный прокси (каюсь сам сканировал, искал таких лопухов).
В итоге получилось.
acl all_web src 0.0.0.0/0
http_access allow all_web
http_access deny all
http_port 8527
coredump_dir /var/spool/squid
visible_hostname srv-lxc-squid
Конфигурация минималистичная и добавилось только visible_hostname, но это чисто декоративная штука. Перезапускаем, активируем.
# systemctl enable squid
# systemctl restart squid
Операция перезапуска не моментальная, даже без активных подключений.
Первым делом проверяем какой белый адрес у нас будет обнаружен при прямом запросе.
# curl http://ifconfig.io
92.246.129.81
Давайте попробуем через прокси.
# curl -x http://127.0.0.1:8527 -L http://ifconfig.io
92.246.129.81
Здесь все как бы предсказуемо, а попробуем с другого хоста в VPN-сети.
# curl -x http://10.101.5.2:8527 -L http://ifconfig.io
92.246.129.81
Отлично и все работает как мы и задумывали и теперь нам надо прикрутить авторизацию по логин-пароль. Для этого нам, как обычно, понадобятся apache2-utils про которые я уже много писал и повторяться не будем и просто создадим файл содержащий данные авторизации пользователя с паролем.
Установим пакет.
# apt install apache2-utils
Создаем файл авторизации.
# htpasswd -c /etc/squid/users chernousov
Аналогично.
- htpasswd -b /etc/squid/users chernousov2 – добавить
- htpasswd -D /etc/squid/users chernousov2 – удалить
Немного подправим конфигурацию для использования авторизации вместо можно всем.
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/users
auth_param basic children 5
auth_param basic credentialsttl 8 hours
acl users proxy_auth REQUIRED
http_access allow users
http_access deny all
http_port 8527
coredump_dir /var/spool/squid
visible_hostname srv-lxc-squid
Проверим, что требуется авторизация.
# curl -x http://10.101.5.2:8527 -L http://ifconfig.io
Отлично, получаем ошибку.
<p>Sorry, you are not currently allowed to request http://ifconfig.io/ from this cache until you have authenticated yourself.</p>
Давайте теперь с авторизацией.
# curl -x http://10.101.5.2:8527 --proxy-user chernousov:'xxxSUPER!$PASSWORDxxx' -L http://ifconfig.io
92.246.129.81
Отлично, с авторизацией мы решили и теперь с хоста прокидываем порт до контейнера. Это я уже описывал в шпаргалке “Шпаргалка по типовым конструкциям IPtables” и в моем случае просто добиваем в конфигурацию FireWall одну строку.
iptables -t nat -A PREROUTING -p tcp -i enp0s5 --dport 8527 -j DNAT --to-destination 10.101.5.2:8527
Пробуем из дикого интернета и если все ОК, то пробуем из браузера.

Добро пожаловать в Бразилию. Теперь сходим, посмотрим на Facebook.

Красиво показывает. Добавляем внутренние сети в исключения и продолжаем.
Проверим теперь как мы хорошо спрятались
Для проверки можно использовать сервис http://www.whatismyproxy.com.

Палимся по куче заголовков на нашей минимальной конфигурации, давайте исправлять. Для этого добавим в конфигурацию несколько параметров.
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access User-Agent deny all
request_header_access Connection deny all
request_header_replace Connection closed
Теперь стало гораздо интереснее.

В принципе на этом можно и остановиться, но пропишем еще и мои ДНС с блокировкой рекламы.
Было.

Добавляем параметр.
dns_nameservers 10.100.1.1 10.100.1.2
Стало.

Итого, с HTTP-прокси закончили, теперь надо socks5.