Все об Arch Linux

Arch Linux будет тем, что вы из него сделаете!

pacman и прокси: переменные окружения

Сразу к делу: pacman ходит через прокси благодаря libcurl, а libcurl читает переменные окружения http_proxy, https_proxy и all_proxy. Экспортируй нужную переменную в оболочке или пропиши её в /etc/environment, и pacman начнёт скачивать пакеты через прокси. Отдельной настройки прокси в конфигах pacman нет, всё решают переменные окружения.

Как pacman использует прокси

pacman скачивает пакеты и базы через библиотеку libcurl. Это та же библиотека, что работает в curl, поэтому правила прокси у них общие. При каждом запросе libcurl смотрит переменные окружения: http_proxy используется для адресов с http://, https_proxy для адресов с https://, а all_proxy подходит для любых протоколов, когда конкретная переменная не задана.

Переменные регистронезависимы: libcurl понимает и http_proxy, и HTTP_PROXY. Но есть нюанс. Многие программы намеренно игнорируют HTTP_PROXY в верхнем регистре, потому что заглавную версию можно подсунуть через HTTP-заголовки в CGI-окружении. Поэтому привыкай писать переменные строчными буквами: http_proxy, https_proxy, all_proxy. Так они сработают везде, включая pacman.

Важно понимать: pacman не читает файл ~/.curlrc. Этот файл разбирает только сама утилита curl, а библиотека libcurl работает с переменными окружения напрямую. Поэтому настройка прокси в .curlrc на pacman не повлияет, как бы аккуратно ты её ни оформил.

Какие переменные окружения нужны для прокси

Полный набор выглядит так:

export http_proxy=http://127.0.0.1:8080
export https_proxy=http://127.0.0.1:8080
export all_proxy=socks5://127.0.0.1:1080
export no_proxy=localhost,127.0.0.1

Что делает каждая из них:

  • http_proxy: прокси для запросов по http://. Зеркала Arch отдают пакеты по http, поэтому эта переменная нужна почти всегда.
  • https_proxy: прокси для https://. Пригодится для AUR-помощников и загрузки по защищённому протоколу.
  • all_proxy: запасной вариант для всех протоколов. Если http_proxy и https_proxy не заданы, libcurl использует all_proxy.
  • no_proxy: список хостов, для которых прокси не нужен. Хосты перечисляются через запятую, без пробелов.

Значения переменных: обычные URL. Например, http://127.0.0.1:8080 для локального HTTP-прокси и socks5://127.0.0.1:1080 для SOCKS5-прокси. Если прокси требует логин и пароль, пиши их прямо в адресе: http://user:password@proxy.example.com:3128.

Переменные должны быть экспортированы, а не просто присвоены. Запись http_proxy=http://127.0.0.1:8080 без export создаст переменную только внутри текущей оболочки, и дочерние процессы, включая pacman, её не увидят. Проверить, что переменная попала в окружение, можно командой env | grep proxy.

Как задать прокси для pacman

Способов три, и они отличаются областью действия.

Временно, в текущей оболочке

Просто экспортируй переменные перед запуском pacman:

export https_proxy=http://127.0.0.1:8080
sudo pacman -Syu

Переменные живут, пока открыт терминал. Закрыл окно, всё пропало. Удобно для разовой проверки.

Для всей системы, через /etc/environment

Файл /etc/environment читается при входе в систему, поэтому переменные из него попадают во все программы, включая pacman под sudo:

sudo tee -a /etc/environment <<'EOF'
http_proxy=http://127.0.0.1:8080
https_proxy=http://127.0.0.1:8080
no_proxy=localhost,127.0.0.1
EOF

После правки выйди из сессии и зайди заново, чтобы переменные подхватились. Это самый надёжный способ для постоянного прокси.

В конфиге пользователя

Можно добавить экспорт в ~/.bashrc или ~/.zshrc. Тогда переменные появятся в каждой новой оболочке. Но учти: при sudo pacman окружение пользователя не передаётся автоматически, поэтому для pacman этот способ работает только с sudo -E или если переменные прописаны в /etc/environment.

Если не хочешь трогать /etc/environment, а pacman запускаешь через sudo, добавь в ~/.bashrc алиас: alias pacman='sudo -E pacman'. Флаг -E сохраняет окружение пользователя, и переменные прокси дойдут до pacman. Минус в том, что через sudo передаётся всё окружение, а не только прокси.

Важный момент: файла ~/.config/pacman/makepkg.conf не существует. Конфиг makepkg лежит в /etc/makepkg.conf, и прокси в нём задаётся не через переменные окружения. Об этом ниже.

Как проверить, что pacman ходит через прокси

Самый простой способ: запустить прокси с логами и посмотреть, приходят ли запросы. Например, tinyproxy пишет каждый запрос в лог. Или следи за соединениями:

ss -tnp | grep 8080

Если pacman реально ходит через прокси, ты увидишь установленные соединения с адресом прокси. Дополнительно можно сравнить скорость: с прокси и без него. Подробнее про медленные зеркала и их диагностику читай в статье «Медленные зеркала: reflector».

Перед тем как проверять pacman, убедись, что прокси вообще работает. Проще всего проверить его утилитой curl: curl -x http://127.0.0.1:8080 https://archlinux.org. Если ответ приходит, прокси жив, и можно переходить к pacman.

Ещё один способ: временно задать заведомо неверный адрес прокси:

export https_proxy=http://127.0.0.1:1
sudo pacman -Syu

Если pacman ругнётся на недоступный прокси, значит переменные работают. Если обновление пройдёт как ни в чём не бывало, прокси не используется.

Какие виды прокси поддерживает pacman

