۱۲۷.۰.۰.۱:۴۹۳۴۲: راهنمای آدرس IP، پورت و اشکالزدایی میزبان محلی
شاید روی چیزی کلیک کردهاید. شاید یک پنجره ترمینال با اسکرول از کنارش رد شدهاید. شاید یک فایل لاگ توجه شما را جلب کرده است. هر کدام که بوده، این رشته ظاهر شده است: `127.0.0.1:49342`. مرورگر شما به صفحهای پریده که در هیچ کجای اینترنت وجود ندارد. ابزارهای توسعه آن را علامتگذاری کردهاند. یک پنجره ورود به سیستم چشمکزن باز شده و ناپدید شده است. هیچ چیز به طور قابل مشاهدهای خراب نشده است. با این حال، هنوز کمی مشکل وجود دارد.
آرام باشید، هیچ چیز خراب نشده است. آن رشته کوچک در واقع یکی از رایجترین چیزهایی است که هنگام استفاده از کامپیوتر به آن نگاه خواهید کرد و به محض اینکه دو نیمه آن را درک کنید، هر `127.0.0.1:` بعدی مانند یک جمله معمولی خوانده خواهد شد. آدرس IP در سمت چپ، حلقه برگشتی جهانی است، که در هر دستگاهی که لمس میکنید، یکسان است. پورت سمت راست فقط یک پورت خاص است که سیستم عامل برای یک مکالمه کوتاه بین برنامههایی که روی سختافزار شما اجرا میشوند، به یک سرویس محلی، یک برنامه وب یا یک سرویس شبکه اختصاص داده است. هیچ یک از آنها به شبکه خارجی دسترسی ندارند. همه آنها در یک جعبه جلوی شما باقی میمانند.
خب، نقشه از این قرار است. یک توضیحدهنده به علاوه یک راهنمای عیبیابی، به هم متصل شدهاند. آدرس از نظر تاریخی از کجا آمده است. شماره پورت در واقع نشان دهنده چیست؟ چرا عدد ۴۹۳۴۲، به طور خاص، اصلاً چیز خاصی نیست؟ وقتی یک کاربر ویندوز آن را در مقابل کسی که در لینوکس یا macOS است میبیند؟ تصویر امنیتی آن به طور خاص در سال ۲۰۲۶ چگونه خواهد بود؟ چگونه توسعهدهندگان کریپتو از الگوی یکسان در یک محیط توسعه Web3 با Hardhat، Anvil، Ganache و Bitcoin Core استفاده میکنند. آن را از اول تا آخر بخوانید، یا مستقیماً به هر بخشی که با آنچه شما جستجو کردهاید مطابقت دارد، بروید.
۱۲۷.۰.۰.۱ چیست: توضیح آدرس حلقه برگشت
اول بخش IP را در نظر بگیرید. 127.0.0.1 از بیشتر چیزهایی که این روزها به صورت آنلاین استفاده میکنید قدیمیتر است. در اکتبر 1989، خیلی قبل از اینکه وب تجاری وجود داشته باشد، IETF RFC 1122 را کنار گذاشت. در بخش 3.2.1.3 یکی از بیپردهترین قوانین شبکه که تاکنون به صورت کاغذی اجرا شده بود، گنجانده شده بود: «آدرسهای این فرم نباید خارج از یک میزبان ظاهر شوند.» سیستم عامل تلفن شما امروز آن را اجرا میکند. روتر خانگی شما نیز همین کار را میکند. هر سیستم عاملی که از آن زمان تاکنون عرضه شده است، بیسروصدا به رعایت آن ادامه داده است.
مقیاس، مردم را گیج میکند. این قانون برای ۱۶,۷۷۷,۲۱۶ آدرس اعمال میشود. همه آنها. شانزده میلیون آدرس ذخیره شده، بنابراین یکی از آنها، ۱۲۷.۰.۰.۱، میتواند به طور قابل اعتمادی به معنای "این دستگاه، همین جا" در هر کجای زمین باشد. کمی اسراف؟ بله، شکایات برای دههها بلند بوده است. مجموعه جهانی IPv4 IANA در ۳ فوریه ۲۰۱۱ به صفر رسید. ARIN در ۲۴ سپتامبر ۲۰۱۵ به صفر رسید. RIPE NCC بلوک نهایی /۲۲ خود را در ۲۵ نوامبر ۲۰۱۹ منتشر کرد. پیشنویس IETF با نام `draft-schoen-intarea-unicast-127` در حال انتشار است که نشان میدهد بیشتر فضای ۱۲۷ میتواند در واقع به استفاده تکپخشی بازگردد. هیچکس نمیخواهد به آن دست بزند. بسیاری از نرمافزارهای موجود فرض میکنند که ۱۲۷ هرگز تغییر نخواهد کرد.
نکتهای که همیشه تازهواردان را غافلگیر میکند: بسته به معنای واقعی کلمه هرگز به کارت شبکه فیزیکی نمیرسد. حتی نزدیک هم نمیشود. بستهای که به مقصدی با پسوند 127.xxx ارسال میشود، توسط پشته TCP/IP سیستم عامل در لایه 3 گرفته شده و از طریق یک رابط مجازی (لینوکس و macOS آن را "lo" مینامند) عبور داده میشود. هسته هنوز کار واقعی را انجام میدهد - بخش TCP را میسازد، چکسام را اجرا میکند، مسیر دریافت را طی میکند. سربار واقعی، غیر صفر. اما هیچ سوئیچی در شبکه محلی شما هرگز آن ترافیک را نمیبیند. هیچ روتری آن را نمیبیند. هیچ ستون فقرات اینترنتی آن را نمیبیند.
کلمه "localhost" فقط یک نام مستعار کاربرپسند است که در یک فایل متنی ساده نگاشت شده است که میتوانید همین الان آن را باز کنید. در لینوکس و macOS: `/etc/hosts`. در ویندوز: `C:\Windows\System32\drivers\etc\hosts`. حلکننده قبل از اینکه از هر سرور DNS بپرسد، به آن فایل مراجعه میکند، به همین دلیل است که `localhost` در هواپیما با وایفای خاموش به خوبی حل میشود. IPv6 نسخه مخصوص به خود را دارد، `::1/128`، که توسط RFC 4291 در فوریه 2006 تعریف شده است. یک سردرد جمعه کلاسیک: یک مرورگر مدرن `localhost` را ابتدا به عنوان `::1` حل میکند، اما برنامه پایتون فقط 127.0.0.1 را محدود میکند. سوکتهای مختلف، بدون تقاطع، خرابی خاموش. هر هفته در جایی جریان کار کسی را قطع میکند.

