اگر در ایران یا هر کشوری با محدودیت اینترنت زندگی میکنید، احتمالاً با این مشکل آشنایید: مرورگرتان با پروکسی یا VPN کار میکند، ولی وقتی ترمینال را باز میکنید و دستور apt install یا pip install را میزنید، خطای اتصال میگیرید. دلیل این خطا ساده است: برنامههای ترمینال از تنظیمات پروکسی مرورگر یا نرمافزارهایی مانند V2Ray استفاده نمیکنند و باید جداگانه پیکربندی شوند. در این نوشته، روشهای مختلف تنظیم پروکسی ترمینال لینوکس را بررسی میکنیم.
فهرست مطالب:
چرا پروکسی در ترمینال؟
برخی از رایجترین مواردی که به پروکسی در ترمینال نیاز دارید عبارتند از:
- دانلود پکیج با apt یا dnf یا pacman یا yum
- نصب کتابخانههای پایتون با pip
- کار با git clone از گیتهاب یا گیتلب
- دانلود فایل با ابزارهایی مانند curl یا wget
- نصب پکیجهای نود با npm یا yarn
- استفاده از ابزارهای خط فرمان (CLI) مثل docker یا gem و …
- اتصال به سرورهای خارجی از محیطهای سازمانی که فقط از طریق پروکسی داخلی به اینترنت دسترسی دارند
در این راهنما، هر روش را از سادهترین (متغیرهای محیطی) تا اختصاصیترین (تنظیم هر ابزار جداگانه) مرور خواهیم کرد.
تذکر: در کل این راهنما فرض شده است که پروکسی شما در آدرس 127.0.0.1 با پورت 8080 در دسترس کاربران و شبکه قرار دارد.
تنظیم پروکسی با متغیرهای محیطی
سادهترین و پرکاربردترین روش برای تنظیم پروکسی در ترمینال لینوکس، تعریف متغیرهای محیطی است. اکثر ابزارهای خط فرمان بهصورت خودکار این متغیرها را میخوانند.
۱) تنظیم پروکسی موقت برای نشست جاری
در صورتی که میخواهید پروکسی ترمینال شما فقط در نشست (session) جاری قابل استفاده باشد، دستورات زیر را داخل ترمینال وارد کنید:
export http_proxy="http://127.0.0.1:8080"
export https_proxy="http://127.0.0.1:8080"
export HTTP_PROXY="http://127.0.0.1:8080"
export HTTPS_PROXY="http://127.0.0.1:8080"
export no_proxy="localhost,127.0.0.1,::1"
export NO_PROXY="localhost,127.0.0.1,::1"
توصیه میشود هم نسخه حروف کوچک و هم نسخه حروف بزرگ را تعریف کنید؛ چون برخی برنامهها فقط یکی از این دو را میخوانند. حالت no_proxy برای جلوگیری از لوپ خوردن روی آدرسهای محلی (local) است.
چنانچه پروکسی شما به نام کاربری و رمز عبور نیاز دارد، به صورت زیر باید تعریف شوند:
export http_proxy="http://username:password@127.0.0.1:8080"
export https_proxy="http://username:password@127.0.0.1:8080"
دقت کنید که با بسته شدن ترمینال فعلی، کل تنظیمات فوق از بین میروند!
۲) تنظیم پروکسی دائمی برای یک کاربر
در صورتی که میخواهید به صورت دائمی برای ترمینال لینوکس یک کاربر خاص، پروکسی تعریف کنید میبایست به صورت زیر عمل کنید. ابتدا یکی از فایلهای bashrc یا zshrc را با یک ادیتور متنی مانند nano باز کنید.
# for bash
nano ~/.bashrc
# for zsh
nano ~/.zshrc
سپس این خطوط را در انتهای آن وارد کنید:
# Proxy Settings
export http_proxy="http://127.0.0.1:8080"
export https_proxy="http://127.0.0.1:8080"
export HTTP_PROXY="http://127.0.0.1:8080"
export HTTPS_PROXY="http://127.0.0.1:8080"
export no_proxy="localhost,127.0.0.1,::1"
export NO_PROXY="localhost,127.0.0.1,::1"
و در نهایت، فایل را reload کنید:
# for bash
source ~/.bashrc
# for zsh
source ~/.zshrc
برای غیرفعال کردن پروکسیهای ترمینال لینوکس میبایست مجدداً همان فایل را باز کرده و خطوط مربوطه را یا حذف کنید یا با قرار دادن کاراکتر # در ابتدای خط، آنها را کامنت کنید.
۳) تنظیم پروکسی دائمی برای کل سیستم
در صورتی که میخواهید به صورت دائمی پروکسی ترمینال لینوکس را برای کل سیستم و همه کاربران تعریف کنید میبایست فایل environment را با دسترسی روت ویرایش کنید:
sudo nano /etc/environment
سپس این خطوط را در انتهای آن وارد کنید:
# Proxy Settings
export http_proxy="http://127.0.0.1:8080"
export https_proxy="http://127.0.0.1:8080"
export HTTP_PROXY="http://127.0.0.1:8080"
export HTTPS_PROXY="http://127.0.0.1:8080"
export no_proxy="localhost,127.0.0.1,::1"
export NO_PROXY="localhost,127.0.0.1,::1"
توجه: این فایل بعد از لاگین، مجدد اعمال میشود و برای سرویسهای systemd کار نمیکند.
تنظیم پروکسی برای پکیج منیجرها
روش بالا که بر اساس متغیرهای محیطی اقدام به تعریف پروکسی ترمینال لینوکس میکند، در اکثر موارد کافی است؛ اما برخی پکیج منیجرها، فایل پیکربندی مخصوص خودشان را دارند که اولویت بیشتری نسبت به متغیرهای محیطی دارد. برای این موارد، لازم است تنظیمات جداگانه پروکسی ترمینال را انجام دهید.
۱) تنظیم پروکسی برای apt
در توزیعهای لینوکسی مبتنی بر دبیان مانند اوبونتو، دانلود و مدیریت پکیجها از طریق apt انجام میشود. apt به صورت پیشفرض، متغیرهای محیطی را نادیده میگیرد (مخصوصاً وقتی با sudo اجرا میشود). بنابراین باید پروکسی را مستقیماً برای apt تعریف کنید. برای این کار، ۳ روش متفاوت وجود دارد:
۱-۱) تنظیم دائمی (پیشنهادی)
ابتدا یک فایل به نام 95proxies در مسیر زیر بسازید. میتوانید این کار را با یک ادیتور متنی مانند nano و دسترسی روت انجام دهید:
sudo nano /etc/apt/apt.conf.d/95proxies
سپس این کدها را در این فایل وارد کنید:
Acquire::http::Proxy "http://127.0.0.1:8080";
Acquire::https::Proxy "http://127.0.0.1:8080";
Acquire::ftp::Proxy "ftp://127.0.0.1:8080";
۱-۲) تنظیم موقت
میتوانید در هر بار اجرای دستورات apt نیز پروکسی را با سوییچ o- مشخص کنید:
sudo apt -o Acquire::http::Proxy="http://127.0.0.1:8080" update
در این حالت، دستور آپدیت با استفاده از پروکسی تعریف شده انجام میشود.
۱-۳) پاس دادن متغیر محیطی
همچنین میتوانید متغیرهای محیطی کاربر جاری را با سوییچ زیر به sudo پاس بدهید. در این حالت، sudo متغیرهای محیطی کاربر جاری را قبل از اجرای ادامه دستور، فراخوانی میکند:
sudo -E apt update
۲) تنظیم پروکسی برای dnf و yum
در توزیعهای لینوکسی مبتنی بر فدورا مانند CentOS و RHEL، دانلود و مدیریت پکیجها از طریق dnf و yum انجام میشود. پروکسی این پکیج منیجرها را میتوانید با ویرایش فایل زیر تعریف کنید:
sudo nano /etc/dnf/dnf.conf
در انتهای فایل اضافه کنید:
proxy=http://127.0.0.1:8080
# authentication info
proxy_username=your_username
proxy_password=your_password
در صورتی که پروکسی مورد استفاده شما نیازمند نام کاربری و رمز عبور است، میبایست آنها را به صورت جداگانه داخل فایل تعریف کنید.
تذکر: برای پکیج منیجر yum (CentOS نسخه ۷ و قدیمیتر)، همین تنظیمات را باید در فایل etc/yum.conf اعمال کنید.
۳) تنظیم پروکسی برای pacman
در توزیعهای لینوکسی مبتنی بر آرچ لینوکس مانند مانجارو، دانلود و مدیریت پکیجها از طریق pacman انجام میشود. pacman از متغیرهای محیطی استفاده میکند، ولی چون با sudo اجرا میشود باید از یکی از روشهای زیر استفاده کنید:
۳-۱) پاس دادن متغیر محیطی
مشابه apt میتوانید متغیرهای محیطی کاربر جاری را با سوییچ زیر به sudo پاس بدهید.
sudo -E pacman -Syu
۳-۲) تعریف پروکسی در sudoers
دستور زیر را در ترمینال آرچ لینوکسی خود وارد کنید:
sudo visudo
سپس خط زیر را به آن اضافه کنید:
Defaults env_keep += "http_proxy https_proxy HTTP_PROXY HTTPS_PROXY no_proxy NO_PROXY"
دستور اول، فایل etc/sudoers را باز میکند. بهصورت پیشفرض، sudo وقتی اجرا میشود محیط (environment) کاربر را پاک میکند و متغیرهای محیطی مثل http_proxy را حذف میکند؛ به همین دلیل sudo pacman پروکسی شما را نمیبیند. خطی که به پایان آن اضافه میکنید به sudo میگوید این متغیرهای خاص را نگه داشته و به محیط جدید منتقل کند. پس pacman همان http_proxy که شما در ترمینال تنظیم کردهاید را میبیند.
برای AUR helper هایی مثل yay یا paru، متغیرهای محیطی بهخوبی کار میکنند چون بدون sudo اجرا میشوند.
تنظیم پروکسی برای git
ابزار git تنظیمات پروکسی خودش را دارد اما از متغیرهای محیطی نیز پشتیبانی میکند. بنابراین میتوانید آن را مستقیم هم پیکربندی کنید:
۱) تنظیم عمومی
با استفاده از ۲ دستور زیر در محیط ترمینال، میتوانید پروکسی خود را به صورت عمومی برای گیت تعریف کنید:
# HTTP proxy
git config --global http.proxy http://127.0.0.1:8080
# HTTPS proxy
git config --global https.proxy http://127.0.0.1:8080
این پروکسی برای کل دستورات مبتنی بر git اعمال خواهد شد.
۲) تنظیم برای یک repo
در صورتی که میخواهید فقط برای یک repo خاص پروکسی تنظیم کنید، کافیست به پوشه مدنظر وارد شده و سپس دستور زیر را داخل ترمینال وارد کنید:
git config http.proxy http://127.0.0.1:8080
۳) تنظیم برای یک دامنه
اگر از سایتهای مختلفی برای کنترل نسخه با git استفاده میکنید، میتوانید مشخص کنید که برای کدام دامنه از پروکسی استفاده شود:
git config --global http.https://github.com.proxy http://127.0.0.1:8080
این قابلیت برای زمانی مفید است که به عنوان مثال، دسترسی به گیتهاب با محدودیت روبرو شده ولی سیستم کنترل نسخه دیگری که مبتنی بر گیت است (سرور داخلی شرکت/سازمان)، همچنان در دسترس است.
۴) تنظیم پروکسی socks5 برای گیت
اگر نرمافزار پروکسی شما (مانند Clash یا V2Ray) از پروتکل SOCKS5 پشتیبانی میکند، میتوانید آنها را به صورت زیر تعریف کنید:
git config --global http.proxy socks5://127.0.0.1:1080
git config --global https.proxy socks5://127.0.0.1:1080
۵) حذف تنظیمات پروکسی گیت
با استفاده از دستورات زیر میتوانید پروکسیهایی که برای git تعریف کردهاید را حذف کنید:
git config --global --unset http.proxy
git config --global --unset https.proxy
تنظیم پروکسی برای curl و wget
دو ابزار کاربردی curl و wget نیز میتوانند پروکسی خود را داشته باشند.
ابزار کاربردی curl به صورت پیشفرض از متغیرهای محیطی ترمینال تبعیت میکند. بنابراین اگر با استفاده از توضیحات بالا و تعریف متغیر محیطی، پروکسی تعریف کرده باشید، curl نیز از آن استفاده میکند. اما در صورتی که نمیخواهید متغیرهای محیطی را دستکاری کنید، به دو روش مختلف میتوانید برای curl پروکسی را تنظیم کنید: با استفاده از سوییچ x و یا تعریف پروکسی در فایل curlrc. دقت داشته باشید که در روش آخر، پروکسی به صورت کلی برای curl تعریف میشود و با لاگاوت کردن یا خاموش شدن سیستم، از بین نمیرود.
# using -x switch
curl -x http://127.0.0.1:8080 https://example.com
# using curlrc file
nano ~/.curlrc
proxy = http://127.0.0.1:8080
برای wget نیز میتوانید با استفاده از سوییچ e یا تغییر در فایل wgetrc، پروکسی دلخواه خود را تنظیم کنید.
# using -e switch
wget -e use_proxy=yes -e http_proxy=127.0.0.1:8080 https://example.com
# using wgetrc file
nano ~/.wgetrc
use_proxy = on
http_proxy = http://127.0.0.1:8080/
https_proxy = http://127.0.0.1:8080/
no_proxy = localhost,127.0.0.1
تنظیم پروکسی برای پایتون
همانطور که قبلاً در نوشته «استفاده از pip بدون اینترنت» توضیح داده شد، نصب پکیجها و وابستگیها، حذف یا آپدیت کتابخانهها، نصب یک نسخه مشخص از یک پکیج و مدیریت دسته جمعی وابستگیها در پایتون با استفاده از ابزار pip انجام میشود. در برخی شرایط نیاز است که برای pip پروکسی تعریف شود.
مشابه خیلی از ابزارهای CLI، ابزار pip نیز از متغیرهای محیطی ترمینال لینوکس تبعیت میکند و در صورتی که متغیرهای محیطی را برای ترمینال تنظیم کرده باشید، نیازی به تنظیم مجزای آن برای pip وجود ندارد. اما چنانچه تمایلی به تنظیم یا تغییر متغیرهای محیطی ندارید، با استفاده از سوییچ proxy یا تغییر در فایل pip.conf میتوانید برای pip پروکسی تعریف کنید.
# using proxy switch
pip install requests --proxy http://127.0.0.1:8080
# using pip.config file
mkdir -p ~/.config/pip
nano ~/.config/pip/pip.conf
[global]
proxy = http://127.0.0.1:8080
نکته: چنانچه از آناکوندا یا مینیکوندا برای محیط پایتونی خود استفاده میکنید، باید فایل condarc تغییر داده شود:
nano ~/.condarc
proxy_servers:
http: http://127.0.0.1:8080
https: http://127.0.0.1:8080
تنظیم پروکسی برای node
اگر برنامهنویس یا توسعهدهنده در زبان جاوا اسکریپت هستید، با استفاده از روشهای زیر میتوانید برای پکیج منیجرهای خود مانند npm و yarn، پروکسی تنظیم کنید.
# a) for npm
# set proxy
npm config set proxy http://127.0.0.1:8080
npm config set https-proxy http://127.0.0.1:8080
# unset proxy
npm config delete proxy
npm config delete https-proxy
# b) for yarn
yarn config set proxy http://127.0.0.1:8080
yarn config set https-proxy http://127.0.0.1:8080
# c) for pnpm
pnpm config set proxy http://127.0.0.1:8080
pnpm config set https-proxy http://127.0.0.1:8080
تنظیم پروکسی برای داکر
از حیث رفتار پروکسی برای داکر، دو محیط جداگانه وجود دارد: دستورات CLI و دیمون داکر؛ که هر کدام پیکربندی متفاوتی نیاز دارند.
۱) تنظیم پروکسی برای دیمون داکر
به منظور این کار، ابتدا بایست فایل تنظیمات پروکسی داکر را بسازید:
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://127.0.0.1:8080"
Environment="HTTPS_PROXY=http://127.0.0.1:8080"
Environment="NO_PROXY=localhost,127.0.0.1"
در نهایت، با استفاده از دستورات زیر باید دیمون را ریستارت کنید:
sudo systemctl daemon-reload
sudo systemctl restart docker
۲) تنظیم پروکسی برای داخل کانتینر
در صورتی که میخواهید دستور build داکر شما با پروکسی اجرا شود، میتوانید از الگوی زیر استفاده کنید:
docker build --build-arg HTTP_PROXY=http://127.0.0.1:8080 \
--build-arg HTTPS_PROXY=http://127.0.0.1:8080 \
-t myimage .
تنظیم پروکسی برای SSH
برخی اوقات میخواهید اتصال SSH را هم از طریق پروکسی HTTP برقرار کنید؛ مثلاً برای اتصال به گیتهاب با پروتکل SSH وقتی پورت ۲۲ فیلتر است یا زمانی که سرور مجازی شما خارج از کشور قرار دارد و IPهای ارائهدهنده، فیلتر شدهاند. برای این کار باید ابتدا فایل تنظیمات SSH را با یک ادیتور متنی مانند nano باز کنید:
nano ~/.ssh/config
سپس تغییرات زیر را متناسب با میزبان (Host) مدنظر، اعمال کنید:
Host github.com
Hostname github.com
User git
Port 443
ProxyCommand nc -x 127.0.0.1:1080 %h %p
در این کدها، ابزار nc از پروکسی SOCKS5 که روی پورت 1080 تعریف شده، استفاده میکند.
تنظیم پروکسی برای Snap و Flatpak
اگر برای مدیریت و نصب برنامههای توزیع لینوکسی خود از سیستم Snap یا Flatpak استفاده میکنید، میتوانید به صورت مجزا برای آنها پروکسی تنظیم کنید.
به صورت پیشفرض، Snap از متغیرهای محیطی استفاده نمیکند و باید به صورت جداگانه، پروکسی آن را تعریف کنید:
sudo snap set system proxy.http="http://127.0.0.1:8080"
sudo snap set system proxy.https="http://127.0.0.1:8080"
بر خلاف Snap، پکیج منیجر Flatpak از متغیرهای محیطی ترمینال لینوکس پشتیبانی میکند؛ اما میتوانید به صورت مجزا نیز برای آن پروکسی تعریف کنید:
http_proxy=http://127.0.0.1:8080 flatpak update
دقت داشته باشید از آنجایی که بسیاری از مخازن فلتپک (مانند Flathub) از پروتکل https استفاده میکنند، ممکن است دستور بالا منجر به خطا شود. در این حالت باید پروکسی حالت https نیز تعریف کنید:
http_proxy=http://127.0.0.1:8080 https_proxy=http://127.0.0.1:8080 flatpak update
البته اگر برای اجرای فلتپک به دسترسی روت نیاز دارید، به احتمال زیاد لازم است که سوییچ E را به صورت زیر به دستور sudo پاس بدهید:
sudo -E http_proxy=http://127.0.0.1:8080 https_proxy=http://127.0.0.1:8080 flatpak update
ابزار proxychains در ترمینال لینوکس
ابزار فوقالعادهای به اسم proxychains وجود دارد که هر برنامهای را مجبور میکند از پروکسی SOCKS4 یا SOCKS5 یا HTTP استفاده کند! حتی برنامههایی که اصلاً پشتیبانی از پروکسی ندارند.
ابزار proxychains را میتوانید با apt یا dnf یا pacman بر روی توزیع لینوکسی خود نصب کنید:
# Debian/Ubuntu
sudo apt install proxychains4
# Fedora
sudo dnf install proxychains-ng
# Arch Linux
sudo pacman -S proxychains-ng
تنظیمات پروکسی proxychains با استفاده از فایل proxychains4.conf انجام میگیرد که کافیست در انتهای آن، پروکسی مدنظر خود را تعریف کنید:
sudo nano /etc/proxychains4.conf
socks5 127.0.0.1 1080
پس از تعریف پروکسی، به راحتی میتوانید قبل از اجرای هر دستوری، proxychains را فراخوانی کنید:
proxychains4 curl https://example.com
proxychains4 wget https://example.com/file.zip
proxychains4 git clone https://github.com/user/repo.git
proxychains4 python3 myscript.py
نکات تکمیلی پروکسی ترمینال لینوکس
نکته ۱: بعد از تنظیم پروکسی در ترمینال لینوکس، با استفاده از این دستورات میتوانید بررسی کنید که پروکسی شما درست کار میکند یا خیر:
curl -s https://api.ipify.org
اگر IP نشاندادهشده با IP واقعی دستگاه شما فرق داشت، پروکسی درست تنظیم شده است.
نکته ۲: هر زمان که پروکسی را تغییر دادید یا خاموش کردید، متغیرهای محیطی را unset کنید:
unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY
جمعبندی
تنظیم پروکسی در ترمینال لینوکس ممکن است در ابتدا پیچیده به نظر برسد، اما با یک روش سیستماتیک ساده میشود:
- اول متغیرهای محیطی را در فایلهای bashrc. یا zshrc. تعریف کنید. این کار ۸۰٪ ابزارها را پوشش میدهد.
- برای apt فایل etc/apt/apt.conf.d/95proxies/ را بسازید.
- برای git از git config –global http.proxy استفاده کنید.
- اگر ابزاری هنوز کار نکرد، proxychains4 را امتحان کنید.
سوالات متداول
-
آیا بعد از تنظیم پروکسی در bashrc. باید سیستم را ریستارت کنم؟
خیر، نیازی به ریستارت نیست. کافی است دستور source ~/.bashrc را اجرا کنید تا تغییرات در همان ترمینال جاری اعمال شوند. البته ترمینالهای جدیدی که بعد از این باز میکنید بهصورت خودکار تنظیمات را میخوانند.
-
چرا با وجود تنظیم پروکسی، دستور sudo apt update هنوز کار نمیکند؟
چون sudo بهصورت پیشفرض متغیرهای محیطی کاربر را پاک میکند. برای حل این مشکل یا از سوییچ E استفاده کنید یا پروکسی را طبق توضیحات بالا مستقیماً در فایل 95proxies تعریف کنید که روش مطمئنتری است.
-
تفاوت پروکسی HTTP و SOCKS5 در ترمینال چیست و کدام را انتخاب کنم؟
پروکسی HTTP فقط ترافیک HTTP/HTTPS را مدیریت میکند و بیشتر ابزارهای ترمینال از آن پشتیبانی میکنند. SOCKS5 سطح پایینتری کار میکند و هر نوع ترافیکی (TCP/UDP) را پوشش میدهد. اگر نرمافزار پروکسی شما (مثل Clash، V2Ray یا Xray) هر دو را ارائه میدهد، برای git و curl از HTTP و برای proxychains از SOCKS5 استفاده کنید.
-
چطور بفهمم پروکسی در ترمینال فعال است یا نه؟
برای این کار، دو روش راحت وجود دارد: یا با استفاده از دستور env | grep -i proxy متغیرهای محیطی تنظیمشده را ببینید. یا میتوانید با استفاده از curl و دستوری که در نکات تکمیلی همین نوشته بیان شد، آیپی اتصال خود را چک کنید.