پورت یک اندپوینت (Endpoint) ارتباطی است. در یک سیستمعامل، پورت برای فرایندهای خاص یا خدمات شبکه به روی بستههای داده باز یا بسته میشود.
به طور معمول، پورتها یک سرویس شبکه خاص را که به آنها اختصاص داده شده است شناسایی میکنند. این موضوع را میتوان با پیکربندی دستی سرویس برای استفاده از یک پورت دیگر تغییر داد، اما به طور کلی در بسیاری از مواقع از حالت پیشفرض استفاده میشود.
1024 پورت اول (شماره پورتهای 0 تا 1023) به عنوان شماره پورت مشهور نامیده میشود و برای متداولترین سرویسها رزرو شده است. این سرویسها عبارتند از SSH (پورت شماره 22)، HTTP (پورت شماره 80) و HTTPS (پورت شماره 443).
به شماره پورتهای بعد از 1024 پورتهای زودگذر (Ephemeral) گفته میشود.
پورتهای 1024 تا 49151 پورتهای ثبتشده/کاربر نامیده میشوند.
پورتهای 49152 تا 65535 پورتهای پویا/خصوصی نامیده میشوند.
در این آموزش نحوه باز کردن پورت در لینوکس را به شما آموزش میدهیم.
پیشنیازها
برای دنبال کردن مراحل این آموزش، به موارد زیر نیاز دارید:
- آشنایی با استفاده از ترمینال
- لیست همه پورتهای باز
قبل از باز کردن پورت در لینوکس، باید لیست تمام پورتهای باز را بررسی کنید و یک پورت زودگذر را برای باز کردن انتخاب کنید که در آن لیست وجود ندارد.
برای فهرست کردن تمام پورتهای باز، از جمله TCP و UDP که رایجترین پروتکلها برای انتقال بسته در لایه شبکه هستند از دستور netstat استفاده کنید.
netstat -lntu
با اجرای این دستور، خروجی زیر پرینت میشود:
all listening sockets (-l) the port number (-n) TCP ports (-t) UDP ports (-u)
Output Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp6 0 0 ::1:5432 :::* LISTEN tcp6 0 0 ::1:6379 :::* LISTEN tcp6 0 0 :::22 :::* LISTEN udp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN
توجه: اگر توزیع شما از دستور netstat پشتیبانی نمیکند، میتوانید از دستور ss برای مشاهده پورتهای باز در لینوکس استفاده کنید.
بررسی کنید که با استفاده از دستور ss برای فهرست کردن سوکتهای Listening با پورت باز، خروجیهای ثابتی دریافت میکنید:
ss -lntu
اجرای این دستور خروجی زیر را نمایش میدهد:
Output Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:* tcp LISTEN 0 128 127.0.0.1:5432 0.0.0.0:* tcp LISTEN 0 128 127.0.0.1:27017 0.0.0.0:* tcp LISTEN 0 128 127.0.0.1:6379 0.0.0.0:* tcp LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:* tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* tcp LISTEN 0 128 [::1]:5432 0.0.0.0:* tcp LISTEN 0 128 [::1]:6379 0.0.0.0:* tcp LISTEN 0 128 [::]:22 0.0.0.0:*
این خروجی کموبیش مشابه همان چیزی است که در خروجی دستور netstat دیدیم.
باز کردن پورت در لینوکس برای اجازه دادن به اتصالات TCP
اکنون، یک پورت بسته را باز کنید و کاری کنید که برای اتصالات TCP در حالت Listen قرار بگیرد.
برای اهدافی که در این آموزش دنبال میکنیم، پورت 4000 را باز خواهید کرد. اما اگر آن پورت در سیستم شما باز نیست، در صورت تمایل یک پورت بسته دیگر را انتخاب کنید. فقط مطمئن شوید که شماره آن بزرگتر از 1023 باشد.
مطمئن شوید که پورت 4000 توسط دستور netstat مورد استفاده قرار نگرفته باشد:
netstat -na | grep :4000
یا با دستور ss:
ss -na | grep :4000
خروجی باید خالی بماند، بنابراین بررسی کنید که در حال حاضر از پورت انتخابی استفاده نمیشود. اکنون میتوانید قوانین پورت را به صورت دستی به فایروال سیستم iptables اضافه کنید.
کاربران اوبونتو و سیستمهای مبتنی بر ufw
از ufw (کلاینت خط فرمان برای Uncomplicated Firewall) استفاده کنید.
دستوراتی که باید استفاده کنید مشابه زیر خواهد بود:
sudo ufw allow 4000
برای توزیع CentOS و سیستمهای مبتنی بر firewalld
از firewall-cmd (کلاینت خط فرمان برای firewalld daemon) استفاده کنید.
دستورات شما مشابه زیر خواهد بود:
firewall-cmd --add-port=4000/tcp
برای سایر توزیعهای لینوکس
از iptables برای تغییر قوانین فیلتر بسته IPv4 سیستم استفاده کنید.
iptables -A INPUT -p tcp --dport 4000 -j ACCEPT
ابتدا با دستور nc ابزار netcat را اجرا کنید؛ برای Listen کردن روی پورت 4000 از فلگ -l و -p استفاده کنید و همزمان خروجی را به هر کلاینتی که متصل است ارسال کنید:
ls | nc -l -p 4000
اکنون، پس از اینکه یک کلاینت اتصال TCP را در پورت 4000 باز کرد، خروجی ls را دریافت خواهید کرد. فعلا دیگر با این Session کاری ندارید.
Session ترمینال دیگری را در همان دستگاه باز کنید.
از آنجایی که یک پورت TCP را باز کردید، از telnet برای بررسی اتصال TCP استفاده کنید. اگر این دستور در توزیع شما وجود نداشت، با استفاده از ابزار پکیج منیجر خود آن را نصب کنید.
IP سرور و شماره پورت (در این مثال 4000) را وارد کرده و سپس این دستور را اجرا کنید:
telnet localhost 4000
این دستور سعی می کند یک اتصال TCP را در لوکال هاست در پورت 4000 باز کند.
خروجی مشابه زیر را دریافت خواهید کرد که نشان میدهد ارتباط با برنامه Listen کننده (nc) برقرار شده است:
Output Trying ::1... Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. while.sh
خروجی ls (در این مثال while.sh) نیز برای کلاینت ارسال شده است که نشاندهنده موفقیتآمیز بودن اتصال TCP است.
از nmap برای بررسی باز بودن پورت (-p) استفاده کنید:
nmap localhost -p 4000
این دستور پورت باز را بررسی میکند:
Output Starting Nmap 7.60 ( https://nmap.org ) at 2020-01-18 21:51 UTC Nmap scan report for localhost (127.0.0.1) Host is up (0.00010s latency). Other addresses for localhost (not scanned): ::1
PORT STATE SERVICE 4000/tcp open remoteanything Nmap done: 1 IP address (1 host up) scanned in 0.25 seconds
پورت باز شده است. در این مرحله فرایند باز کردن پورت در لینوکس با موفقیت به پایان رسیده است.
توجه: nmap فقط پورتهای بازشدهای را فهرست میکند که برنامهای در حال Listen کردن داشته باشد. اگر از هیچ برنامه Listen کنندهای مانند netcat استفاده نمیکنید، این دستور پورت 4000 را بسته نشان میدهد زیرا در حال حاضر هیچ برنامهای در آن پورت Listen نمیکند.
به شیوهای مشابه، telnet نیز کار نخواهد کرد، زیرا برای اتصال به برنامهای که در حال Listen کردن باشد نیاز دارد. به همین دلیل است که nc ابزار مفیدی است. این ابزار چنین محیطهایی را در یک دستور ساده شبیهسازی میکند.
اما این شبیهسازی موقتی است، زیرا هربار که سیستم را ریستارت میکنید، تغییرات ریست میشوند.
قوانین پایدار
رویکرد ارائهشده در این مقاله فقط به طور موقت قوانین فایروال را تا زمانی که سیستم خاموش یا ریستارت شود، بهروز میکند. بنابراین، مراحل بالا باید تکرار شود تا پس از ریستارت همان پورت دوباره باز شود.
برای فایروال ufw
قوانین ufw در هنگام ریستارت کردن سیستم ریست نمیشوند. این امر به دلیل این است که در فرایند بوت ادغام شده است و هسته قوانین فایروال را با استفاده از ufw با اعمال فایلهای پیکربندی مناسب ذخیره میکند.
برای firewalld
اگر میخواهید پورت را به پیکربندی دائمی فایروال اضافه کرده و بلافاصله تغییرات را اعمال کنید، میتوانید از فلگهای permanent– و –reload استفاده کنید:
sudo firewall-cmd --permanent --add-port=4000/tcp sudo firewall-cmd --reload
برای iptables
شما باید قوانین پیکربندی را ذخیره کنید و از دستور iptables-persistent استفاده کنید.
برای جزئیات بیشتر به نحوه راهاندازی فایروال با استفاده از iptables مراجعه کنید.
جمعبندی
در این مقاله با نحوه باز کردن پورت در لینوکس آشنا شدید و نحوه تنظیم آن برای اتصالات ورودی را یاد گرفتید. همچنین با نحوه استفاده از دستورات netstat، ss، telnet، nc و nmap آشنا شدید.