نحوه اتصال به سرور مجازی با استفاده از WebSSH در پایتون Python
۳ بهمن ۱۴۰۳
معمولاً برای اتصال به یک سرور مجازی SSH، از خط فرمان یا نرمافزارهای شبیهساز ترمینال که شامل یک کلاینت SSH هستند، استفاده میکنیم. برخی ابزارها مانند ماژول WebSSH در Python، امکان اتصال به SSH و اجرای یک Terminal مستقیماً در مرورگر وب شما را فراهم میکنند.
این حالت، میتواند در شرایط مختلف مفید باشد. در ارائههای زنده یا نمایشهای دمو، زمانی که اشتراکگذاشتن یک پنجره ترمینال عادی، بهصورتی که از نظر بصری قابل فهم باشد، دشوار است؛ همچنین در محیطهای آموزشی برای افرادی که با خط فرمان آشنایی ندارند، استفاده از این قابلیت، مفید است، زیرا نیازی به نصب نرمافزار روی سیستمهایشان ندارند (مخصوصاً در ویندوز، جایی که گزینههای پیشفرض محدودیتهای قابل توجهی دارند). ماژول WebSSH در پایتون، قابلحمل است و تنها برای اجرا به پایتون، نیاز دارد. سایر پلتفرمهای ترمینال مبتنی بر وب میتوانند بسیار پیچیدهتر و محدود به لینوکس باشند.
در این آموزش، شما WebSSH را راهاندازی کرده و از طریق مرورگر خود به SSH متصل میشوید. سپس، در صورت تمایل، آن را با پشت یک Nginx Reverse Proxy برای محیط Production، اجرا میکنید.
پیشنیازها
- یک محیط ویندوز، مک یا لینوکس با سرویس SSH فعال. اجرای SSH در local میتواند مفید باشد، اما بهتر است از یک سرور مجازی لینوکس ریموت استفاده کنید تا درک بهتری از مقاله داشته باشید. برای این کار، میتوانید مقاله نحوه راهاندازی اولیه سرور مجازی با اوبونتو Ubuntu را دنبال کنید. همچنین، میتوانید از سرور مجازی ایران لیارا، استفاده کنید.
- زبان برنامهنویسی Python به همراه pip نصب شده باشد.
در صورتی که با مفهوم SSH و VPS آشنایی کافی ندارید، توصیه میشود در ابتدا مقالههای زیر را مطالعه کنید:
- سرور مجازی یا VPS چیست؟ + معرفی انواع سرور مجازی و کاربردهای آنها
- SSH چیست؟ + نحوه استفاده از SSH برای اتصال به سرور مجازی (VPS)
در ادامه، بخوانید:
- مرحله اول: نصب ماژول WebSSH
- مرحله دوم: اجرای WebSSH و اتصال به آن
- مرحله سوم (اختیاری): اجرای WebSSH پشت یک reverse proxy
- مرحله چهارم (اختیاری): ایجاد سرویس Systemd برای WebSSH
- نتیجهگیری
مرحله اول: نصب ماژول WebSSH
اگر قبلاً Python و pip را نصب کردهاید، میتوانید ماژول WebSSH را از PyPI (repository نرمافزاری Python) نصب کنید. WebSSH طوری طراحی شده است که مستقیماً از خط فرمان نصب و اجرا شود، بنابراین نیازی به راهاندازی محیط مجازی (Virtual Environment) ندارید، چرا که محیطهای مجازی بیشتر برای پروژههای شخصی و نه برای نصب ابزارهای سیستمی، مفید هستند.
برای نصب بسته WebSSH از دستور pip install
استفاده کنید:
sudo pip3 install webssh
خروجی دستور فوق، مشابه زیر است:
…
Successfully built webssh
Installing collected packages: tornado, pycparser, cffi, pynacl, paramiko, webssh
Successfully installed cffi-1.15.1 paramiko-2.11.0 pycparser-2.21 pynacl-1.5.0 tornado-6.2 webssh-1.6.0
نصب ماژول WebSSH از طریق sudo، ابزار wssh را به صورت سیستمی (global)، نصب خواهد کرد. میتوانید این موضوع را با استفاده از دستور زیر بررسی کنید:
which wssh
خروجی:
/usr/local/bin/wssh
در مرحله بعد و پس از نصب WebSSH، کافیست تا آن اجرا کرده و به آن، متصل میشوید. اما در ابتدا باید یک Firewall Rule اضافه کنید. WebSSH بهطور پیشفرض روی پورت ۸۸۸۸ اجرا میشود. اگر از ufw بهعنوان فایروال استفاده میکنید، این پورت را با دستور زیر باز کنید:
sudo ufw allow 8888
در ادامه این آموزش، مجدداً به این firewall rule، اشاره خواهد شد.
مرحله دوم: اجرای WebSSH و اتصال به آن
اگر قصد دارید WebSSH را در local بالا بیاورید، میتوانید دستور wssh
را بدون هیچ آرگومان اضافی، استفاده کنید. اما اگر WebSSH را روی یک سرور مجازی ریموت اجرا میکنید، باید فلگ --fbidhttp=False
را اضافه کنید تا اتصالات راه دور از طریق HTTP معمولی، مجاز شوند. این روش، در صورت اتصال به یک شبکه غیر ایمن، روش مناسبی نیست، اما برای نمایش Demo مفید است. در ادامه این آموزش، امنیت WebSSH را بهبود خواهیم داد.
wssh --fbidhttp=False
اکنون میتوانید به WebSSH متصل شده و وارد آن شوید. به آدرس your_domain:8888
در مرورگر وب خود بروید (اگر WebSSH را در local اجرا کردهاید، به جای your_domain
از localhost
استفاده کنید). با باز شدن صفحه در آدرس مشخص شده، صفحه ورود WebSSH را مشاهده خواهید کرد:
اطلاعات SSH سرور مجازی خود را وارد کنید. اگر راهنمای نحوه راهاندازی اولیه سرور مجازی با اوبونتو Ubuntu را دنبال کرده باشید، از روش احراز هویت مبتنی بر کلید و نه رمز عبور، استفاده میکنید. به این معنا که تنها لازم است اطلاعات زیر را مشخص کنید:
- Hostname: نام یا آدرس سرور مجازی که قصد دارید به آن متصل شوید.
- Username: نام کاربریتان در سرور مجازی.
- SSH Key: کلید SSH که باید در پوشه
.ssh/
در home directory سیستم local شما قرار داشته باشد (معمولاً با نامid_rsa
).
نکته: همانطور که احتمالاً متوجه شدید، با مشخص کردن دستی Hostname
، میتوانید از WebSSH برای اتصال به سرورهایی استفاده کنید که غیر از سروری است که روی آن اجرا شده است. در این آموزش، WebSSH روی همان سروری اجرا شده که به آن متصل میشود.
روی دکمه Connect کلیک کنید و باید با پیام خوشآمدگویی پیشفرض ترمینال مواجه شوید:
در این مرحله، میتوانید مانند اتصال از طریق SSH، بهطور معمول، از ترمینال خود استفاده کنید. همچنین، چندین کاربر میتوانند همزمان به یک WebSSH متصل شوند. اگر WebSSH را فقط برای پخش ویدئو یا ضبط، روی یک ماشین اجرا کردهاید، این تمام چیزی است که نیاز دارید. میتوانید با فشردن Ctrl+C در ترمینالی که WebSSH را از آن اجرا کردهاید (و نه ترمینال WebSSH)، سرور را متوقف کنید.
اگر WebSSH را روی یک سرور مجازی ریموت، اجرا میکنید، نباید از HTTP غیرایمن در محیط Production استفاده کنید. اگرچه مکانیزم احراز هویت سرویس SSH شما، هنوز از شما محافظت میکند، اما استفاده از یک اتصال SSH از طریق HTTP، خطر امنیتی قابلتوجهی دارد و ممکن است باعث سرقت اطلاعات ورود SSH شما، شود. در مراحل بعدی، WebSSH خود را ایمن خواهید کرد تا امنیت آن با یک اتصال SSH معمولی، برابری کند.
مرحله سوم (اختیاری): اجرای WebSSH پشت یک reverse proxy
قرار دادن یک وب سرور مانند Nginx در جلوی سایر برنامههای وبمحور، میتواند عملکرد را بهبود بخشیده و امنیت سایت را سادهتر کند. در این مرحله، شما Nginx را نصب و پیکربندی میکنید تا درخواستها را به WebSSH پروکسی کند.
ابتدا فهرست پکیجهای خود را بهروزرسانی کرده و سپس Nginx را با استفاده از apt
نصب کنید:
sudo apt update
sudo apt install nginx
اگر از فایروال ufw
استفاده میکنید، باید تنظیمات آن را تغییر دهید تا به پورتهای پیشفرض HTTP/HTTPS (یعنی پورتهای ۸۰ و ۴۴۳) دسترسی داده شود؛ ufw
دستوری را دارد که با اجرای آن، دسترسی به هر دو پورت، فراهم میشود:
sudo ufw allow “Nginx Full”
Nginx به شما اجازه میدهد که تنظیمات جداگانهای برای هر سایت بهصورت فایلهای جداگانه در زیرشاخهای به نام sites-available/
اضافه کنید. با استفاده از nano یا ویرایشگر متن موردعلاقه خود، یک فایل پیکربندی جدید برای Nginx در مسیر /etc/nginx/sites-available/webssh
ایجاد کنید:
sudo nano /etc/nginx/sites-available/webssh
سپس محتوای زیر را در آن قرار دهید و مقدار your_domain
را با دامنه خود جایگزین کنید:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name your_domain www.your_domain
root /var/www/html;
access_log /var/log/nginx/webssh.access.log;
error_log /var/log/nginx/webssh.error.log;
location / {
proxy_pass http://127.0.0.1:8888;
proxy_http_version 1.1;
proxy_read_timeout 300;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
}
}
این فایل شامل سه بخش اصلی است:
- بخش اول، که قبل از خط
location /
قرار دارد، شامل تنظیمات پایه Nginx برای سرویسدهی به یک وبسایت در پورت پیشفرض HTTP، یعنی 80 است. - بلوک
location /
شامل یکسری پیکربندی برای پروکسی کردن اتصالات ورودی به WebSSH است که در پورت 8888 بهصورت داخلی اجرا میشود.
فایل را ذخیره کرده و ببندید. اگر از nano استفاده میکنید، Ctrl+X
را فشار دهید، سپس در صورت درخواست، Y
و بعد Enter را فشار دهید.
در مرحله بعد، باید این پیکربندی جدید را فعال کنید. روش معمول Nginx این است که یکسری symbolic link از فایلها در sites-available/
به پوشه دیگری به نام sites-enabled/
ایجاد کند. با اجرای دستور زیر، این symbolic link را ایجاد کنید:
sudo ln -s /etc/nginx/sites-available/webssh /etc/nginx/sites-enabled/webssh
بهطور پیشفرض، Nginx شامل یک فایل پیکربندی دیگر در /etc/nginx/sites-available/default
است که به /etc/nginx/sites-enabled/default
لینک شده و صفحه پیشفرض خود را سرویس میدهد. بهتر است که این حالت را با حذف آن از /sites-enabled
غیرفعال کنید، زیرا با پیکربندی جدید WebSSH شما تداخل دارد:
sudo rm /etc/nginx/sites-enabled/default
نکته: پیکربندی Nginx در این آموزش برای سرویسدهی به یک برنامه، یعنی WebSSH، طراحی شده است. اما میتوانید چندین برنامه را روی یک سرور، سرویسدهی کنید.
در مرحله بعد، برای تأیید پیکربندی خود قبل از راهاندازی مجدد Nginx، دستور nginx -t
را اجرا کنید:
sudo nginx -t
خروجی:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
اکنون میتوانید سرویس Nginx خود را مجدداً راهاندازی کنید تا پیکربندی جدید شما اعمال شود:
sudo systemctl restart nginx
در نهایت، میتوانید قوانین فایروال ایجادشده قبلی برای دسترسی مستقیم به WebSSH را حذف کنید، زیرا تمام ترافیک اکنون از طریق Nginx روی پورتهای استاندارد HTTP/HTTPS مدیریت میشود:
sudo ufw delete allow 8888
WebSSH را دوباره از خط فرمان راهاندازی کنید:
wssh
توجه داشته باشید که اکنون WebSSH از طریق HTTP توسط Nginx، نیاز به مشخص کردن یک پورت، سرویس میشود، در این نقطه، شما همهچیز را به جز راهاندازی خودکار wssh
، خودکار کردهاید. این کار در مرحله نهایی انجام خواهد شد.
مرحله چهارم (اختیاری): ایجاد سرویس Systemd برای WebSSH
استقرار برنامههای سرور که بهطور خودکار در پسزمینه اجرا نمیشوند ممکن است در ابتدا اجباری به نظر برسد، چرا که شما باید هر بار آنها را مستقیماً از خط فرمان شروع کنید. راهحل این مسئله، راهاندازی یک سرویس پسزمینه شخصی است.
برای انجام این کار، باید یک Unit file ایجاد کنید که توسط سیستم init سرور شما قابل استفاده باشد. تقریباً در تمامی توزیعهای مدرن لینوکس، سیستم init به نام Systemd
شناخته میشود و شما میتوانید با استفاده از دستور systemctl
با آن تعامل کنید.
اگر WebSSH هنوز در ترمینال شما در حال اجراست، کلیدهای Ctrl+C
را فشار دهید تا آن را متوقف کنید. سپس با استفاده از ویرایشگر متن nano یا هر ویرایشگر دیگری که ترجیح میدهید، یک فایل جدید به نام /etc/systemd/system/webssh.service
باز کنید:
sudo nano /etc/systemd/system/webssh.service
فایل یونیت شما حداقل به یک بخش [Unit]، یک بخش [Service] و یک بخش [Install] نیاز دارد:
[Unit]
Description=WebSSH terminal interface
After=network.target
[Service]
User=www-data
Group=www-data
ExecStart=wssh
[Install]
WantedBy=multi-user.target
- بخش [Unit] شامل یکسری توضیحات ساده از سرویس جدید شما و یک هوک
After
است که مشخص میکند سرویس باید در چه زمانی در هنگام راهاندازی سیستم اجرا شود، در این حالت بهتر است پس از راهاندازی رابطهای شبکه سرور شما، این اتفاق بیفتد. - بخش [Service] مشخص میکند که کدام دستور باید اجرا شود و همچنین کدام کاربر باید آن را اجرا کند. در اینجا،
www-data
کاربر پیشفرض Nginx در سرور مجازی اوبونتو است وwssh
همان دستوری است که باید اجرا شود. - بخش [Install] تنها شامل خط
WantedBy=multi-user.target
است که با خطAfter
در بخش [Unit] همکاری میکند تا اطمینان حاصل شود که سرویس زمانی که سرور آماده دریافت ورودیهای کاربر است، شروع میشود.
فایل را ذخیره کرده و ببندید. اکنون میتوانید سرویس WebSSH جدید خود را راهاندازی کرده و آن را طوری تنظیم کنید که بهطور خودکار با راهاندازی مجدد سیستم اجرا شود:
sudo systemctl start webssh
sudo systemctl enable webssh
از دستور systemctl status webssh
برای تأیید اینکه سرویس بهدرستی شروع شده استفاده کنید. شما باید خروجی مشابه زمانی که اولین بار دستور را در ترمینال اجرا کردید دریافت کنید.
sudo systemctl status webssh
خروجی:
● webssh.service - WebSSH terminal interface
Loaded: loaded (/etc/systemd/system/webssh.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2022-08-11 22:08:25 UTC; 2s ago
Main PID: 15678 (wssh)
Tasks: 1 (limit: 1119)
Memory: 20.2M
CPU: 300ms
CGroup: /system.slice/webssh.service
└─15678 /usr/bin/python3 /usr/local/bin/wssh
Aug 11 22:08:25 webssh22 systemd[1]: Started WebSSH terminal interface.
Aug 11 22:08:26 webssh22 wssh[15678]: [I 220811 22:08:26 settings:125] WarningPolicy
Aug 11 22:08:26 webssh22 wssh[15678]: [I 220811 22:08:26 main:38] Listening on :8888 (http)
اکنون میتوانید صفحه وب https://your_domain
را در مرورگر خود باز کنید و اکنون دوباره باید رابط WebSSH را مشاهده کنید. از این به بعد، WebSSH و Nginx بهطور خودکار با سرور شما راهاندازی شده و در پسزمینه اجرا خواهند شد.
نتیجهگیری
در این آموزش، شما WebSSH را نصب کردید، که یک راهحل قابل حمل برای ارائه یک رابط خط فرمان در مرورگر وب است. سپس با اضافه کردن یک پروکسی معکوس Nginx، و در نهایت با ایجاد یک سرویس سیستم برای WebSSH، برنامه را بهبود دادید. این مدل خوبی برای استقرار برنامههای کوچک وب سمت سرور بهطور کلی است و کاربردهای زیادی خواهد داشت.
در صورتی که نیازمند یک VPS هستید؛ میتوانید از سرور مجازی ابری لیارا استفاده کنید که یک راهحل مناسب برای کسانی است که به دنبال سرور مجازی ایران با ترافیک نامحدود هستند. این سرویس به کاربران این امکان را میدهد که سرور مجازی ساعتی انتخاب کنند و با توجه به نیاز خود از سرور مجازی ارزان قیمت بهرهمند شوند. علاوه بر این، لیارا امکان استفاده از سرور مجازی دائمی را نیز فراهم میآورد. این سرویسها از عملکرد بالایی برخوردار بوده و برای کاربران ایرانی بهترین گزینه برای بهرهبرداری از سرور مجازی ایران محسوب میشود.