چرا پورت ۴۹۳۴۲ را میبینید: پورتهای موقت و محدودههای IANA
حالا نیمه دوم. شماره پورتها بیشتر از IPها مردم را گیج میکنند، و دلیل خوبی هم دارد. رجیستری پورت IANA با نام سرویس و پروتکل انتقال، کل فضای ۱۶ بیتی (۰ تا ۶۵۵۳۵) را به سه سطل تقسیم میکند، و اینکه ۴۹۳۴۲ در کدام سطل قرار میگیرد، کل داستان است.
| محدوده | اعداد | هدف |
|---|---|---|
| سیستم (معروف) | ۰–۱۰۲۳ | سرویسهای استاندارد (HTTP 80، HTTPS 443، SSH 22، SMTP 25). برای اتصال، دسترسی ادمین لازم است. |
| کاربر (ثبتشده) | ۱۰۲۴–۴۹۱۵۱ | سرویسهای اختصاص داده شده به فروشندگان (PostgreSQL 5432، MySQL 3306، RDP 3389) |
| پویا / خصوصی / موقت | ۴۹۱۵۲–۶۵۵۳۵ | تخصیصهای کوتاهمدت؛ هیچ رزرو خدماتی مجاز نیست |
پورت ۴۹۳۴۲ در محدوده پویا قرار دارد. هیچ چیزی برای آن «ثبت» نشده است و هرگز هم ثبت نخواهد شد، زیرا IANA از اختصاص دقیق سرویسها در این محدوده خودداری میکند تا سیستمعاملها بتوانند آزادانه شماره پورتها را برای استفاده موقت در اینجا ارائه دهند. پورت موقت، پورتی است که به صورت پویا اختصاص داده شده و یک برنامه با شماره پورت خاصی آن را درخواست نکرده است. این پورت به سیستمعامل میگوید: «هر پورت خالی که میخواهید به من بدهید، من فقط برای این جلسه به آن نیاز دارم.» سیستمعامل عدد ۴۹۳۴۲ را برمیگرداند، برنامه یک سوکت شنود را متصل میکند و هر جریانی که به یک آدرس کوتاهمدت و ترکیب پورت نیاز داشت، یکی را دریافت میکند. پورت ۴۹۳۴۲ اغلب برای سرور محلی موقت با استفاده از این نوع اتصال موقت استفاده میشود.
محدوده پیشفرض موقت در واقع بسته به سیستم عامل متفاوت است.
| سیستم عامل | محدوده زمانی پیشفرض | منبع |
|---|---|---|
| لینوکس | ۳۲۷۶۸–۶۰۹۹۹ | `/proc/sys/net/ipv4/ip_local_port_range`، اسناد هسته |
| ویندوز (ویستا / سرور ۲۰۰۸ به بالا) | ۴۹۱۵۲–۶۵۵۳۵ | مایکروسافت یاد بگیرید |
| macOS (داروین / BSD) | ۴۹۱۵۲–۶۵۵۳۵ | `sysctl net.inet.ip.portrange.first/hifirst` |
| فریبیاسدی | ۴۹۱۵۲–۶۵۵۳۵ | پیشفرضهای sysctl |
در ویندوز یا macOS، عدد ۴۹۳۴۲ دقیقاً در محدوده پیشفرض قرار دارد. تقریباً مطمئناً یک تخصیصدهنده سیستم عامل آن را تعیین کرده است. در لینوکس داستان متفاوت است - عدد ۴۹۳۴۲ بالاتر از محدوده پیشفرض ۳۲۷۶۸ تا ۶۰۹۹۹ است، بنابراین توسط برنامهای انتخاب شده که از هسته خواسته است `bind(('127.0.0.1', 0))` را اجرا کند و هر آنچه آزاد بود را دریافت کند. RFC 6056، که در ژانویه ۲۰۱۱ از IETF منتشر شد، به پشتهها میگوید که به دلایل امنیتی، انتخاب پورتهای موقت را در کل فضای ۱۰۲۴ تا ۶۵۵۳۵ تصادفی کنند. پورتهای قابل پیشبینی، ربودن جریانها را آسانتر میکنند. به همین دلیل است که یک سرور توسعهدهنده ممکن است امروز روی ۴۹۳۴۲، فردا روی ۵۴۸۷۱ و روز بعد روی ۳۳۲۰۰ فرود بیاید.
جایی که 127.0.0.1:49342 روی دستگاه شما نمایش داده میشود
خب، این اتفاق چه زمانی در یک روز عادی رخ میدهد؟ یک سرور محلی که روی پورت ۴۹۳۴۲ اجرا میشود، میتواند تقریباً هر چیزی از یک لیست طولانی از ابزارهایی برای توسعهدهندگان باشد که در آنها توسعهدهندگان برنامهها را در برابر یک سوکت loopback محلی آزمایش میکنند. جدول زیر موارد روزمرهای را پوشش میدهد که در آنها پورتهایی مانند ۴۹۳۴۲ در دنیای واقعی ظاهر میشوند و سرویسهایی که هر بار روی پورت مشخصشده اجرا میشوند و اتصالات را میپذیرند.
| نرمافزار | پورت معمولی | آنچه میبینید |
|---|---|---|
| ورود به سیستم OAuth CLI (gh، aws، gcloud) | تصادفی زودگذر | مرورگر 127.0.0.1 را باز میکند:، تأیید میکند، میبندد |
| نوتبوک ژوپیتر | ۸۸۸۸، سپس زودگذر | سوکتهای هسته از پورتهای تصادفی در محدوده ۴۹۱۵۲ استفاده میکنند |
| سرور توسعه وایت | ۵۱۷۳ عدد | بارگذاری مجدد سریع ظاهر (frontend) |
| React / webpack-dev-server | ۳۰۰۰ | همان خانواده |
| اشکالزدایی VS Code / JetBrains | تصادفی زودگذر | آداپتور اشکالزدایی به یک سرور محلی متصل میشود |
| اپلیکیشنهای الکترون (اسلک، دیسکورد، اسپاتیفای) | تصادفی زودگذر | پل IPC داخلی |
| گره هاردهت | ۸۵۴۵ عدد | اتریوم JSON-RPC |
| سندان (ریخته گری) | ۸۵۴۵ عدد | اتریوم JSON-RPC |
| رابط کاربری گرافیکی Ganache | 7545 | زنجیره آزمایشی اتریوم |
| تست ثبت بیت کوین کور | ۱۸۴۴۳ | RPC از نسخه ۰.۱۶ |
تنها موردی که عبارت `127.0.0.1:49342` را به معنای واقعی کلمه در نوار آدرس مرورگر قرار میدهد؟ تقریباً همیشه OAuth. RFC 8252 IETF با عنوان "OAuth 2.0 برای برنامههای بومی" در اکتبر ۲۰۱۷ منتشر شد و به برنامههای بومی میگوید که از جریان تغییر مسیر loopback استفاده کنند، با یک قانون حک شده بر روی سنگ: سرور مجوز "باید هر شماره پورتی را مجاز بداند". `gh auth login` یا `gcloud auth login` را اجرا کنید. رابط خط فرمان (CLI) یک سرور http کوچک را روی یک پورت موقت تصادفی راهاندازی میکند، یک مرورگر را در ارائه دهنده هویت اجرا میکند، callback را روی آن آدرس loopback دریافت میکند و خود را خاموش میکند. میبینید که یکی از آدرسهای میزبان محلی مانند 127.0.0.1:49342 شاید برای دو ثانیه چشمک میزند و سپس ناپدید میشود. نه یک اشکال. نه یک ردیاب. نه یک کلاهبرداری. فقط یک handshake بسیار کوتاه، کاملاً محلی، که هرگز به شبکه خارجی در هیچ نقطهای نمیرسد.
عیبیابی خطاها و تداخلهای پورت ۱۲۷.۰.۰.۱:۴۹۳۴۲
طبق تجربه من، دردسرهای لوکال هاست به پنج دسته تقسیم میشوند. به معنای واقعی کلمه، هر چیزی که شما را مجبور به جستجو در ساعت ۱۱ شب کند، به نوعی در یکی از این دستهها قرار میگیرد.
پورت از قبل استفاده شده است. نود فریاد میزند «EADDRINUSE». پایتون خطای «OSError: [Errno 98] Address already in use» را به شما میدهد، چه خوب و چه بد. ویندوز فقط «WinSock 10048» را چشمک میزند و میرود. واقعیت اساسی در هر مورد یکسان است: فرآیند دیگری در دستگاه شما ابتدا ۴۹۳۴۲ را گرفته است. وظیفه شما این است که آن را پیدا کنید، آن را از بین ببرید و دوباره بازیابی کنید.
- در لینوکس: `ss -tulpn | grep :49342`، یا از روش قدیمی `sudo lsof -i :49342` استفاده کنید.
- در مک: `lsof -nP -iTCP:49342 -sTCP:LISTEN`
- در ویندوز در PowerShell: `netstat -ano | findstr :49342`، سپس `tasklist /fi "PID eq "` برای تبدیل PID به نام برنامه
سرور در حال اجرا است، هیچ چیز نمیتواند متصل شود. شما بیش از آنچه به خاطر دارید با این مواجه میشوید. IPv4 و IPv6 بیسروصدا با هم تداخل پیدا کردهاند. سرور شما خود را به 127.0.0.1 متصل کرده است. مرورگر شما بدون هیچ دلیلی `localhost` را به عنوان `::1` شناسایی کرده است. آنها دو سوکت متفاوت هستند، بنابراین طبیعتاً هیچ چیزی متصل نمیشود. این مشکل را با اتصال همزمان هر دو خانواده برطرف کنید (گوش دادن به `::` در اکثر پشتهها تمایل به دریافت آدرسهای نگاشت شده با IPv4 نیز دارد) یا فقط 127.0.0.1 را مستقیماً در URL بنویسید.
VPN ها loopback را اشغال میکنند. Cloudflare WARP با اختلاف زیادی در صدر قرار دارد. Cloudflare در واقع خودش در صفحه مستندات محدودیتهای شناخته شده خود به این موضوع اعتراف میکند: به طور خاص در macOS، قطع WARP میتواند مسیر 127.0.0.1 را مستقیماً حذف کند. اگر میزبان محلی شما درست بعد از اینکه VPN را فعال کردید، خاموش شد، تقریباً به همین دلیل است. WARP را دوباره وصل کنید، یا مسیر را با دستور `sudo ifconfig lo0 127.0.0.1 alias` به صورت دستی برگردانید. Proton VPN، Mullvad و NordVPN اساساً هرگز باعث این مشکل نمیشوند، به هر قیمتی. محصولات آنتی ویروس سازمانی و EDR داستان متفاوتی دارند. برخی از آنها ترافیک loopback را به روشهایی که به سرعت عجیب میشوند، رهگیری و پروکسی میکنند.
HSTS تستهای HTTPS را که فراموش کردهاید به خاطر میسپارد. ماهها پیش، شما یک گواهی خودامضا شده را روی `localhost` آزمایش کردید. کروم همان کاری را کرد که کروم انجام میدهد و هدر HSTS را ذخیره کرد. حالا هر درخواست ساده `http://localhost` بیسروصدا به https بازنویسی میشود. اشکالزدایی فوقالعاده سرگرمکننده است. رفع مشکل دو دقیقهای: `chrome://net-internals/#hsts` را باز کنید و ورودی را شگفتزده کنید.
قوانین فایروال. Loopback به طور پیشفرض از اکثر فایروالها عبور میکند. اکثر آنها. برخی از تصاویر لپتاپهای سازمانی عمداً localhost را به عنوان بخشی از وضعیت مهار بدافزار خود فیلتر میکنند و شما این را در پایان یک پنجشنبه طولانی متوجه میشوید. قوانین ورودی پیشرفته فایروال Windows Defender جایی است که باید بررسی شود. در لینوکس، `sudo ufw status verbose`. اگر واقعاً چیزی نیاز به باز شدن دارد، فقط پورت خاص مورد نظر را مجاز کنید. کل فایروال را از کار نیندازید.
با این حال، یک عادت وجود دارد که همیشه من را نجات میدهد. قبل از اینکه به یک قانون یا مسیر فایروال دست بزنید، `lsof` یا `netstat` را اجرا کنید. نیمی از مواقع، معلوم میشود که یک فرآیند زامبی سرسختانه پورت را از اجرای برنامهای که اوایل امروز از کار افتاده است، نگه میدارد. `kill -9` PID. مشکل در عرض چند ثانیه برطرف میشود.
راهاندازی پیکربندی لوکال هاست و سرور برای استفاده توسعهدهندگان
به جای اشکالزدایی، ساختن را یاد بگیرید؟ چند عادت پیکربندی سرور را در خود ایجاد کنید و کلی در وقت خود صرفهجویی خواهید کرد. هیچکدام از اینها تجملی نیست. ما دنبال چیزی خستهکننده هستیم: آزمایش و اشکالزدایی قابل اعتماد در چندین سرویس شبکه و سرویسهای مختلف روی یک لپتاپ، همین.
قانون اول، قانون کسلکننده: به «۱۲۷.۰.۰.۱» متصل شوید، نه «۰.۰.۰.۰». به «۰.۰.۰.۰» گوش دهید و وب سرور کوچک توسعهدهنده شما ناگهان خود را در تمام رابطهای شبکهای که دارید تبلیغ میکند. یعنی: یک نفر تصادفی سر میز کناری در وایفای کافه آن را پیدا میکند. به ۱۲۷.۰.۰.۱ متصل شوید و فقط چیزهایی که از قبل روی دستگاه شما هستند وارد میشوند. «http.server» پایتون، «express.listen()» نود، «http.ListenAndServe» گو - همه آنها IP تحتاللفظی را میپذیرند. فقط آن را تایپ کنید.
قانون دوم: وقتی واقعاً برایتان مهم نیست کدام پورت را انتخاب کنید، پورت ۰ را به شنونده (`server.listen(0)` در Node، `bind(('127.0.0.1', 0))` در Python) بدهید و هسته هر چه را که در آن میلیثانیه آزاد است، برمیگرداند. پس از آن `getsockname()` را فراخوانی کنید تا بفهمید واقعاً چه چیزی دریافت کردهاید و آن را به هر کامپوننتی که URL را میخواهد، بدهید. اساساً هر رابط خط فرمان OAuth و هر آداپتور اشکالزدایی که تا به حال به آن دست زدهاید، دقیقاً همین کار را انجام میدهد.
قانون سوم: متغیرهای محیطی، نه پورتهای کدنویسیشده. `PORT` را از محیط برنامه (env) استخراج کنید، در صورت وجود نداشتن، مقدار پیشفرض را به چیزی معقول تغییر دهید. همان فایل باینری در حال توسعه روی 127.0.0.1:5173 و در حال تولید پشت یک پروکسی معکوس روی 443 اجرا میشود. همان الگو را روی رشتههای پایگاه داده، کلیدهای API و موارد دیگر اعمال کنید. سند برنامه دوازده عاملی (Twelve-Factor App) قدیمیتر از برخی از همکاران شماست و هنوز هم ارزانترین راه برای جلوگیری از قطعی است.
قانون چهارم: HTTPS روی localhost دیگر دردسرساز نیست. کروم و فایرفاکس هر دو وضعیت «localhost» و «127.0.0.1» Secure Context را برای اکثر ویژگیها، حتی بدون یک گواهی واقعی، اعطا میکنند. آیا کتابخانهای سختگیر هنوز از پذیرش گواهی خودامضا خودداری میکند؟ از «mkcert» استفاده کنید، که هنوز هم کمدردسرترین CA محلی موجود است. ابزارهای داخلی مانند «http.server» پایتون و ماژول «net» نود به این معنی است که میتوانید در طول توسعه محلی، یک سرور محلی را تقریباً در پنج خط راهاندازی کنید، که به توسعهدهندگان اجازه میدهد با استفاده از اسکریپتهای مشابه برای تستهای ادغام، یک برنامه وب را تحت بار واقعی آزمایش کنند، جایی که سرویسها برای برقراری ارتباط از طریق loopback تنها چیزی هستند که نیاز دارید.
آخرین قانون، و در واقع قانون مهم. محیط تولید، محیط محلی نیست. نقطه پایان. دستگاه محلی شما یک مرز اعتماد است؛ یک کانتینر تولید، مرز اعتماد نیست. هرگز نقاط پایانی اشکالزدایی را که روی 127.0.0.1 در حال اجرا هستند، درون یک کانتینر تولید رها نکنید، زیرا سایر فرآیندها در همان کانتینر در روز اول به آنها میرسند و یک اشکال زمان اجرا بعداً یک مهاجم را نیز به دام میاندازد. فقط از ترافیک localhost در جایی که واقعاً به آن تعلق دارد استفاده کنید، در محیطهای توسعه استفاده میشود و نه هیچ جای دیگر، و روزی که هر API داخلی با استفاده از پورت به یک محیط مشترک یا محیطهای تولید منتقل میشود، فوراً auth واقعی را جلوی آن قرار دهید. نه اینکه "ما آن را بعد از راهاندازی برطرف خواهیم کرد". آن شرکت قبلی بود.

