Типичный сценарий: в локальной сети поднят прокси-сервер (например, корпоративный Squid на HTTP/HTTPS или Dante/Xray/Shadowsocks/V2Ray с портом SOCKS5), и нужно пустить через него трафик локальной машины на Ubuntu.
В Linux нет единого «рубильника», который мгновенно перенаправит абсолютно весь трафик через прокси для всех утилит. Одни приложения уважают переменные окружения, другие требуют индивидуальных конфигов, а третьи игнорируют всё, пока их принудительно не перехватит динамический линковщик.
Ниже — детальный гайд по настройке клиента в Ubuntu со всеми нюансами, готовыми сниппетами и частыми граблями.
0. Базовые вводные
Для примеров примем следующие параметры локального сервера:
- HTTP/HTTPS прокси: 192.168.1.100:8080 (с авторизацией: user:password)
- SOCKS5 прокси: 192.168.1.100:1080
Важнейший нюанс: socks5:// vs socks5h://
Разница критична для работы с DNS:
- socks5:// — резолвит доменное имя локально, а через прокси отправляет только готовый IP-адрес. Если целевой хост заблокирован на уровне вашего локального DNS-провайдера, соединение упадет еще до отправки запроса в прокси.
- socks5h:// (буква h означает host) — передает доменное имя прокси-серверу, и резолв происходит на стороне сервера. Это защищает от DNS-блокировок и предотвращает утечку DNS-запросов (DNS leak).
1. Системные переменные окружения
Самый простой способ, поддерживаемый большинством CLI-инструментов (curl, wget, pip, утилиты на Python/Node.js).
Временная сессия (в текущем терминале)
Для HTTP/HTTPS:
export http_proxy="http://192.168.1.100:8080"
export https_proxy="http://192.168.1.100:8080"
export ftp_proxy="http://192.168.1.100:8080"
export no_proxy="localhost,127.0.0.1,localaddress,.localdomain.com,192.168.1.0/24"
Если прокси требует аутентификации:
export http_proxy="http://user:password@192.168.1.100:8080"
export https_proxy="http://user:password@192.168.1.100:8080"
Для SOCKS5 (всегда используйте socks5h:// для удаленного DNS):
export all_proxy="socks5h://192.168.1.100:1080"
export ALL_PROXY="socks5h://192.168.1.100:1080"
export http_proxy="socks5h://192.168.1.100:1080"
export https_proxy="socks5h://192.168.1.100:1080"
Лайфхак: Регистр имеет значение! Некоторые программы ищут строго строчные переменные (http_proxy), а некоторые (например, Go-бинарники) — прописные (HTTP_PROXY). Задавайте оба варианта:
export HTTP_PROXY="$http_proxy" export HTTPS_PROXY="$https_proxy" export NO_PROXY="$no_proxy"
Персистентная настройка
- Только для конкретного пользователя: добавьте строки экспорта в конец ~/.bashrc или ~/.zshrc.
- Глобально для всех пользователей: отредактируйте файл /etc/environment:
http_proxy="http://192.168.1.100:8080/"
https_proxy="http://192.168.1.100:8080/"
no_proxy="localhost,127.0.0.1,192.168.1.0/24"
2. Форсирование через proxychains4 (proxychains-ng)
Если программа вообще не умеет работать с прокси (не имеет собственных настроек и не читает переменные окружения), на помощь приходит proxychains4. Он подменяет стандартные сетевые вызовы connect() через LD_PRELOAD.
Установка
sudo apt update
sudo apt install -y proxychains4
Конфигурация
Откройте конфигурационный файл:
sudo nano /etc/proxychains4.conf
Основные настройки:
- Выберите режим работы цепочек (раскомментируйте один):
- strict_chain — запросы идут по порядку через все прокси в списке. Если один упал — соединение обрывается.
- dynamic_chain — обходит упавшие прокси и работает с живыми (наиболее надежный режим).
- Включите проксирование DNS:
proxy_dns
(Критично: предотвращает локальную утечку DNS-запросов).
3. В самом конце файла, в блоке [ProxyList], закомментируйте дефолтный socks4 127.0.0.1 9050 и добавьте свой:
# Формат: тип IP порт [логин] [пароль]
socks5 192.168.1.100 1080
# или для HTTP:
# http 192.168.1.100 8080 user password
Использование
Просто укажите proxychains4 перед любой командой:
proxychains4 curl https://icanhazip.com
proxychains4 ssh user@remote-host
proxychains4 nmap -sT -Pn 10.0.0.5
Ограничение: proxychains4 не работает со статически скомпилированными бинарниками (например, некоторыми утилитами на Go/Rust) и перехватывает только TCP. Пакеты ICMP (ping) и UDP через него не пойдут.
3. Точечная настройка утилит и сервисов
APT (Менеджер пакетов)
APT игнорирует системные export http_proxy. Создайте отдельный конфигурационный файл:
sudo nano /etc/apt/apt.conf.d/99proxy
Для HTTP:
Acquire::http::Proxy "http://192.168.1.100:8080/";
Acquire::https::Proxy "http://192.168.1.100:8080/";
Для SOCKS5:
Acquire::http::Proxy "socks5h://192.168.1.100:1080/";
Acquire::https::Proxy "socks5h://192.168.1.100:1080/";
Git
Git умеет настраиваться глобально через git config:
# Через SOCKS5
git config --global http.proxy 'socks5h://192.168.1.100:1080'
git config --global https.proxy 'socks5h://192.168.1.100:1080'
# Сбросить настройки:
git config --global --unset http.proxy
git config --global --unset https.proxy
Для работы по SSH-протоколу (git@github.com:…) прокси настраивается в ~/.ssh/config (см. ниже).
SSH-клиент
В файле ~/.ssh/config можно настроить прокси для конкретных хостов или для всех сразу:
Host *
ProxyCommand nc -X 5 -x 192.168.1.100:1080 %h %p
(Флаг -X 5 задает SOCKS5; для HTTP-CONNECT используется connect-proxy или corkscrew).
Docker Daemon (скачивание образов)
Для docker pull прокси нужно передать сервису systemd:
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf
Вставьте:
[Service]
Environment="HTTP_PROXY=http://192.168.1.100:8080"
Environment="HTTPS_PROXY=http://192.168.1.100:8080"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.local"
Примените изменения:
sudo systemctl daemon-reload
sudo systemctl restart docker
4. Настройка на уровне рабочего стола (GNOME / CLI)
Если используется Ubuntu Desktop, можно переключить системный прокси прямо из терминала через gsettings:
# Переключение режима в 'manual'
gsettings set org.gnome.system.proxy mode 'manual'
# Настройка SOCKS5
gsettings set org.gnome.system.proxy.socks host '192.168.1.100'
gsettings set org.gnome.system.proxy.socks port 1080
# Настройка HTTP/HTTPS
gsettings set org.gnome.system.proxy.http host '192.168.1.100'
gsettings set org.gnome.system.proxy.http port 8080
gsettings set org.gnome.system.proxy.https host '192.168.1.100'
gsettings set org.gnome.system.proxy.https port 8080
# Отключение прокси (возврат в прямое подключение)
gsettings set org.gnome.system.proxy mode 'none'
5. Лайфхаки, грабли и частые ошибки
Грабли #1: sudo сбрасывает переменные окружения
Вы прописали export http_proxy, выполняете sudo apt update или sudo curl, и трафик идет мимо. По умолчанию политика безопасности sudo очищает окружение.
- Решение 1: Использовать флаг -E (сохраняет окружение):
sudo -E apt update
- Решение 2: Добавить сохранение переменных в sudoers:
В sudo visudo добавьте:
Defaults env_keep += "http_proxy https_proxy ftp_proxy all_proxy no_proxy HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY"
Грабли #2: «Почему не работает ping?»
Прокси-серверы уровней 4 (SOCKS) и 7 (HTTP) работают по протоколам TCP/UDP. Утилита ping использует протокол сетевого уровня ICMP. Ни proxychains, ни export http_proxy не могут завернуть ICMP в SOCKS5/HTTP.
Для проверки соединения используйте curl:
curl -I -v https://www.google.com
# или проверить свой внешний IP через прокси:
curl -x socks5h://192.168.1.100:1080 https://ifconfig.me
Лайфхак: Функции быстрого переключения в ~/.bashrc
Добавьте в конец ~/.bashrc удобный переключатель:
proxy_on() {
export PROXY_IP="192.168.1.100"
export http_proxy="socks5h://${PROXY_IP}:1080"
export https_proxy="socks5h://${PROXY_IP}:1080"
export all_proxy="socks5h://${PROXY_IP}:1080"
export HTTP_PROXY="$http_proxy"
export HTTPS_PROXY="$https_proxy"
export ALL_PROXY="$all_proxy"
export no_proxy="localhost,127.0.0.1,192.168.1.0/24"
echo -e "\033[32m[+] Proxy enabled ($all_proxy)\033[0m"
}
proxy_off() {
unset http_proxy https_proxy all_proxy HTTP_PROXY HTTPS_PROXY ALL_PROXY no_proxy
echo -e "\033[31m[-] Proxy disabled\033[0m"
}
proxy_status() {
echo "Current IP: $(curl -s --connect-timeout 3 https://icanhazip.com || echo 'Failed to fetch')"
}
После перезагрузки оболочки (source ~/.bashrc):
- proxy_on — мгновенно включает прокси для текущей сессии;
- proxy_off — отключает;
- proxy_status — быстро проверяет видимый наружу IP.





