استخر ماینینگ روی VPN: نشست را روی مسیر درست نگه دار
ماینر استخری یک نشست Stratum خروجی باز میکند، نه یک درگاه peer. تونل را زیر آن فرایند بگذار و مسیر و حلکننده را از فضای نام آن بخوان.
نرمافزار ماینینگ یک سوکت را به یک نشانی باز نگه میدارد و هر پرسش دربارهٔ تونل، مسیر و کار اعتبارسنجیشده به همان سوکت آویزان است. آن سوکت یک نشست کلاینت خروجی به نقطهٔ پایانی استخر است، نه یک شنونده که peerها را میپذیرد. مسیر زیر آن را از چهار مقداری که استخر صادر کرده تا سهمی که استخر واقعاً ثبت کرده دنبال میکند و سایر سرویسهای میزبان را دست نمیزند. هر گام پاسخی میدهد که میتوانی مقایسه کنی، نه یک برداشت.
از نقطهٔ پایانی شروع کن که استخر واقعاً صادر کرده است
استخر چهار مقدار به تو میدهد که تمام قرارداد را میسازند: نام میزبان یا نشانی، درگاه، گونهٔ پروتکل و رشتهٔ حساب. آنها را از داشبورد استخر یا پیام خوشآمد بگیر، نه از آموزشی برای استخر دیگر. برای همان سرویس قطعههای منطقهای وجود دارد، پس نام میزبانی که از راهنمای قدیمی کپی شده هنوز میتواند وصل شود و هنوز میتواند حسابی را اعتبار بدهد که هرگز قصد استفاده از آن را نداشتی. چهار مقدار را عیناً در پیکربندی ماینر کپی کن، چون رشتهٔ حسابی که دوباره تایپ شود یک جداکننده را از دست میدهد.
جریانی که مسیریابی میکنی همان است که راهنمای توسعهدهندهٔ Bitcoin آن را نشست Stratum مینامد: یک اتصال TCP پایدار دوطرفه که استخر کار را پخش میکند و ماینر سهمها را برمیگرداند. این همان جریان اتصالهای peer یک گرهٔ کامل یا همگامسازی زنجیرهٔ کیف پول نیست، و تا زدن آنها در یک کلاس ترافیک همان جایی است که بیشتر سردرگمی آغاز میشود. تنها اولی زیر این سیاست است.
جایی که استخر TLS ارائه میدهد، تأیید سروری را که مستنداتش میخواهد نگه دار. تونل جهش از دستگاه تو تا سرور VPN را رمز میکند و همانجا تمام میشود؛ ضامن کسی که آن سوی دیگر پاسخ میدهد نیست. اگر میخواهی نشست از خروج بهخطرافتاده جان سالم ببرد، هر دو بررسی را یکی در هر سر نگه دار.
تونل را به فرایند ببند، نه به خانه
دو نقطهٔ اتصال کار میکنند: کلاینت VPN را درون فضای نام شبکهای که ماینر استفاده میکند اجرا کن، یا به آن فضای نام دروازهای بده که ترافیکش را به تونل ببرد. هر دو چیدمان نشست را پیش از آنکه استخر ببیندش روی مسیر میگذارند. شکست معمول کلاینتی روی میزبان، ماینری در کانتینر با پل خودش و مسیری روی میزبان است که کانتینر هرگز آن را نمیپرسد. پنجرهٔ کلاینت سالم به نظر میرسد در حالی که استخر نشانی خانهات را ثبت میکند.
ترابری خود تونل را پیش از هر محدودسازی بررسی کن. کلاینت باید سرورش را از لایهٔ زیرین برسد، پس سیاستی که هر بسته را میگیرد بستههایی را هم میگیرد که تونل را میساختند. آنگاه تونل نمیتواند شروع شود و چیز دیگری هم بیرون نمیرود. با ویژگی تونل تقسیمشدهٔ کلاینت انتخاب کن چه چیزی وارد تونل شود؛ ویرایش دستی مسیرهای پیشفرض همان راهی است که لایهٔ زیرین ناپدید میشود.
وقتی سیاست برقرار شد، جدول سوکتها را در فضای نامی که ماینر به آن تعلق دارد بخوان. جریان به درگاه استخر باید روی رابط تونل بنشیند و دو فرمان به این پرسش پاسخ میدهند. درگاه زیر یک نمونه است؛ آن را با درگاهی که استخر صادر کرده جایگزین کن.
sudo nsenter -t "$(pidof cgminer)" -n ss -tnp state established 'dport = :3333'
sudo nsenter -t "$(pidof cgminer)" -n ip route get 203.0.113.10مسیر و حلکننده را از بافت خود ماینر بخوان
مسیریابی و حل نامها برای هر فضای نام است، پس بررسیای که در یک پوستهٔ معمولی اجرا شود هرگاه ماینر در کانتینر باشد ماشین اشتباه را توصیف میکند. اول به فضای نام وارد شو و بعد بپرس کدام رابط بستهای را به نشانی استخر میبرد و کدام حلکننده برای نام میزبانش پاسخ میدهد. پاسخهای میزبان منتقل نمیشوند و شکاف میان آنها منبع رایج سرزنش در جای نادرست است.
رابطی را که میگیری نام ببر: تونل یعنی نشست روی مسیر مقصود است، در حالی که پیوند فیزیکی یعنی قاعدهای زودتر از انتظارت تطبیق پیدا کرده. طول پیشوند اول تعیین میکند، سپس متریک، سپس قواعد سیاست، بنابراین جدولی با چند مدخل پیشفرض بستهها را دو برابر نمیکند، فقط میبازد.
حلکنندهها جدا از مسیرها شکست میخورند. تونلی که /etc/resolv.conf را بازنویسی میکند میتواند فضای نام را به حلکنندهای اشارهگر بگذارد که فقط از درون تونل در دسترس است، و این پیش از هر دستدادن TCP شکست میخورد. نام میزبان استخر را درون فضای نام حل کن و با نشانی منتشرشده مقایسه کن. اگر جستوجو زمانبندی شود یا چیز دیگری برگرداند، پیش از دست زدن به مسیرها حل را درست کن.
کلاینت استخر و شنوندهٔ گره را جدا نگه دار
درگاه 8333 درگاه peer بیتکوینکور است، جایی که گرهٔ کامل به اتصالهای ورودی گوش میدهد؛ ماینر استخری هرگز به باز بودنش نیاز ندارد و باز کردنش خرابی خروجی را درست نمیکند. شنوندههای ورودی و نشستهای خروجی نقشهای متضاد با فرضهای اعتماد متضاد هستند. هیچ چیز در پیکربندی ماینر آن درگاه را نمیبندد، پس یک درگاه بسته نمیتواند هیچ خطایی را که گزارش میکند توضیح دهد. از این رو نصیحتی که برای دسترسپذیری یک گره نوشته شده میتواند سرویسی عمومی را روی میزبانی در حال اجرا بگذارد که فقط باید سهم میفرستاد.
اگر یک ماشین واقعاً هر دو کار را میکند، هر نقش را سرویس خودش با تصمیم دسترسی خودش بدان. شنوندهٔ گره پشت سیاستی است که روی سرویسهای عمومی اعمال میکنی و نشست ماینر به سیاست خروجی تعلق دارد که تونل را انتخاب میکند. ثبت کن میزبان چه نقشی دارد و وقتی این تغییر کرد قواعد نقش دیگر را بردار، چون قاعدهٔ اجازهٔ باقیمانده از دلیلش بیشتر عمر میکند.
ثابت کن که استخر کار را دریافت کرده است
پنکهٔ مشغول و هشریت صعودی نشان میدهند ماینر در حال محاسبه است، نه اینکه چیزی به استخر رسیده باشد. شاهد در شمارندههای ارسال کلاینت یا در داشبورد استخر است: سهمهای پذیرفتهشده، سهمهای ردشده و دلیلی که به هر رد پیوست است. آن اعداد سه خرابی را جدا میکنند که از بیرون یکسان به نظر میرسند: نبود نشست، نشستی بدون اعتبار و نشستی که پیوسته دوباره وصل میشود. پیش از تغییر هر پیکربندی آنها را بخوان.
یک تلاش اتصال را با گزارشگیری مفصل تماشا کن و آخرین مرحلهای را که موفق شد یادداشت کن. مرحلهای که دنباله در آن میایستد از هر پیام تکافتادهای پیرامونش سودمندتر است:
| Last stage reached | What it rules out | Probe to run next |
|---|---|---|
| Name lookup completed | Resolver and namespace reachability | ip route get for the returned address |
| TCP connect completed | Route and egress filtering | ss -tnp on the tunnel interface |
| Subscription returned a job | Endpoint or protocol mismatch | Accepted against rejected counts |
سپس بگذار کلاینت برای یک پنجرهٔ ثابت کار کند و هر دو نتیجه را از گزارشش بشمار. یک grep برای هر شمارنده کافی است و مقایسهٔ آنها در همان پنجره استخر کند را از مسیر شکسته جدا میکند. مسیر را به جایی تنظیم کن که کلاینتت مینویسد، چون دو شمارش به مکان وابسته نیستند:
grep -c Accepted /var/log/miner.log
grep -c Rejected /var/log/miner.logاگر قاعدهای هر بار که تونل میافتد اتصال مستقیم به استخر را ممنوع میکند، آن را بهصورت بلوکهٔ صریح روی نقطهٔ پایانی استخر بیان کن. کلاینتی که بیصدا از پیوند فیزیکی دوباره تلاش میکند به ماین کردن ادامه میدهد و به نقض آن قاعده ادامه میدهد، و نمایش وضعیتش این را ذکر نمیکند. قاعده را با انداختن عمدی تونل و تأیید اینکه درگاه استخر بهکلی در دسترس نیست بیازما.