استفاده ایمن از پورت ۴۹۳۴۲: امنیت در آدرس Loopback
لوکال هاست حس حریم خصوصی میدهد. و تقریباً همینطور هم هست. تا اینکه ناگهان دیگر اینطور نیست.
این مشکلی است که همه در نهایت با آن مواجه میشوند. مهاجمان خارجی نمیتوانند مستقیماً با شماره ۱۲۷.۰.۰.۱ تماس بگیرند. اما مهاجمان خارجی قطعاً میتوانند مرورگر شما یا برنامهای روی دستگاه شما که به آن اعتماد دارید را فریب دهند تا از طرف آنها تماس برقرار کند. کل این نوع حمله، DNS rebinding نام دارد. این حمله از قبل از اینکه اکثر افرادی که این مطلب را میخوانند کد بنویسند، سرویسهای localhost را از بین میبرده است.
مثالی که هنوز هم اهالی کریپتو به آن اشاره میکنند، MyEtherWallet در ۲۴ آوریل ۲۰۱۸ است. مهاجمان یک حملهی BGP را علیه Route 53 آمازون انجام دادند، DNS را برای myetherwallet.com تغییر مسیر دادند و یک کلون فیشینگ را ارائه دادند که به اندازهی کافی زنده ماند تا حدود ۲۱۵ اتریوم (حدود ۱۵۲۰۰۰ تا ۱۶۰۰۰۰ دلار بسته به اینکه کدام مهر زمانی را پین کنید، طبق گزارش The Register and the Internet Society) را از بین ببرد. میدانم که این یک هک localhost نبود. اما نقطهی عطفی بود که جامعهی کریپتو دیگر وانمود نکرد که مدل مبدا مرورگر یک مرز امنیتی واقعی است. هر پل کیف پول محلی که بیسروصدا به یک پورت loopback گوش میداد، ناگهان احساس کرد که در معرض خطر قرار گرفته است.
پاسخ کروم به صورت Private Network Access رسید که در ابتدا در پیشنویسها CORS-RFC1918 نامیده میشد. از مارس 2024، مرورگر اکنون یک پیشفایل CORS حاوی `Access-Control-Request-Private-Network: true` را اجرا میکند، قبل از اینکه هر وبسایت عمومی اجازه دسترسی به یک آدرس خصوصی یا loopback را داشته باشد. سرویس محلی شما برای عبور باید با `Access-Control-Allow-Private-Network: true` پاسخ دهد. اجرای کامل از طریق نسخههای 123 تا 130 کروم انجام میشود. بنابراین اگر یک سرور توسعهدهنده را روی 127.0.0.1:49342 ارسال میکنید و انتظار دارید که یک صفحه عمومی در طول تستهای ادغام به آن برخورد کند، آن هدر را تنظیم کنید. در غیر این صورت درخواست بیصدا از بین میرود.
چند مورد از آسیبپذیریهای الکترون در سال ۲۰۲۵ شایستهی توجه ویژه هستند. CVE-2025-10585 یک اشکال سردرگمی نوع V8 است که در ۲۳ سپتامبر ۲۰۲۵ به فهرست آسیبپذیریهای شناختهشدهی مورد سوءاستفادهی CISA اضافه شد. CVE-2025-55305 یک دور زدن یکپارچگی کد است که اسنپشاتهای پشتهی V8 را دستکاری میکند و در همان پنجره افشا شده است. الکترون، کرومیوم را در خود جای داده است و لپتاپ شما انبوهی از برنامههای الکترون (Slack، VS Code، Discord، Notion، Teams و احتمالاً موارد دیگر) را روی خود دارد. بسیاری از آنها سرویسهای محلی را در loopback در معرض خطر قرار میدهند. سریعاً وصله کنید. و لطفاً، هرگز یک نقطهی پایانی RPC را روی ۱۲۷.۰.۰.۱ بدون توکن احراز هویت راهاندازی نکنید، اگر آن نقطهی پایانی میتواند کلیدها را بخواند، تراکنشها را امضا کند یا به هر نوعی پول را لمس کند.
چگونه توسعهدهندگان کریپتو از Localhost در Hardhat، Anvil و Ganache استفاده میکنند
توسعه وب ۳ اساساً مجموعهای بیپایان از ارجاعات آدرس شبکه ۱۲۷.۰.۰.۱ است - چه تمرکز شما روی استقرار قرارداد، فازینگ پروتکل یا صرفاً توسعه روزمره وب در برابر یک زنجیره محلی باشد. در حال حاضر یک خوشه کوچک از گرههای محلی روی میزبان محلی لپتاپ شما در حال اجرا هستند (حتی اگر نیمی از آنها را فراموش کرده باشید). هر کدام سرور مخصوص به خود را روی قوانین پورت دارند. هر کدام یک آدرس IP و ترکیب پورت متمایز را برای اتصال کلاینتها ارائه میدهند، که معمولاً از پورت خاصی استفاده میکنند که ابزار به طور پیشفرض روی آن تنظیم شده است.
برگه تقلب سریع. شبکه هاردهات از بنیاد نومیچ، `http://127.0.0.1:8545` را با شناسه زنجیره 31337 به عنوان پیشفرض خود انتخاب میکند. انویل از فاندری نیز همین آدرس و پورت را ادعا میکند که از طریق `--port` قابل تنظیم است برای مواقعی که دو مجموعه آزمایشی باز و در حال رقابت هستند. رابط کاربری گرافیکی گاناچی `127.0.0.1:7545` را با شناسه شبکه 5777 میگیرد، اگرچه رابط خط فرمان (CLI) آن از 8545 هاردهات استفاده میکند. در همین حال، حالت regtest بیتکوین کور، JSON-RPC خود را روی `127.0.0.1:18443` اجرا میکند - تغییری که در واقع از طریق درخواست pull شماره 10825 در نسخه 0.16 اعمال شد، پس از آنکه شخصی به وجود تداخل با 18332 شبکه آزمایشی اشاره کرد.
متامسک به معنای واقعی کلمه به هر یک از آنها متصل میشود. یک شبکه سفارشی با URL محلی RPC اضافه کنید و وارد آن میشوید. IP 127.0.0.1 فقط به عنوان یک پل نازک بین رابط کاربری کیف پول مبتنی بر مرورگر شما و هر بلاکچین شبیهسازی شدهای که در آن لحظه روی لپتاپ شما در حال کار است، عمل میکند. وقتی `127.0.0.1:` را در ردیابی پشته Web3 مشاهده میکنید، تقریباً همیشه یکی از این دو چیز است: آداپتور اشکالزدایی IDE شما به گره ضربه میزند، یا خود گره یک نقطه پایانی WebSocket را روی یک پورت تصادفی درست کنار RPC ثابت خود میچرخاند.
ادغامهای پرداخت این الگو را تکرار میکنند. ساخت یک پرداخت رمزنگاریشده با پشتیبانی Plisio؟ شما در نهایت SDK را به صورت محلی روی یک شنونده کوچک Flask یا Express در `127.0.0.1:3000/plisio/callback` اجرا میکنید. وبهوک دروازه هرگز نمیتواند مستقیماً از اینترنت عمومی به لپتاپ شما برسد، بنابراین آزمایش محلی از یک تونل (ngrok، Cloudflare Tunnel، Tailscale Funnel) برای افشای پورت استفاده میکند. این یک پورت خاص روی یک شماره پورت خاص است که شما، به عنوان فروشنده، انتخاب و کنترل میکنید. SDK های PHP، Python، Laravel و Node.js Plisio هر کدام یک کمککننده `verifyCallbackData` ارائه میدهند که یک HMAC-SHA1 از بار داده را در برابر کلید مخفی فروشگاه دوباره محاسبه میکند. این بررسی در برابر هر callback که به شنونده محلی میرسد، اجرا میشود. همان آدرس loopback، همان کار، امضای واقعی پیوست شده.
برای یک لحظه تصویر را کوچک کنید. این الگو در واقع همه جا وجود دارد: پرداخت، OAuth، سرویسهای شبکه Web3 که در توسعه استفاده میشوند، همه از درون یکسان به نظر میرسند - یک سرور روی پورت ۴۹۳۴۲ یا یک پورت پویای دیگر، اتصالات واقعی روی پورت مشخص شده و اجرا روی localhost در تمام مدت.
بررسی سریع لوکال هاست و پورت برای هر سیستم عاملی
یک راهنمای کوتاه. آن را در یک تب ترمینال باز نگه دارید. بیشتر از آنچه فکر میکنید به این موارد دسترسی خواهید داشت.
یک جعبه لینوکس را تصور کنید، هر توزیعی. `sudo ss -tulpn | grep :49342` به سوال "چه کسی روی ۴۹۳۴۲ است" پاسخ میدهد. آن grep را حذف کنید و هر سوکت در حال گوش دادنی را که دستگاه باز کرده است، دریافت خواهید کرد. در مورد سقف پورت پویای هسته کنجکاو هستید؟ `cat /proc/sys/net/ipv4/ip_local_port_range`. اگر فقط میخواهید ثابت کنید که خود loopback فعال است، `ip addr show lo` به شما نشان میدهد. و سلام - اگر `lo` از خروجی حذف شده باشد، شما یک مشکل بسیار بزرگتر از یک پورت پیدا کردهاید.
مک هم به همین شکل کار میکند، فقط با ابزارهای متفاوت، چون در دنیای BSD است. `lsof -nP -iTCP:49342 -sTCP:LISTEN` فرآیندی را که روی پورت قرار دارد چاپ میکند. دونقطه و عدد را حذف کنید، همه شنوندهها را فهرست میکنید. وقتی به قابلیت مشاهده در سوکتهای سایر کاربران نیاز دارید، از sudo پیشوند استفاده کنید. محدوده موقت در `sysctl net.inet.ip.portrange.first net.inet.ip.portrange.hifirst` قرار دارد. Loopback در اینجا `lo0` نامیده میشود (نه `lo`)، و این تغییر نام کوچک، افراد را دقیقاً یک بار قبل از اینکه برای همیشه آن را درونی کنند، گیر میاندازد. با `ifconfig lo0` بررسی کنید.
ویندوز به طور کامل زبان برنامهنویسی را برعکس میکند. یک PowerShell را به عنوان ادمین باز کنید. `netstat -ano | findstr :49342` یک PID تولید میکند. آن را در `tasklist /fi "PID eq "` قرار دهید تا عدد به نام برنامه تبدیل شود. محدوده دینامیکی؟ `netsh int ipv4 show dynamicport tcp`. آیا نیاز دارید محدوده را به پایین بکشید زیرا یک برنامه قدیمی و سرسخت به چیزی در پایینترین حد نیاز دارد؟ `netsh int ipv4 set dynamic tcp start=49152 num=16384` آن را جابجا میکند.
این موارد را به حافظهی قوی بسپارید تا سردردهای لوکال هاست شما به رفع مشکلات پنج دقیقهای، یا شاید کمتر، کاهش یابد. این را یک بار امتحان کنید: `lsof -nP -iTCP -sTCP:LISTEN | grep 127.0.0.1` را روی لپتاپ در حال کار خود اجرا کنید. لیست پیمایش همیشه طولانیتر از آن چیزی است که انتظار دارید. تبهای پسزمینهی مرورگر. تعداد انگشتشماری از سرورهای زبان ویرایشگر، اغلب بیش از یکی. DNS داخلی داکر. پلهای IPC الکترون از Slack، Discord، Linear یا هر چیز دیگری که اجرا میکنید. برخی از سرویسهای تلهمتری سیستمعامل که هرگز نمیدانستید وجود دارند. به علاوهی شش یا هفت سرور توسعه از امروز صبح که قطعاً فراموش کردهاید آنها را خاموش کنید. این سطح سر و صدا طبیعی است. این دقیقاً همان چیزی است که یک محیط توسعهی در حال کار در زیر آن به نظر میرسد.