libcurl умеет работать с HTTP, HTTPS и SOCKS-прокси.

  • HTTP-прокси: классика. Адрес вида http://host:port. Подходит для корпоративных сетей и домашних кэширующих прокси.
  • HTTPS-прокси: тот же HTTP-прокси, но соединение с ним идёт по TLS. Адрес https://host:port.
  • SOCKS4 и SOCKS5: адреса socks4://host:port и socks5://host:port. SOCKS работает на уровне TCP, поэтому через него можно ходить даже на адреса, которые HTTP-прокси не пропускает.
  • Аутентификация: логин и пароль прямо в URL: http://user:pass@host:port. Спецсимволы в пароле кодируй как в URL, например %40 вместо @.

Есть ещё прозрачные прокси, которые перехватывают трафик на уровне сети без настройки клиента. Для pacman они невидимы: он просто ходит напрямую, а прокси подменяет соединение сам. Такие схемы обычно настраиваются на роутере или шлюзе и не требуют переменных окружения.

Отдельно стоит упомянуть кэширующие прокси вроде Squid или apt-cacher-ng. Они сохраняют скачанные пакеты у себя, и повторные запросы отдают из кэша. Для Arch это удобно, если у тебя несколько машин в локальной сети: один раз скачал пакет, остальные получили его с прокси. Настройка зеркал для такой схемы описана в статье «Настройка зеркал в Arch Linux».

Как обойти прокси для локального зеркала

Если зеркало лежит в локальной сети, гонять трафик через внешний прокси бессмысленно. Список исключений задаётся через no_proxy:

export no_proxy=localhost,127.0.0.1,192.168.1.0/24

libcurl сравнивает адрес хоста со списком и для совпавших идёт напрямую. Формат простой: хосты и подсети через запятую, без пробелов. Звёздочка * означает «не использовать прокси вообще».

Обрати внимание: no_proxy сравнивает адрес по имени хоста, а не по IP. Если зеркало прописано в mirrorlist как http://mirror.local, в no_proxy пиши именно mirror.local, а не его IP-адрес. Иначе libcurl не совпадёт запись и всё равно пойдёт через прокси.

Нужен ли прокси для своего репозитория через file://?

Нет. Если ты подключил свой репозиторий по file://, pacman читает файлы прямо с диска, сеть не задействуется, а значит, и прокси не нужен. Переменные окружения в этом случае просто игнорируются. Как собрать и подключить такой репозиторий, разобрано в статье «Свой репозиторий: repo-add».

Кстати, тот же принцип работает для любых локальных источников: пакеты из кэша pacman, собранные вручную PKGBUILD’ы, файлы на смонтированном диске. Прокси нужен только там, где есть сетевой запрос.

Как настроить прокси для makepkg

makepkg собирает пакеты и тоже скачивает исходники, часто через curl или wget. Прокси для него задаётся теми же переменными окружения. Прописать их можно прямо в /etc/makepkg.conf:

export http_proxy=http://127.0.0.1:8080
export https_proxy=http://127.0.0.1:8080

Строки с export в начале файла сработают при каждом запуске makepkg. Но если прокси нужен всей системе, проще один раз прописать переменные в /etc/environment, и makepkg подхватит их сам.

Частые вопросы

Почему pacman игнорирует HTTP_PROXY в верхнем регистре?

Потому что многие программы, включая libcurl в некоторых сборках, намеренно не читают HTTP_PROXY заглавными буквами. Это защита от подмены переменной через HTTP-заголовки. Решение простое: используй строчные http_proxy и https_proxy. То же самое касается HTTPS_PROXY и ALL_PROXY. Правило одно: всегда пиши переменные строчными, тогда поведение будет одинаковым во всех программах.

Как задать прокси только для pacman, не трогая остальную систему?

Экспортируй переменные в текущей оболочке перед запуском pacman. Действие закончится вместе с закрытием терминала. Для постоянного эффекта только для pacman можно обернуть команду в скрипт или алиас. Алиас с sudo -E тоже подойдёт, но помни, что он передаёт всё окружение.

Работает ли socks5-прокси с pacman?

Да. libcurl поддерживает SOCKS4 и SOCKS5. Задай all_proxy=socks5://host:port, и pacman пойдёт через него. Учти, что для https_proxy адрес тоже можно указать как socks5. Если прокси требует аутентификацию, укажи её в адресе: socks5://user:pass@host:port.

Нужно ли настраивать прокси для локального зеркала?

Нет. Добавь адрес зеркала в no_proxy, и libcurl пойдёт к нему напрямую. Иначе трафик к локальному зеркалу пойдёт через внешний прокси, что медленно и бессмысленно. То же правило действует для своего репозитория по file://: там сети нет вообще.

Что делать, если через прокси pacman выдаёт ошибки TLS?

Проверь, что https_proxy указывает на рабочий прокси и что прокси пропускает TLS-трафик. Иногда помогает переключение на socks5. Похожие ошибки соединения у AUR-помощников разобраны в статье «AUR: ошибки TLS и EOF». Ещё одна частая причина: устаревший список зеркал. Обнови mirrorlist и повтори обновление.

Полезные ресурсы

Заключение

Прокси для pacman настраивается переменными окружения, потому что скачивание пакетов делает libcurl. Экспортируй http_proxy и https_proxy в оболочке или пропиши их в /etc/environment, добавь локальные зеркала в no_proxy, и pacman будет ходить через прокси без правки своих конфигов. Для makepkg те же переменные можно прописать в /etc/makepkg.conf. Проверка простая: посмотри соединения через ss или задай заведомо неверный адрес прокси.



Не получилось? Поможем настроить

Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Читайте также

Комментарии

Загрузка…

Откроется GitHub: создайте новый issue с вашим комментарием (кнопка «Submit new issue»). После отправки обновите эту страницу — комментарий появится ниже.

Telegram Max