devzone.org.ua/post/nalashtuvannia-vykhidnoho-proksi-na-bazi-squid.md
2026-01-05 19:53:34 +02:00

6.4 KiB
Raw Permalink Blame History

Налаштування вихідного проксі на базі squid

Якось, був організував собі віртуальну систему, ізольовану від Інтернет засобами VSOCK, з доступом виключно до мережі Yggdrasil. Оскільки мені потрібно звідти якось брати оновлення і робити це безпечно, вирішив на іншій машині, де є Інтернет - підняти вихідний проксі (out-proxy)

Сервер

В Debian, сервер squid ставиться з репозиторію:

apt install squid

Налаштування

Тут в мене передбачається взаємодія між проксі-сервером "a" та клієнтом "b" на IPv6 інтерфейсі:


# інтерфейс, на якому слухати вхідні підключення
# * можна вказати декілька рядків http_port
# * важливо звернути увагу на однойменну глобальну директиву, закоментувавши її:
#   /etc/squid/squid.conf
#   інакше відбудеться оголошення на інтерфейсах ::/0.0.0.0 поряд з IP, вказаним нижче
http_port [aaa:aaaa:aaaa:aaaa:aaaa]:3128

# налаштування журналів
# logfile_rotate 0

# можна підвищити приватність, видаливши заголовки:
# request_header_access From deny all
# request_header_access Referer deny all
# request_header_access User-Agent deny all
#
# reply_header_access Server deny all
# reply_header_access X-Powered-By deny all
# reply_header_access X-Frame-Options deny all
# reply_header_access Strict-Transport-Security deny all

# оголошуємо групу "clients", куди входить IP "b"
acl clients src bbb:bbbb:bbbb:bbbb:bbbb

# оголошуємо набір правил "updates" типу "dstdomain"
# мені проксі потрібен тільки для системних оновлень,
# окрім iptables, на всяк випадок, я вирішив додати правила на піддомени
# * у вас може бути інший набір - дивіться /etc/apt/sources.list.d
# * замість dstdomain можна вказати dst з IP або діапазоном IP (наприклад 0200::/7)
acl updates  dstdomain  .debian.org .debian.net .armbian.com .github.com .gitlab.com .crates.io .fastlydns.net .librewolf.net .nodesource.com

# вмикаємо обмеження у послідовності
http_access    allow      clients    updates
http_access    deny       all

Запускаємо і дивимось чи все в порядку:

  • systemctl restart squid - застосувати зміни конфігурації (перезапуск)
  • systemctl enable squid - автозапуск проксі сервера при старті системи
  • systemctl status squid - статус проксі сервера
  • netstat -tulpn | grep 3128 - перевірити, де слухається порт

Фаєрвол

Yggdrasil - це локальна мережа, відповідно до нашого проксі можуть підключитись усі її користувачі (а не тільки наша віртуальна машина) Якщо ви не хочете щоб усі ходили з вашого Інтернет IP на вказані сервери групи "updates", потрібно дозволити доступ тільки конкретній адресі, у нашому випадку це "b". Для керування iptables, я використовую фронт-енд ufw, тому приклад такий:

ufw allow from bbb:bbbb:bbbb:bbbb:bbbb to aaa:aaaa:aaaa:aaaa:aaaa port 3128 proto tcp
  • переконайтесь що фаєрвол активний і правило додане: ufw status

Також, в мене вимкнені вихідні (пірингові) підключення в Інтернет з машини "a" де працює проксі-сервер, тому я окремо дозволив вихід на 80/443 TCP:

ufw allow out 80,443/tcp

На Веб-порти, я згодом планую дозволяти тільки конкретні IP по списку. Для цього знадобиться скрипт, що резольвитиме DNS і оновлюватиме правила iptables. Є готові "комбайни" типу Dansguardian, але мені тут не потрібен батьківський контроль з його семантичними фільтрами. Вирішуйте це питання для себе окремо.

Клієнт

На клієнтській машині, в залежності від програмного забезпечення, шукаємо його налаштування і вказуємо там проксі. На прикладі apt в Debian, це буде файл:

#/etc/apt/apt.conf.d/proxy.conf
Acquire::http::Proxy "http://[aaa:aaaa:aaaa:aaaa:aaaa]:3128";
Acquire::https::Proxy "http://[aaa:aaaa:aaaa:aaaa:aaaa]:3128";

Для підключення репозиторіїв утилітою extrepo, використовується команда з префіксом:

https_proxy=http://[aaa:aaaa:aaaa:aaaa:aaaa]:3128 extrepo enable librewolf
  • або / і http_proxy

І так далі: тут гуглимо для себе, що кому треба.

Якщо при підключенні бачите помилку групи 400, ймовірно потрібно додати домен до білого списку: йдемо на сервер і змінюємо нашу групу ACL ("updates"), після чого перезапускаємо squid і пробуємо підключитись знову.