مقدمه
لینوکس به دلیل داشتن تعداد زیادی ابزارهای خط فرمان بالغ و مفید در اکثر توزیعها شناخته شده است. اغلب، مدیران سیستم می توانند بسیاری از کارهای خود را با استفاده از ابزارهای داخلی بدون نیاز به نصب نرم افزار اضافی انجام دهند. در این راهنما، نحوه استفاده از ابزار netcat را مورد بحث قرار خواهیم داد. این دستور همه کاره می تواند به شما در نظارت، آزمایش و ارسال داده ها در سراسر اتصالات شبکه کمک کند. Netcat باید تقریباً در هر توزیع مدرن لینوکس در دسترس باشد. اوبونتو با نوع BSD نت کت عرضه می شود و این همان چیزی است که در این راهنما از آن استفاده خواهیم کرد. نسخه های دیگر ممکن است متفاوت عمل کنند یا گزینه های دیگری ارائه دهند.
دستور عمومی
به طور پیش فرض، netcat با راه اندازی یک اتصال TCP به یک میزبان راه دور عمل می کند.
ابتدایی ترین دستور عبارت است از:
netcat [options] host port
این تلاش می کند تا یک اتصال TCP به میزبان تعریف شده در شماره پورت مشخص شده آغاز شود. این عملکرد مشابه فرمان قدیمی لینوکس telnet است. به خاطر داشته باشید که اتصال شما کاملاً رمزگذاری نشده است.
اگر می خواهید به جای شروع اتصال TCP یک بسته UDP ارسال کنید، می توانید از گزینه -u استفاده کنید:
netcat -u host port
با قرار دادن یک خط تیره بین اولین و آخرین، می توانید محدوده ای از پورت ها را مشخص کنید:
netcat host startport-endport
این معمولاً با برخی از پرچم های اضافی استفاده می شود.
در اکثر سیستم ها، می توانیم از netcat یا nc به جای یکدیگر استفاده کنیم. آنها نام مستعار برای همان دستور هستند.
دستور استفاده از Netcat برای اسکن پورت
یکی از رایج ترین کاربردهای نت کت به عنوان اسکنر پورت است.اگرچه netcat احتمالاً پیچیده ترین ابزار برای این کار نیست (nmap در بیشتر موارد انتخاب بهتری است)، می تواند پورت های ساده ای را برای شناسایی آسان پورت های باز انجام دهد.ما این کار را با تعیین محدوده ای از پورت ها برای اسکن انجام می دهیم، همانطور که در بالا انجام دادیم، همراه با گزینه -z برای انجام اسکن به جای تلاش برای شروع یک اتصال.
به عنوان مثال، ما می توانیم تمام پورت ها را تا 1000 با صدور این دستور اسکن کنیم:
netcat -z -v domain.com 1-1000
به همراه گزینه -z، گزینه -v را نیز مشخص کرده ایم تا به netcat بگوییم اطلاعات دقیق تری ارائه دهد.
خروجی به شکل زیر خواهد بود:
Output
nc: connect to domain.com port 1 (tcp) failed: Connection refused
nc: connect to domain.com port 2 (tcp) failed: Connection refused
nc: connect to domain.com port 3 (tcp) failed: Connection refused
nc: connect to domain.com port 4 (tcp) failed: Connection refused
nc: connect to domain.com port 5 (tcp) failed: Connection refused
nc: connect to domain.com port 6 (tcp) failed: Connection refused
nc: connect to domain.com port 7 (tcp) failed: Connection refused
. . .
Connection to domain.com 22 port [tcp/ssh] succeeded!
. . .
همانطور که می بینید، این اطلاعات زیادی را ارائه می دهد و برای هر پورت به شما می گوید که آیا اسکن موفقیت آمیز بوده است یا خیر.اگر واقعاً از نام دامنه استفاده می کنید، این فرمی است که باید از آن استفاده کنید.
با این حال، اگر آدرس IP مورد نیاز خود را بدانید، اسکن شما بسیار سریعتر انجام می شود. سپس می توانید از پرچم -n استفاده کنید تا مشخص کنید که نیازی به حل آدرس IP با استفاده از DNS ندارید:
netcat -z -n -v 198.51.100.0 1-1000
پیام های برگشتی در واقع به خطای استاندارد ارسال می شوند (برای اطلاعات بیشتر به مقاله تغییر مسیر I/O ما مراجعه کنید). ما می توانیم پیام های خطای استاندارد را به استاندارد out ارسال کنیم، که به ما امکان می دهد نتایج را راحت تر فیلتر کنیم.
ما خطای استاندارد را با استفاده از نحو bash 2>&1 به خروجی استاندارد هدایت می کنیم. سپس نتایج را با grep فیلتر می کنیم:
netcat -z -n -v 198.51.100.0 1-1000 2>&1 | grep succeeded
Output
Connection to 198.51.100.0 22 port [tcp/*] succeeded!
در اینجا، میتوانیم ببینیم که تنها پورت باز در محدوده 1 تا 1000 در رایانه راه دور، پورت 22، پورت سنتی SSH است.
نحوه برقراری ارتباط از طریق نت کت
Netcat محدود به ارسال بسته های TCP و UDP نیست. همچنین می تواند در یک پورت برای اتصالات و بسته ها گوش دهد. این به ما این فرصت را می دهد تا دو نمونه از netcat را در رابطه مشتری-سرور به هم متصل کنیم.
اینکه کدام کامپیوتر سرور و کدام سرویس گیرنده است، تنها یک تمایز مرتبط در طول پیکربندی اولیه است. پس از برقراری ارتباط، ارتباط در هر دو جهت دقیقاً یکسان است.
در یک دستگاه، میتوانید به netcat بگویید برای اتصال به یک پورت خاص گوش دهد. ما می توانیم این کار را با ارائه پارامتر -l و انتخاب یک پورت انجام دهیم:
netcat -l 4444
این به Netcat میگوید که به اتصالات TCP در پورت 4444 گوش دهد.بهعنوان یک کاربر معمولی (غیر روت)، به عنوان یک اقدام امنیتی، نمیتوانید پورتهای زیر 1000 را باز کنید.
در سرور دوم، میتوانیم به دستگاه اول در شماره پورتی که انتخاب کردهایم متصل شویم. ما این کار را به همان روشی انجام میدهیم که قبلاً ارتباط برقرار کردهایم:
netcat domain.com 4444
به نظر می رسد که هیچ اتفاقی نیفتاده است. با این حال، اکنون می توانید پیام هایی را در دو طرف اتصال ارسال کنید و آنها در هر دو طرف مشاهده خواهند شد.
یک پیام تایپ کنید و ENTER را فشار دهید. در هر دو صفحه نمایش محلی و از راه دور ظاهر می شود. این در جهت مخالف نیز عمل می کند.
هنگامی که ارسال پیام به پایان رسید، می توانید CTRL-D را فشار دهید تا اتصال TCP را ببندید.
نحوه ارسال فایل از طریق Netcat
با استفاده از مثال قبلی، میتوانیم کارهای مفیدتری را انجام دهیم. از آنجا که ما در حال ایجاد یک اتصال TCP معمولی هستیم، می توانیم تقریباً هر نوع اطلاعاتی را از طریق آن اتصال منتقل کنیم. این به پیام های چت که توسط کاربر تایپ می شود محدود نمی شود. ما می توانیم از این دانش برای تبدیل netcat به یک برنامه انتقال فایل استفاده کنیم.
یک بار دیگر، باید یک انتهای اتصال را برای گوش دادن به اتصالات انتخاب کنیم. با این حال، به جای چاپ اطلاعات روی صفحه، همانطور که در مثال گذشته انجام دادیم، همه اطلاعات را مستقیماً در یک فایل قرار می دهیم:
netcat -l 4444 > received_file
> در این دستور تمام خروجی netcat را به نام فایل مشخص شده هدایت می کند.
در رایانه دوم، یک فایل متنی ساده با تایپ کردن:
echo "Hello, this is a file" > original_file
اکنون میتوانیم از این فایل بهعنوان ورودی برای اتصال netcat که با رایانه شنود ایجاد میکنیم استفاده کنیم. فایل همانطور که به صورت تعاملی تایپ کرده بودیم منتقل می شود:
netcat domain.com 4444 < original_file
ما میتوانیم در رایانهای که در انتظار اتصال بود، ببینیم که اکنون یک فایل جدید به نام receive_file با محتوای فایلی که در رایانه دیگر تایپ کردهایم داریم:
cat received_file
Output
Hello, this is a file
همانطور که می بینید با لینک کرد اشیا به راحتی می توانیم از این اتصال برای انتقال انواع چیزها بهره ببریم. به عنوان مثال، ما میتوانیم محتویات یک فهرست کامل را با ایجاد یک tarball بدون نام، انتقال آن به سیستم راه دور و باز کردن آن در فهرست راه دور منتقل کنیم.
در انتهای دریافت، میتوانیم پیشبینی کنیم که فایلی بیاید که باید از حالت فشرده خارج شده و با تایپ کردن:
netcat -l 4444 | tar xzvf -
خط تیره پایانی (-) به این معنی است که tar بر روی ورودی استاندارد کار می کند، که هنگام برقراری اتصال از netcat در سراسر شبکه لوله می شود.
در کنار محتویات دایرکتوری که میخواهیم انتقال دهیم، میتوانیم آنها را در یک تاربال بسته بندی کنیم و سپس از طریق netcat به رایانه راه دور ارسال کنیم:
tar -czf - * | netcat domain.com 4444
این بار، خط تیره در دستور tar به معنای تار کردن و زیپ کردن محتویات دایرکتوری فعلی است (همانطور که توسط علامت * مشخص شده است)، و نتیجه را در خروجی استاندارد بنویسید. سپس مستقیماً روی اتصال TCP نوشته میشود، که سپس در انتهای دیگر دریافت میشود و در دایرکتوری فعلی رایانه راه دور از حالت فشرده خارج میشود. این فقط یک نمونه از انتقال داده های پیچیده تر از یک کامپیوتر به کامپیوتر دیگر است. ایده رایج دیگر استفاده از دستور dd برای تصویربرداری از یک دیسک در یک طرف و انتقال آن به یک کامپیوتر راه دور است. هر چند ما در اینجا به این موضوع نمی پردازیم.
نحوه استفاده از Netcat به عنوان یک وب سرور ساده
ما netcat را برای گوش دادن به اتصالات به منظور برقراری ارتباط و انتقال فایلها پیکربندی کردهایم. ما میتوانیم از همین مفهوم برای استفاده از netcat به عنوان یک وب سرور بسیار ساده استفاده کنیم. این می تواند برای آزمایش صفحاتی که ایجاد می کنید مفید باشد.
ابتدا بیایید یک فایل HTML ساده روی یک سرور بسازیم:
nano index.html
در اینجا چند HTML ساده وجود دارد که می توانید در فایل خود استفاده کنید:
<html>
<head>
<title>Test Page</title>
</head>
<body>
<h1>Level 1 header</h1>
<h2>Subheading</h2>
<p>Normal text here</p>
</body>
</html>
ذخیره کنید و فایل را ببندید.
بدون حقوق ریشه، نمیتوانید این فایل را در پورت وب پیشفرض، پورت 80 ارائه کنید. ما میتوانیم پورت 8888 را به عنوان یک کاربر معمولی انتخاب کنیم.
اگر فقط می خواهید این صفحه را یک بار سرویس کنید تا نحوه رندر آن را بررسی کنید، می توانید دستور زیر را اجرا کنید:
printf 'HTTP/1.1 200 OK\n\n%s' "$(cat index.html)" | netcat -l 8888
اکنون، در مرورگر خود، میتوانید با مراجعه به زیر به محتوا دسترسی داشته باشید:
http://server_IP:8888
این به صفحه سرویس می دهد و سپس اتصال netcat بسته می شود. اگر بخواهید صفحه را بازخوانی کنید، از بین خواهد رفت:
ما میتوانیم با قرار دادن آخرین دستور در یک حلقه بینهایت، netcat صفحه را بهطور نامحدود ارائه دهیم، مانند این:
while true; do printf 'HTTP/1.1 200 OK\n\n%s' "$(cat index.html)" | netcat -l 8888; done
این به آن امکان می دهد پس از بسته شدن اولین اتصال به دریافت اتصالات ادامه دهد. ما می توانیم حلقه را با تایپ CTRL-C در سرور متوقف کنیم. این به شما امکان میدهد ببینید که چگونه یک صفحه در مرورگر رندر میشود، اما عملکرد خیلی بیشتری را ارائه نمیدهد. شما هرگز نباید از این برای ارائه وب سایت های واقعی استفاده کنید. امنیت وجود ندارد و چیزهای ساده ای مانند لینک ها حتی به درستی کار نمی کنند.
نتیجه
اکنون باید ایده خوبی داشته باشید که نت کت برای چه چیزی می تواند استفاده شود. این یک ابزار همه کاره است که می تواند برای تشخیص مشکلات و تأیید اینکه عملکرد سطح پایه به درستی با اتصالات TCP/UDP کار می کند مفید باشد. با استفاده از netcat، می توانید برای تعامل سریع بین رایانه های مختلف به راحتی ارتباط برقرار کنید. نتکت تلاش میکند تا تعاملات شبکه بین رایانهها را با حذف پیچیدگی ایجاد اتصالات شفاف کند.