# Налаштування вихідного проксі на базі squid Якось, був організував собі [віртуальну систему, ізольовану від Інтернет засобами VSOCK](https://devzone.org.ua/post/izoliatsiia-linux-vid-priamykh-internet-zyednan-na-bazi-qemu-virtual-machine-manager-i-vsock), з доступом виключно до мережі [Yggdrasil](https://devzone.org.ua/post/yggdrasil-mereza-z-detsentralizovanym-routynhom). Оскільки мені потрібно звідти якось брати оновлення і робити це безпечно, вирішив на іншій машині, де є Інтернет - підняти вихідний проксі (out-proxy) ## Сервер В Debian, сервер squid ставиться з репозиторію: ``` bash apt install squid ``` ### Налаштування Тут в мене передбачається взаємодія між проксі-сервером "a" та клієнтом "b" на IPv6 інтерфейсі: ``` /etc/squid/debian.conf #/etc/squid/debian.conf # інтерфейс, на якому слухати вхідні підключення http_port [aaa:aaaa:aaaa:aaaa:aaaa]:3128 # налаштування журналів logfile_rotate 0 # оголошуємо групу "remote", куди входить IP "b" acl remote src bbb:bbbb:bbbb:bbbb:bbbb # оголошуємо набір правил "updates" типу "dstdomain" # мені проксі потрібен тільки для системних оновлень, # окрім iptables, на всяк випадок, я вирішив додати правила на піддомени (у вас може бути інший набір - дивіться /etc/apt/sources.list.d) acl updates dstdomain .debian.org .debian.net .armbian.com .github.com .gitlab.com .crates.io .fastlydns.net .librewolf.net .nodesource.com # вмикаємо обмеження у послідовності http_access allow remote 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` Також, в мене [вимкнені вихідні (пірингові) підключення в Інтернет](https://devzone.org.ua/post/obmezennia-vykhidnykh-zyednan-na-internet-z-ufw) з машини "a" де працює проксі-сервер, тому я окремо дозволив вихід на 80/443 TCP: ``` bash ufw allow out 80,443/tcp ``` На Веб-порти, я згодом планую дозволяти тільки конкретні IP по списку. Для цього знадобиться скрипт, що резольвитиме DNS і оновлюватиме правила iptables. Є готові "комбайни" типу Dansguardian, але мені тут не потрібен батьківський контроль з його семантичними фільтрами. Вирішуйте це питання для себе окремо. ## Клієнт На клієнтській машині, в залежності від програмного забезпечення, шукаємо його налаштування і вказуємо там проксі. На прикладі apt в Debian, це буде файл: ``` /etc/apt/apt.conf.d/proxy.conf #/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 і пробуємо підключитись знову.