به روز رسانی ۱ [۲۱ آذرماه ۱۳۹۸]: لینک قسمت دوم به ادامه مطلب اضافه شد.
به روز رسانی ۲ [۲۱ آذرماه ۱۳۹۸]: لینک قسمت سوم به ادامه مطلب اضافه شد.
به روز رسانی ۳ [۲۲ آذرماه ۱۳۹۸]: لینک قسمت چهارم به ادامه مطلب اضافه شد.
به روز رسانی ۴ [۲۳ آذرماه ۱۳۹۸]: جهت پرسش و پاسخ به رشته توییت مرتبط مراجعه نمایید.
در این مطلب به چگونگی راهاندازی سرور VPN بسیار امن با استفاده از ShadowsocksR و سیستمعامل FreeBSD به زبان ساده خواهیم پرداخت. همچنین نحوه Hardening یا سختسازی آنرا جهت افزایش ضریب ایمنی خواهیم آموخت. به منظور افزایش راندمان و کارایی حداکثری آن، نحوه Perfromance Tuning یا تنظیم کارایی Network Stack سیستمعامل FreeBSD را خواهیم آموخت. دلیل انتخاب سیستم عامل FreeBSD، امنیت بسیار بالا، سادگی استفاده، پایداری بی نظیر آن، و در نهایت تسلط نگارنده این مطلب بدلیل توسعه، پورت، و نگهداری چندین نرم افزار به عنوان بخشی از مجموعه پورت های رسمی FreeBSD می باشد.
در مقام مقایسه از نقطهنظر امنیتی، تعداد آسیبپذیریهای سیستمعاملهای مختلف از سال ۱۹۹۹ تاکنون (مدت ۲۰ سال): FreeBSD تعداد ۳۴۸ مورد، Red Hat Enterprise Linux تعداد ۶۶۱ مورد، Linux Kernel تعداد ۲۳۳۳ مورد، Debian Linux تعداد ۳۰۵۷ مورد، Ubuntu Linux از سال ۲۰۰۵ تعداد ۲۰۰۷ مورد و در نهایت Microsoft Windows 10 از سال ۲۰۱۵ تعداد ۱۱۱۱ مورد آسیبپذیری را ثبت نمودهاند. فراموش نشود که این سیستمعامل آنقدر قابل اتکا میباشد که Netflix با کمک آن یکچهارم ترافیک کل اینترنت را به خود اختصاص داده است یا شرکت WhatsApp توانسته است به کمک آن بر روی هر سرور به ۲ میلیون کاربر خدمات دهد. ناگفته نماند که شرکت Sony سیستمعامل PlayStation های ۳ و ۴ را مبتنی بر FreeBSD توسعه داده است.
در ابتدای این مطلب آموزشی نحوه دریافت سرور رایگان ۵ ماهه از یکی از معتبرترین سرویسدهندههای سرور مجازی یا VPS به نام UpCloud را خواهیم آموخت.
این سرور VPN قابلیت ارائه و فراهم نمودن فیلترشکن امن برای سیستمعاملهای موبایل Android و iOS و همچنین سیستمعاملهای دسکتاپ نظیر Microsoft Windows, macOS, GNU/Linux و در نهایت سیستمعاملهای خانواده BSD از جمله FreeBSD, NetBSD, OpenBSD, TrueOS, DragonFlyBSD و … را خواهد داشت. نکته قابل توجه این میباشد که این VPN در زمان قطعی اینترنت در زمان خیزش اخیر مردم ایران در ترکیب با روشهای امن یا ناامن دیگر در پارهای از موارد قادر به دور زدن قطعی اینترنت و فیلترینگ با سرعت بسیار عالی و به طریقی امن بود! در صورت لزوم در مطلبی دیگر به تفصیل به چگونگی این امر خواهیم پرداخت. در ادامه مطلب اشارهای به چگونگی این موضوع خواهم نمود.
از نقطه نظر دانش فنی به منظور دنبال نمودن این راهنمای ویدیویی، تنها پیشنیاز دنبال نمودن این راهنما، آشنایی متوسط کاربر به استفاده از یکی از سیستمعاملهای ویندوز یا مک، و استفاده از اینترنت میباشد.
پیش از ادامه مطلب، به منظور مطالعه بیشتر و آشنایی با سیستم عامل FreeBSD، مطالعه مقالات ذیل به قلم نگارنده این مطلب شدیدا توصیه میشود:
نکته: لطفا توجه داشته باشید مطلبی که در ادامه میآید، چکیده نکات فنی آموزش ویدیویی فوق میباشد. بنابراین توضیحات اصلی در داخل ویدیوی آموزشی همراه با این مطلب میباشد. پس پیش از خواندن ادامه مطلب، شما را دعوت به مشاهده ویدیوی فوق مینمایم.
فهرست مطالب
سلب مسئولیت
شما با ادامه مطالعه این مطلب، موافقت کامل خود با این توافق نامه را اعلام مینمایید:
تمامی محتویات این وب سایت تحت مجوز (CC BY-SA 3.0) Creative Commons Attribution-ShareAlike 3.0 Unported License منتشر شده است. همچنین، تمامی سورس کدهای منتشر شده در این وب سایت تحت لیسانس MIT License منتشر شده است، مگر آن که به صراحت ذکر شده باشد. تمامی محتویات ارائه شده صرفا جنبه آموزشی و اطلاعاتی داشته و فاقد هرگونه ضمانت، تعهد یا شرایطی از هر نوع می باشد. بایستی توجه نمود که اطلاعات عرضه شده حتی ممکن است دقیق و یا بروز نباشد. هرگونه اطمینان به و یا استفاده از محتویات یا منابع منتشر شده در این وب سایت با مسئولیت مخاطب بوده و نگارنده یا نگارندگان هیچ گونه مسئولیتی در مورد عواقب آن را نخواهند پذیرفت.
قسمت دوم
قسمت سوم
قسمت چهارم
چی؟ این روش در زمان قطعی اینترنت کار میکرد؟

یکی از روشهای دسترسی به اینترنت در خلال قطعی اینترنت در اعتراضات سراسری مردمی و ضدحکومتی آبانماه ۱۳۹۸ ایران
بله، شما میتوانستید در داخل ایران اقدام به خرید یک سرور مجازی در یکی از دیتاسنترهای داخل کشور نمایید. اینترنت آن VPS یا سرور مجازی به شکل فیلتر شده، درست همانند زمانهای عادی، در اختیار شما قرار میگرفت که میتوانستید با تبدیل آن VPS داخلی به پراکسیسرور از طریق آن به سرور ShadowsocksR خود در خارج از کشور وصل شده و از اینترنت بدون فیلترینگ هم بهرهمند شوید. دلیل این امر آن است که به طور معمول بجز شرکتها، سازمانها، بانکها و … عموم مردم از این سرویسها استفاده نمینمایند و اختلال در کار این VPSها یعنی اختلال در کار بخشهای دولتی و کسب و کارهای خصوصی.
در واقع در همان ابتدای امر بسیاری از شرکتهای خصوصی، به همین روش به اینترنت دسترسی پیدا نموده و این پراکسیهای داخلی را در اختیار کارمندان خود قرار میدادند تا از قطعی اینترنت صدمه کمتری ببینند. این موضوع از طریق افرادی که تقاضای سرور ShadowsocksR داشتند به سرعت مورد توجه من قرار گرفت که با اتصال به سرورهای خصوصی ShadowsocksRی که در اختیار این افراد گذاشتم، صحت این موضوع را تایید نمود.
به همین دلیل، برخلاف بسیاری از افراد، معتقدم که قطع نمودن کامل اینترنت به دلیل خسارتهای جبران ناپذیر آن چه در کوتاهمدت چه بلندمدت اگر غیرممکن نباشد بسیار پرهزینه و از لحاظ فنی به طرز دیوانهواری پیچیده است. به عنوان نمونه، چنانچه اتصال اینترنت به خارج از کشور وجود نداشته باشد چگونه میتوان گواهینامههای SSL را تایید نمود؟ تایید محدود گواهینامههای SSL در یک شبکه داخلی کوچک با روشهایی مقدور میباشد، اما نمیتوان یک راهکار همه فن حریف برای تایید گواهینامههای مختلف ابداع نمود. لطفا راجع به ایجاد یک Certificate Authority داخلی صحبت ننمایید که ایجاد آن در این وسعت، آن هم به شکلی امن، بدون در دسترس بودن کافی متخصصان این حوزه، امری دستنیافتنی به نظر میرسد. مگر اینکه حملات Man-in-the-middle به حسابهای بانکی و دادههای حساس امر مهمی تلقی نشود. حتی اگر یک Certificate Authority بومی ایجاد شود، چگونه میتوان ۸۰ میلیون نفر را بدون دانش و تخصص فنی لازمه مجاب به دریافت، نصب و پیکربندی آن در دستگاههای خود اعم از کامپیوتر، لپتاپ و گوشی موبایل نمود؟
ثبت نام و کد هدیه ۲۵ دلاری سرویس UpCloud
به منظور برخورداری از ۲۵ دلار شارژ رایگان، معادل با ۵ ماه اجاره یک سرور مجازی ۵ دلاری (مناسب برای حداقل ۲۰ کاربر) در زمان ثبت نام از کد A5X7BK
استفاده نمایید. به عنوان یک جایگزین با استفاده از این لینک به منظور ثبت نام در سرویس UpCloud به شکل خودکار از هدیه ۲۵ دلاری بهرهمنده شوید. با این هدیه، بسته به میزان مصرف، میتوانید برای تعداد حداقل ۲۰ کاربر به مدت ۵ ماه، و یا ۱۰۰ کاربر به مدت ۱ ماه، VPN کاملا امن رایگان تهیه نمایید.
لطفا توجه داشته باشید که:
- به منظور ثبتنام در این سرویس نیاز به ورود اطلاعات کارت اعتباری خود خواهید داشت.
- در زمان ثبت نام هیچگونه مبلغی از حساب شما کسر نخواهد شد. اما به منظور تایید اطلاعات کارت اعتباری شما یک تراکنش یکدلاری انجام میشود که سریعا به حساب شما بازگردانده خواهد شد.
- پس از ثبت نام، ۲۵ دلار هدیه از سوی UpCloud دریافت خواهید نمود.
- حساب کاربری شما در سرویس UpCloud در حالت آزمایشی یا Trial Mode قرار خواهد گرفت که محدودیتهایی از جمله غیرفعال بودن برخی از گزینهها را در پی خواهد داشت.
- پس از پرداخت حداقل ۱۰ دلار، حساب از حالت Trial Mode یا آزمایشی خارج شده و برای مثال اگر ۱۰ دلار پرداخت نموده باشید حساب شما دارای ۳۵ دلار اعتبار خواهد بود.
- چنانچه ۲۵ دلار هدیه در حالت Trial Mode تمام شود و حساب را پیش از اتمام این مدت شارژ ننمایید، تمام دادههای مربوط به سرورهای مجازی شما از سرویس UpCloud پاک خواهد شد.
- عزیزانی که به دلیل سکونت در داخل ایران از داشتن کارت اعتباری محروم هستند به عنوان راهکار میتوانند از طریق اقوام و آشنایان خود یا از طریق سرویسهای پرداخت آنلاین ارزی اقدام به تهیه این سرویس نمایند.
- در غیر اینصورت میتوانید از سرویس دهندههای داخلی سرور مجازی که کمابیش مکانیزم مشابهی دارند استفاده نمایید. همچنین میتوانید جهت تهیه سرور مجازی با ریال درخواست خود را در میان سرویسدهندگان داخلی به مناقصه بگذارید.
تایید اعمال تنظیمات Reverse DNS Name
در سیستمعامل ویندوز برای IPv4 با ابزار ping
:
> ping -a xxx.xxx.xxx.xxx
ping
:
> ping -6 -a xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
در سیستمعامل ویندوز برای IPv4 با ابزار nslookup
:
> nslookup xxx.xxx.xxx.xxx
nslookup
:
> nslookup xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
در سیستمعاملهای یونیکس و شبهیونیکس نظیر macOS، گنو/لینوکس، *BSD و … برای IPv4 با ابزار host
:
$ host xxx.xxx.xxx.xxx
در سیستمعاملهای یونیکس و شبهیونیکس نظیر macOS، گنو/لینوکس، *BSD و … برای IPv6 با ابزار host
:
$ host xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
در سیستمعاملهای یونیکس و شبهیونیکس برای IPv4 با ابزار dig
:
$ dig +noall +answer +short -x xxx.xxx.xxx.xxx
در سیستمعاملهای یونیکس و شبهیونیکس برای IPv6 با ابزار dig
:
$ dig +noall +answer +short -x xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
در سیستمعاملهای یونیکس و شبهیونیکس برای IPv6 با ابزار drill
:
$ drill -x xxx.xxx.xxx.xxx | grep PTR | tail -r | head -n 1 | cut -d ' ' -f5
drill
:
$ drill -x xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx | grep PTR | tail -r | head -n 1 | cut -d ' ' -f5
ورود به سرور مجازی با استفاده از SSH
اسکریپت ورود خودکار به سرور از طریق پروتکل SSH برای سیستمعامل ویندوز با استفاده از KiTTY:
|
|
لازم به ذکر است که با تغییر kitty.exe
به putty.exe
در اسکریپت فوق میتوان KiTTY را با PuTTY جایگزین نمود.
در سیستمعاملهای یونیکس و شبهیونیکس نظیر macOS، گنو/لینوکس، *BSD و …، و یا سیستمعامل ویندوز با استفاده از مجموعه ابزارهای Git Bash:
$ ssh mamadou@xxx.xxx.xxx.xxx
SSH Tunneling فیلترشکن امن و قابل اتکا، اما کند
جهت انجام تنظیمات Socks5 میتوانید افزونههای FoxyProxy Standard برای مرورگر فایرفاکس و FoxyProxy Standard برای کروم یا کرومیوم را نصب نمایید.
به منظور انجام SSH Tunneling در سیستمعامل ویندوز کافیست مقدار متغیر LOCAL_SOCKS5_PORT
در فایل اسکریپت kitty-ssh.cmd
را تنظیم نموده و اجرا نمایید.
انجام SSH Tunneling در سیستمعامل اندروید امکانپذیر میباشد اما به دلیل نیاز به روت بودن دستگاه و جلوگیری از پیچیدگی مطلب از آن صرفنظر مینماییم.
در سیستمعاملهای یونیکس و شبهیونیکس نظیر macOS، گنو/لینوکس، *BSD و …، و یا سیستمعامل ویندوز با استفاده از مجموعه ابزارهای Git Bash:
$ ssh -D 8080 mamadou@xxx.xxx.xxx.xxx
بروزرسانی سرور به آخرین نسخه FreeBSD
جهت دریافت و نصب آخرین وصلههای امنیتی:
$ freebsd-update fetch install
پس از دریافت و اعمال آخرین وصلههای امنیتی، با یکی از دستورات ذیل، بایستی اقدام به راهاندازی مجدد سرور نمود:
$ shutdown -r now
یا:
$ reboot
پس از راهاندازی مجدد سرور و ورود با SSH، با دستور ذیل میتوان از اعمال موفقیتآمیز بروزرسانی اطمینان حاصل نمود:
$ uname -a
FreeBSD mamadou-vm 12.0-RELEASE-p9 FreeBSD 12.0-RELEASE-p9 GENERIC amd64
در اینجا قسمت -p9
در کنار نسخه FreeBSD یعنی 12.0-RELEASE-p9
حاکی از نسخه آخرین وصله امنیتی نصب شده میباشد. چنانچه مجددا دستور freebsd-update
را اجرا نمایید این ابزار به شما خاطر نشان خواهد شد که بروزرسانی جدیدی وجود ندارد:
$ freebsd-update fetch install
No updates needed to update system to 12.0-RELEASE-p12.
No updates are available to install.
توجه داشته باشید در پارهای از مواقع جهت بروزرسانی موفقیتآمیز، لازم است این دستور چندبار اجرا شود. در اینصورت، این نکته توسط freebsd-update
به شما گوشزد خواهد شد.
چنانچه نیاز به بروزرسانی FreeBSD به نسخه Minor یا Major بعدی باشد، ابزار freebsd-update
شما را با نمایش هشداری مطلع میسازد:
WARNING: FreeBSD 12.0-RELEASE is approaching its End-of-Life date.
It is strongly recommended that you upgrade to a newer
release within the next 2 months.
در اینصورت جهت دریافت بروزرسانی عمده برای مثال به آخرین نسخه FreeBSD در زمان نگارش این مطلب یعنی 12.1-RELEASE
:
$ freebsd-update -r 12.1-RELEASE upgrade
توجه نمایید که دستور فوق، تنها بروزرسانی را دریافت نموده و هنوز آن را اعمال ننموده است. جهت اعمال آن:
$ freebsd-update install
پس از اعمال بروزرسانیها، زمان راهاندازی مجدد سرور فرا رسیده است:
$ shutdown -r now
پس از راهاندازی مجدد، جهت تکمیل پروسه بروزرسانی سیستمعامل، نیار به اجرای مجدد freebsd-update
میباشد:
$ freebsd-update install
پس از هر بروزرسانی به عمده به نسخههای Major و در پاره مواقع Minor نیاز خواهید داشت که بستههای نصب شده را با دستورات ذیل بروزرسانی نمایید. توجه داشته باشید که: ۱. درحال حاضر بدلیل اینکه هیچ بستهای توسط ما نصب نشده است، اجرای این دستورات کاملا غیرضروری است؛ پس میتوان از اجرای آنها صرفنظر نمود. ۲. این دستورالعمل فقط برای مواقعی است که شما صرفا از بستههای به اصطلاح باینری استفاده نمایید؛ برای نرمافزارهایی که از سیستم Ports سفارشیسازی، کامپایل و نصب میشوند بایستی دستورالعمل دیگری را اجرا نمود.
$ pkg-static upgrade -f
$ pkg upgrade
در پایان، جهت حذف فایلهای قدیمی از سرور، نیار به اجرای مجدد freebsd-update
میباشد:
$ freebsd-update install
نکته: به خاطر داشته باشید در صورت مواجهه با مشکل در هر مرحلهای از پروسه بروزرسانی، میتوانید سرور را به نسخه قبلی FreeBSD بازگردانید. اگر همه چیز به خوبی پیش رفته است، دستور ذیل را اجرا ننمایید:
$ freebsd-update rollback
نصب و راهاندازی pkgng
در FreeBSD امکان نصب بستهها به دو صورت باینری و یا سفارشیسازی و کامپایل از سورس وجود دارد. در این سیستمعامل ابزار pkgng
به عنوان Package Manager برای مدیریت بستهها به شکل باینری در دسترس میباشد. این ابزار به صورت پیشفرض در این سیستمعامل تعبیه نشده است. بنابراین جهت نصب آن، دستور ذیل را به عنوان مدیر سیستم صادر نمایید:
$ pkg
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]:
که پس از اجرای آن، FreeBSD از شما خواهد پرسید که آیا تمایل به نصب pkgng
دارید یا خیر.
ویرایشگر متن پیشفرض
ویرایشگر متن پیشفرض در سیستمعامل FreeBSD ویرایشگر nvi
می باشد که با دستور vi
اجرا میشود. این ویرایشگر بصورت پیشفرض در حالتی تحت عنوان Command Mode اجرا میشود که ممکن است برای افرادی که با ویرایشگرهای متنی مانند Notepad آشنایی دارند بسیار عجیب به نظر برسد. هر چند این ویرایشگر در حالت Insert Mode خود، کاملا مانند ویرایشگرهای متنی دیگر نظیر Notepad کار میکند بسیاری از کاربران مبتدی را در ابتدای آشنایی با آن با چالشهای بسیار جدی مواجه میسازد. بعنوان مثال هرکس که این ویرایشگر را بدون آگاهی قبلی یکبار اجرا نموده باشد بخوبی میداند که خروج از آن و بازگشت به محیط خط فرمان برای یک کاربر مبتدی بدون دریافت کمک از یک فرد آشنا به آن، تقریبا غیرممکن است!
نکته: در صورتیکه در این ویرایشگر گیر افتادید، ابتدا کلید ESC
را بفشارید. سپس تایپ نمایید :q!
و کلید Enter
یا Return
را بفشارید.
به هر صورت چنانچه کار با ویرایشگر متنی vi
را دشوار یافتید، به شما ویرایشگر nano
را پیشنهاد مینمایم. برای دریافت و نصب آن دستور ذیل را صادر نمایید:
$ pkg install editors/nano
$ rehash
برخی دستورات مفید این ویرایشگر متنی:
Ctrl + X
: خروج از ویرایشگر؛ چنانچه فایل باز را ذخیر ننموده باشید این ویرایشگر از شما خواهد پرسید که آیا مایل به ذخیره تغییرات ایجاد شده هستید یا خیرCtrl + O
: ذخیره فایل جاریCtrl + R
: باز نمودن یک فایل با تایپ مسیر آنCtrl + W
: جستجو در فایلCtrl + \
: جستجو و جایگزین نمودن یک کلمه یا عبارتCtrl + K
: عمل Cut نمودن متنCtrl + U
: عمل Paste یا UnCut نمودن متنAlt + U
و یا به شکل غیرهمزمانESC
و سپسU
: عمل UndoAlt + E
و یا به شکل غیرهمزمانESC
و سپسE
: عمل RedoCtrl + G
: راهنما
نکته: ویرایشگر nano
بصورت پیشفرض اقدام به شکستن خطوط طولانیتر از عرض صفحه به چندین خط یا به اصطلاح فنی آن اقدام به Wrap نمودن خطوط مینماید (از دو حالت Soft Wrap و Hard Wrap پشتیبانی مینماید). این عمل در هنگام کار با فایلهای تنظیمات FreeBSD یا سایر نرمافزارها بسیار خطرناک میباشد، چرا که باعث ایجاد اختلال در عملکرد آنها میشود. اگر میخواهید این قابلیت را فقط در زمان ویرایش یک فایل بخصوص خاموش نمایید، میتوانید از سوییچ یا پارامتر -w
استفاده نمایید:
$ nano -w /path/to/some/file
درصورت تمایل میتوانید این قابلیت را برای یک کاربر خاص با ویرایش فایل ~/.nanorc
برای آن کاربر و یا بصورت پیشفرض تمامی کاربران سیستم با ویرایش /usr/local/etc/nanorc
و افزودن عبارت ذیل به این فایلها غیرفعال نمایید:
set nowrap
جهت کسب اطلاعات بیشتر راجع به غیرفعال نمودن Text-Wrapping در نانو این مطلب را مطالعه نمایید.
کاربران پیشرفتهتر میتوانند از سایر ویرایشگرهای مورد علاقه خود بهرمنده شوند. برای مثال بشخصه ویرایشگر Neovim را بر هر دو ویرایشگر vi
و nano
ترجیح میدهم:
$ pkg install editors/neovim
$ rehash
اگر قصد استفاده از ویرایشگری غیر از ویرایشگر پیشفرض، یعنی vi
را دارید، بایستی متغیرهای محیطی Shell خود نظیر EDITOR
و VISUAL
را تغییر دهید. FreeBSD بصورت پیشفرض برای کاربر مدیر سیستم یا همان root
از tcsh
و سایر کاربران از sh
که با Bourne shell سازگار میباشد استفاده مینماید. در ادامه به فایلهایی که بدین منظور بایستی ویرایش شوند اشاره خواهیم نمود. چنانچه از Shell دیگری نظیر bash
، zsh
و … استفاده مینمایید بایستی مقادیر این متغیرها را در فایل متناسب با آن تغییر دهید.
برای ویرایشگر nano
مقدار مناسب /usr/local/bin/nano
بوده و برای ویرایشگر Neovim مقدار /usr/local/bin/nvim
میباشد. به عنوان نمونه، جهت تنظیم Neovim به عنوان ویرایشگر پیشفرض سیستم:
setenv EDITOR /usr/local/bin/nvim
set EDITOR=/usr/local/bin/nvim
set VISUAL=/usr/local/bin/nvim
EDITOR=/usr/local/bin/nvim; export EDITOR
در نهایت به عنوان مدیر سیستم فایل /etc/profile
را با ویرایشگر دلخواه پیشفرض تنظیم مینماییم:
EDITOR="/usr/local/bin/nvim"; export EDITOR
سخت نمودن SSH
احتمالا تنها مقداری که نیاز به تنظیم آن در فایل تنظیمات سرور SSH خواهید داشت Port
خواهد بود که در مثال ذیل با مقدار پیشفرض یعنی 22
تنظیم شده است:
Port 22
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
PermitRootLogin no
PasswordAuthentication no
PermitEmptyPasswords no
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com
این تنظیمات را به انتهای فایل کلاینت SSH اضافه نمایید:
HashKnownHosts yes
Host github.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512
Host gitlab.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512
Host *
ConnectTimeout 30
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
ServerAliveInterval 10
ControlMaster auto
ControlPersist yes
ControlPath ~/.ssh/socket-%r@%h:%p
$ service sshd restart
سختتر نمودن SSH ورود با کلید عمومی به جای کلمه عبور
در ویندوز، با استفاده از KiTTY یا PuTTY پس از ورود به سرور:
$ mkdir -p ~/.ssh
سپس در صورت نیاز یک جفت کلید خصوصی و عمومی را با یک رمزگذاری قوی تولید و کلید عمومی را با استفاده از vi
, nano
و یا هر ویرایشگر متنی دیگر به فایل ~/.ssh/authorized_keys
بیافزایید.
در ویندوز میتوانید با استفاده از kittygen.exe
و یا puttygen.exe
این کلیدها را ایجاد نمایید.
در سیستمعاملهای یونیکس یا شبهیونیکس:
$ ssh-keygen -t rsa -b 4096 -C "mamadouinbox@babaei.net"
$ cat ~/.ssh/id_rsa.pub | ssh -p 22 mamadou@xxx.xxx.xxx.xxx 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys'
پس از ورود کلمه عبور به صورت خودکار پوشه و فایل موردنظر برای شما در سرور ایجاد خواهد شد.
پس از انتقال فایل کلید عمومی به سرور میتوان با فعال نمودن این تنظیمات در فایل سرور SSH، ورود با کلمه عبور را جهت افزایش ضریب امنیت کاملا از کار انداخت:
ChallengeResponseAuthentication no
UsePAM no
پس از انجام تغییرات، جهت اعمال آنها سرور SSH را متوقف و مجددا راهاندازی نمایید:
$ service sshd restart
در کلاینتهای یونیکس یا شبهیونیکس و یا GitBash میتوانید با دستور ذیل، غیرفعال شدن ورود از طریق کلمهعبور را تایید نمایید:
$ ssh -p 22 mamadou@xxx.xxx.xxx.xxx -o PubkeyAuthentication=no
mamadou@xxx.xxx.xxx.xxx: Permission denied (publickey).
نکته بسیار مهم: در صورتی که بنا به هر دلیلی از جمله تنظیمات اشتباه، دسترسی شما به سرور از طریق پروتکل SSH قطع شد، نگران نباشید. برخی از سرویسدهندهها نظیر UpCloud، از طرق دیگر نظیر VNC، یا Web Console به شما اجازه دسترسی به خروجی صفحه نمایش سرور مجازیتان را میدهند که در آنجا میتوانید اقدام به بازنشانی تنظیمات صحیح و برقراری مجدد پروتکل SSH نمایید. بسیار مهم است قبل از انجام تغییرات جدی در این نوع دسترسی به سرور از دسترس بودن چنین امکانی مطمئن شوید.
تنظیم DNS Cache با استفاده از سرویس unbound
سرویس unbound
به عنوان یک Local Cache به منظور تسریع پرسوجوهای دامین بکار میرود. بدلیل اینکه سرویس unbound
هنوز به شکل دائمی در سرور فعال نشده است، جهت انجام تنظیمات آنرا یکبار راهاندازی مینماییم. پس از آن اقدام به افزودن DNS Serverهای بسیار سریع و امن Cloudflare جهت حل پرسوجوهای دامنه مینماییم:
$ service local_unbound onestart
$ local-unbound-setup 1.1.1.1 1.0.0.1 2606:4700:4700::1111 2606:4700:4700::1001
اگر دو دستور فوق با موفقیت اجرا شده باشند، اثرات اجرای آنها بایستی در فایلهای /etc/resolv.conf
و /etc/unbound/forward.conf
مشاهده شود:
$ cat /etc/resolv.conf
# Generated by resolvconf
# nameserver 94.237.127.9
# nameserver 94.237.40.9
nameserver 127.0.0.1
options edns0
$ cat /etc/unbound/forward.conf
# This file was generated by local-unbound-setup.
# Modifications will be overwritten.
forward-zone:
name: .
forward-addr: 1.1.1.1
forward-addr: 1.0.0.1
forward-addr: 2606:4700:4700::1111
forward-addr: 2606:4700:4700::1001
به جهت جلوگیری از رونویسی تنظیمات توسط سایر سرویسهای شبکه نظیر DHCP، با تنظیم Flagهای مربوطه، هر دو فایل به معنای واقعی کلمه فقط خواندنی مینماییم؛ به صورتی که حتی کاربر مدیر سیستم یعنی root
توان پاک نمودن یا تغییر آنها را نداشته باشد:
$ chflags schg /etc/resolv.conf
$ chflags schg /etc/unbound/forward.conf
پس از تنظیم Flagهای مربوطه میتوانید صحت این موضوع را آزمایش نمایید:
$ rm -f /etc/resolv.conf
$ cat /etc/resolv.conf
$ rm -f /etc/unbound/forward.conf
$ cat /etc/unbound/forward.conf
درصورتی که بنا به هر دلیلی پشیمان شدید یا نیاز به تغییر یا حذف این فایلها داشتید، میتوانید با دستورات ذیل هر دو فایل را به حالت نرمال برگردانید، در غیر اینصورت از اجرای دستورات ذیل خودداری کنید به این دلیل که در راهاندازی مجدد سرور ممکن است در دسترسی به شبکه بر روی آن با اختلال مواجه شوید:
$ chflags noschg /etc/resolv.conf
$ chflags noschg /etc/unbound/forward.conf
تنظیمات عمومی
زمان انجام تنظیمات عمومی سرور فرا رسیده است. احتمالا در فایل ذیل که فایل اصلی تنظیمات سیستمعامل FreeBSD میباشد نیاز داشته باشید که محتوای متغیر hostname
را تغییر دهید:
# keymap
keymap="us"
# crash dumps
# Set dumpdev to "AUTO" to enable crash dumps, "NO" to disable
dumpdev="NO"
# cpu freq. scaling
powerd_enable="NO"
# ps2 mouse on console
moused_enable="NO"
# sendmail
sendmail_enable="NONE"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
# ftpd
ftpd_enable="NO"
# auto /tmp clean-up
clear_tmp_enable="YES"
clear_tmp_X="YES"
# remote host logging
syslogd_flags="-ss"
# hostname
hostname="mamadou-vps"
# local_unbound
local_unbound_enable="YES"
# networking
ifconfig_vtnet0="DHCP"
ifconfig_vtnet1="DHCP"
ifconfig_vtnet2_ipv6="inet6 accept_rtadv"
rtsold_enable="YES"
# ntpd
ntpd_enable="YES"
ntpd_sync_on_start="YES"
# sshd
sshd_enable="YES"
توجه داشتبه باشید که برخلاف رفتار سنتی گنو/لینوکس که فارغ از سازنده یا نوع درایور کارت شبکه آنرا eth0
,eth1
, eth2
و … نامگذاری مینماید، در FreeBSD نام دستگاه کارت شبکه بر اساس نوع درایور تعیین میشود. برای مثال در سرور مجازی ما در UpCloud نام کارتهای شبکه vtnet0
,vtnet1
, vtnet2
تعیین شده است. به منظور اطلاع از نام کارت شبکه خود در این سیستمعامل دستور ifconfig
را اجرا نموده سپس تنظیمات مربوط به شبکه در فایل فوق را متناسب با آن ویرایش نمایید:
$ ifconfig
vtnet0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=6c07bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,TSO6,LRO,VLAN_HWTSO,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
ether 1e:ce:74:5e:41:7c
inet 94.237.60.78 netmask 0xfffffc00 broadcast 94.237.63.255
media: Ethernet 10Gbase-T <full-duplex>
status: active
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
vtnet1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=6c07bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,TSO6,LRO,VLAN_HWTSO,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
ether 1e:ce:74:5e:d8:c7
inet 10.2.7.144 netmask 0xfffffc00 broadcast 10.2.7.255
media: Ethernet 10Gbase-T <full-duplex>
status: active
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
vtnet2: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=6c07bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,TSO6,LRO,VLAN_HWTSO,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
ether 1e:ce:74:5e:7f:d5
inet6 fe80::1cce:74ff:fe5e:7fd5%vtnet2 prefixlen 64 scopeid 0x3
inet6 2a04:3541:1000:500:1cce:74ff:fe5e:7fd5 prefixlen 64 autoconf
media: Ethernet 10Gbase-T <full-duplex>
status: active
nd6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x4
inet 127.0.0.1 netmask 0xff000000
groups: lo
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
توجه داشته باشید که کارت شبکه چهارم در خروجی نمونه فوق، کارت شبکه به اصطلاح Loopback میباشد که مفهومی رایج در تمامی سیستمعاملهای مدرن مجهز به کارت شبکه میباشد. این کارت شبکه مجازی به منظور تعیین آدرس localhost
یا همان 127.0.0.1
در IPv4 و ::1
در IPv6 کاربرد دارد و به صورت خودکار تنظیم میشود. بنابراین نیازی به انجام تنظیمات در فایل /etc/rc.conf
ندارد.
همانطور که احتمالا تاکنون متوجه شدهاید، در فایل /etc/rc.conf
برخی سرویسهای موجود در سیستمعامل FreeBSD، بنا به این دلیل که اولا در یک سرور مختص VPN بدانها نیاز نداریم و دوما به دلایل امنیتی (اجرا شدن کد کمتر یعنی آسیبپذیری کمتر) غیرفعال شدهاند.
فایل /etc/sysctl.conf
به منظور انجام تنظیمات کرنل یا هسته سیستمعامل بکار میرود:
# coredump
kern.coredump=0
تنظیماتی که در این فایل انجام میشوند تا راهاندازی مجدد سرور اعمال نمیشوند. بنابراین جهت اعمال آنی این تنظیمات از دستور sysctl
استفاده مینماییم که تا پیش از راهاندازی مجدد سرور یا اجرای مجدد این دستور، مقدار مورد نظر ما را بر روی متغیرهای کرنل اعمال میسازد. با راهاندازی مجدد سرور تنظیمات از فایل /etc/rc.conf
اعمال خواهند شد:
$ sysctl kern.coredump=0
kern.coredump: 1 -> 0
جهت اعمال تنظیمات شبکه و نام سرور که در فایل /etc/rc.conf
انجام شد دستورات ذیل را اجرا خواهیم نمود. دقت نمایید که این دستورات را از طریق نشست SSH اجرا ننمایید چرا که به یقین باعث قطع دسترسی به سرور خواهد شد. میتوانید پس از اطمینان از صحیح بودن تنظیمات شبکه سرور مجازی را راهاندازی مجدد نمایید و یا این دستورات را از طریق VNC یا Web Console اجرا نمایید:
$ service netif restart
$ service routing restart
$ service hostname restart
پس از اعمال تنظیمات IPv4 و IPv6 جهت آزمایش در دسترس بودن سرور دستورات ذیل را اجرا نمایید:
> ping xxx.xxx.xxx.xxx
> ping -6 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
$ ping xxx.xxx.xxx.xxx
$ ping6 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
چنانچه شبکهای که در آن هستید امکان استفاده از IPv6 را ندارد و یا تنظیمات IPv6 در کامیپوتر شما انجام نشده است میتوانید در دسترس بودن سرور از طریق IPv6 را از روی خود سرور آزمایش نمایید:
$ ping6 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
سختتر نمودن FreeBSD
برخی از تنظیمات کرنل فقط در زمان بوت شدن کرنل امکان تنظیم دارند. این تنظیمات بایستی در فایل /boot/loader.conf
اعمال شوند.
# hardening
security.bsd.allow_destructive_dtrace=0
مابقی تنظیمات سختسازی FreeBSD در فایل /etc/sysctl.conf
انجام و از طریق sysctl
اعمال میشوند:
# hardening
security.bsd.see_other_uids=0
security.bsd.see_other_gids=0
security.bsd.see_jail_proc=0
security.bsd.unprivileged_read_msgbuf=0
security.bsd.unprivileged_proc_debug=0
kern.randompid=1
security.bsd.stack_guard_page=1
$ sysctl security.bsd.see_other_uids=0
security.bsd.see_other_uids: 1 -> 0
$ sysctl security.bsd.see_other_gids=0
security.bsd.see_other_gids: 1 -> 0
$ sysctl security.bsd.see_jail_proc=0
security.bsd.see_jail_proc: 1 -> 0
$ sysctl security.bsd.unprivileged_read_msgbuf=0
security.bsd.unprivileged_read_msgbuf: 1 -> 0
$ sysctl security.bsd.unprivileged_proc_debug=0
security.bsd.unprivileged_proc_debug: 1 -> 0
$ sysctl kern.randompid=1
kern.randompid: 0 -> 563
$ sysctl security.bsd.stack_guard_page=1
security.bsd.stack_guard_page: 1 -> 1
سختتر نمودن سیستم در مقابل حملات Denial of Service
علیرغم اینکه به نظر میرسد net.inet.tcp.syncookies
بصورت پیشفرض روشن میباشد، با فعالسازی صریح آن از طریق /etc/sysctl.conf
از فعال ماندن آن تحت هر شرایطی اطمینان حاصل مینماییم. این ویژگی به منظور مقابله با حملات انکار سرویس یا DoS در نظر گرفته شده است:
# SYN flood DoS attack protection
net.inet.tcp.syncookies=1
$ sysctl net.inet.tcp.syncookies=1
net.inet.tcp.syncookies: 1 -> 1
فعالسازی و تنظیم دیوار آتش
فریبیاسدی دارای سه فایروال است که بصورت پیشفرض در Base System آن تعبیه شده و در دسترس میباشند: PF, IPFW و IPFILTER که به عنوان IPF نیز شناخته می شود. بدلیل سادگی استفاده و در عینحال کارآمد بودن در این مطلب از IPFW به عنوان Firewall یا دیوار آتش استفاده مینماییم. به منظور سادهسازی حداکثری و مدیریت سادهتر فایروال از طریق فایل /etc/rc.conf
اسکریپت ذیل را به سیستم اضافه مینماییم:
#!/usr/bin/env sh
# (The MIT License)
#
# Copyright (c) 2015 - 2019 Mamadou Babaei
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
. /etc/rc.subr
load_rc_config firewall
fw_add="/sbin/ipfw -q add"
if [ -z "${firewall_myservices_rules_id_start}" ] ;
then
firewall_myservices_rules_id_start=56000
fi
if [ -z "${firewall_myservices_rules_id_step}" ] ;
then
firewall_myservices_rules_id_step=10
fi
case ${1} in
quietstart)
rule_id=${firewall_myservices_rules_id_start}
for i in ${firewall_allowservices} ;
do
for j in ${firewall_myservices_tcp} ;
do
${fw_add} ${rule_id} pass tcp from ${i} to me ${j}
rule_id=`expr $rule_id + ${firewall_myservices_rules_id_step}`
done
done
for i in ${firewall_allowservices} ;
do
for j in ${firewall_myservices_udp} ;
do
${fw_add} ${rule_id} pass udp from ${i} to me ${j}
rule_id=`expr $rule_id + ${firewall_myservices_rules_id_step}`
done
done
;;
quietstop)
;;
*)
echo "Error: unknown parameter '${1}'"
;;
esac
پس از ایجاد اسکریپت سطوح دسترسی لازمه جهت اجرای آن را تنظیم مینماییم:
$ chmod u-w,ugo+x /usr/local/etc/rc.firewall
زمان تنظیم فایروال فرا رسیده است. اسکریپت فوق با توجه به تنظیمات ذیل به صورت پیشفرض تمامی پورتهای سرور را بلاک خواهد نمود و در نتیجه راه نفوذ به آنها بسته خواهد شد؛ مگر پورتهایی که در قسمتهای firewall_myservices_tcp
و firewall_myservices_udp
تعیین شدهاند:
# ipfw
firewall_enable="YES"
firewall_quiet="YES"
firewall_type="workstation"
firewall_allowservices="any"
firewall_logdeny="YES"
firewall_coscripts="/usr/local/etc/rc.firewall"
firewall_myservices_rules_id_start="56000"
firewall_myservices_rules_id_step="10"
firewall_myservices_tcp="ssh https"
firewall_myservices_udp="https"
در تنظیمات فوق، پورت ssh (پورت شماره ۲۲) را برای پروتکل TCP و https (پورت شماره ۴۴۳) را برای هر دو پروتکل TCP و UDP باز نمودهایم. در این قسمت میتوانید پورتها را یا با شماره و یا با نام شناخته شده و استاندارد آنها باز نمایید. برای مثال میتوان تنظیمات فوق را بدین شکل نوشت:
firewall_myservices_tcp="22 443"
firewall_myservices_udp="443"
و یا حتی ترکیبی از هر دو حالت:
firewall_myservices_tcp="143 1441 2020 domain http https imaps pop3s smtp smtps"
firewall_myservices_udp="143 2020 domain"
اگر پورت SSH را قبلا به پورتی غیر از ۲۲
تغییر دادهاید مشخصا اینجا دیگر نمیتوانید با نام آن پورت را باز نمایید و لازم است شماره پورت را جهت باز نمودن آن ذکر نمایید. علاوه برآن ما قصد داریم ترافیک فیلترشکن ShadowsocksR را از طریق پورت ۴۴۳
یا همان پورت استاندارد https رد و بدل نماییم، پس بایستی آن را برای هر دو پروتکل TCP و UDP باز نماییم. به همین دلیل در تنظیمات فوق علاوه بر پورت SSH، این پورت را باز نمودهایم.
اما جهت پیبردن به اینکه کدام پورتها چه نامی دارند و یا هر سرویس به شکل استاندارد از چه پورت استفاده مینماید، برای مثال میتوانید از دستوراتی مشابه آنچه که در ادامه میآید استفاده نمایید:
$ cat /etc/services | grep 'domain'
domain 53/tcp #Domain Name Server
domain 53/udp #Domain Name Server
$ cat /etc/services | grep '143'
imap 143/tcp imap2 imap4 #Interim Mail Access Protocol v2
imap 143/udp imap2 imap4 #Interim Mail Access Protocol v2
جهت انجام تنظیمات Logging فایروال IPFW در کرنل:
# ipfw
net.inet.ip.fw.verbose_limit=5
از آنجایی که IPFW هنوز راهاندازی نشده است ابتدا سرویس آنرا راهاندازی و سپس تنظیمات مربوط به Logging فایروال IPFW در کرنل را اعمال مینماییم:
$ service ipfw start
$ sysctl net.inet.ip.fw.verbose_limit=5
net.inet.ip.fw.verbose_limit: 0 -> 5
جهت کسب اطلاعات بیشتر راجع به IPFW این مطلب را مطالعه نمایید.
فعالسازی و تنظیم سیستم تشخیص و پیشگیری از نفوذ SSHGuard
سرویس SSHGuard یک IDPS (Intrusion Detection and Prevention System) یا سیستم تشخیص و پیشگیری از نفوذ میباشد که می تواند پیام های ورود به سیستم را زیر نظرگرفته و برای الگوهای شناخته شده تجزیه و تحلیل نماید؛ این سیستم میتواند در صورت شناسایی یک حمله، مانند چندین سعی در ورود ناموفق در فاصله زمانی کوتاه، آن آدرس IP متخلف را از طریق فایروال موجود در سیستم مسدود نماید. این امکان وجود دارد که متخلفان پس از یک بازه زمانی از حالت مسدود خارج شوند، اما می توان در صورت سعی مجدد، با استفاده از گزینه لیست سیاه، برای مدت طولانیتری این متخلفین را مسدود نمود. با کمک این سرویس نفوذ به سیستم از طریق حملات جستجوی فراگیر یا Brute-force کاملا غیرممکن میشود.
به منظور نصب SSHGuard:
$ pkg install security/sshguard
$ rehash
انجام تنظیمات SSHGuard در فایل اصلی تنظیمات فریبیاسدی /etc/rc.conf
:
# sshgaurd
sshguard_enable="YES"
sshguard_pidfile="/var/run/sshguard.pid"
sshguard_watch_logs="/var/log/auth.log:/var/log/maillog"
sshguard_blacklist="30:/var/db/sshguard/blacklist.db"
sshguard_sshguard_danger_thresh="30"
sshguard_release_interval="120"
sshguard_reset_interval="1800"
sshguard_whitelistfile="/usr/local/etc/sshguard.whitelist"
sshguard_flags=""
راهاندازی سرویس SSHGuard:
$ service sshguard start
نکتهای که ذکر آن حائز اهمیت به نظر میرسد این است که در FreeBSD امکان استفاده و پیکربندی سایر نرمافزارهای IDS (Intrusion Detection System) و IPS (Intrusion Prevention System) نظیر security/ossec-hids-local
, security/suricata
, security/snort
, security/chkrootkit
, security/revealrk
, security/rkhunter
و … به منظور افزایش حداکثری ضریب امنیت وجود دارد و امکان نصب و پیکربندی آنها در این مطلب وجود داشت، اما برای کاربرد در سرور مدنظر ما که کاربردش تنها یک سرویس VPN و سرور SSH میباشد، کمی بیش از حد به نظر میرسد. لذا در اینجا به ذکر نام آنها بسنده مینمایم.
جهت اطلاعات بیشتر راجع به SSHGuard این مطلب را مطالعه نمایید.
فعال سازی TCP Fast Open
ویژگی TCP Fast Open (TFO)، افزونه ای بر روی پروتکل کنترل انتقال یا همان TCP میباشد که با فعال نمودن تبادل داده ها در طی TCP SYN اولیه توسط فرستنده درخواست، باعث کاهش تأخیر شبکه و در نتیجه افزایش کارایی و سرعت میشود.
به منظور فعال نمودن این ویژگی تنظیمات ذیل را به فایل تنظیمات کرنل بیافزایید:
# tcp fast open (TFO)
net.inet.tcp.fastopen.client_enable=1
net.inet.tcp.fastopen.server_enable=1
جهت فعال نمودن آنی TCP Fast Open:
$ sysctl net.inet.tcp.fastopen.client_enable=1
net.inet.tcp.fastopen.client_enable: 1 -> 1
$ sysctl net.inet.tcp.fastopen.server_enable=1
net.inet.tcp.fastopen.server_enable: 0 -> 1
بهینهسازی و تنظیم محدودیت های هسته سیستمعامل
نگاهی به برخی محدودیتهای هسته سیستمعامل مشخص میسازد که مقادیر پیشفرض آنها بسیار کمتر از مقادیر موردنیاز ShadowsocksR جهت کارکرد بهینه میباشد:
$ ulimit -a
cpu time (seconds, -t) unlimited
file size (512-blocks, -f) unlimited
data seg size (kbytes, -d) 33554432
stack size (kbytes, -s) 524288
core file size (512-blocks, -c) unlimited
max memory size (kbytes, -m) unlimited
locked memory (kbytes, -l) unlimited
max user processes (-u) 5734
open files (-n) 28377
virtual mem size (kbytes, -v) unlimited
swap limit (kbytes, -w) unlimited
socket buffer size (bytes, -b) unlimited
pseudo-terminals (-p) unlimited
kqueues (-k) unlimited
umtx shared locks (-o) unlimited
$ ulimit -n
28377
$ ulimit -Hn
28377
$ ulimit -Sn
28377
جهت افزایش این مقادیر بایستی این مقادیر را در زمان بوت کرنل تعیین نمود، لذا این مقادیر را از طریق فایل /boot/loader.conf
تعیین مینماییم (توجه داشته باشید تنها زمانی اقدام به تغییر این مقدار نمایید که میزان آن کمتر از مقدار موردنظر ما میباشد):
# kernel limits
kern.maxfiles="51200"
kern.maxfilesperproc="51200"
جهت اعمال این تغییرات نیاز به راهاندازی مجدد سرور خواهد بود:
$ reboot
پس از راهاندازی مجدد سرور، جهت تایید اعمال تنظیمات:
$ ulimit -a
cpu time (seconds, -t) unlimited
file size (512-blocks, -f) unlimited
data seg size (kbytes, -d) 33554432
stack size (kbytes, -s) 524288
core file size (512-blocks, -c) unlimited
max memory size (kbytes, -m) unlimited
locked memory (kbytes, -l) unlimited
max user processes (-u) 5734
open files (-n) 51200
virtual mem size (kbytes, -v) unlimited
swap limit (kbytes, -w) unlimited
socket buffer size (bytes, -b) unlimited
pseudo-terminals (-p) unlimited
kqueues (-k) unlimited
umtx shared locks (-o) unlimited
$ ulimit -n
51200
$ ulimit -Hn
51200
$ ulimit -Sn
51200
نصب پیشنیازهای دریافت و اجرای ShadowsocksR
پیش از دریافت و اجرای ShadowsocksR در سرور، بایستی نیازمندیهای دریافت و اجرای آن را فراهم نمود:
$ pkg install \
security/ca_root_nss \
devel/git \
dns/c-ares \
devel/libev \
devel/py-typing \
devel/py-typing-extensions \
lang/python \
math/py-pybloom \
security/libsodium \
security/py-m2crypto \
security/mbedtls
$ rehash
جهت پاکسازی حافظه ذخیرهسازی سرور میتوانید مقداری از فضای اشغال شده توسط فایلهای نصب این بستهها یا بستههای احتمالی که دیگر نیازمند حضور آنها در سیستم نمیباشیم را پاکسازی نمود:
$ pkg autoremove
$ rm -f /var/cache/pkg/*
دریافت و پیکربندی ShadowsocksR
جهت دریافت و پیکربندی اولیه ShadowsocksR دستورات ذیل را اجرا نمایید:
$ cd /usr/local/
$ git clone https://github.com/shadowsocksrr/shadowsocksr.git
$ cd shadowsocksr
$ sh initcfg.sh
به منظور پیکربندی سرور ShadowsocksR، تنظیمات فایل نمونه /usr/local/shadowsocksr/config.json
را با تنظیمات بهینه ذیل جایگزین نمایید. بدیهی است که به جای xxx.xxx.xxx.xxx
بایستی IPv4 سرور و به جای xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
بایستی IPv6 سرور جایگزین شود:
{
"server": "xxx.xxx.xxx.xxx",
"server_ipv6": "xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx",
"server_port": 443,
"local_address": "127.0.0.1",
"local_port": 1443,
"password": "#IranProtests",
"method": "chacha20",
"protocol": "auth_sha1_v4_compatible",
"protocol_param": "",
"obfs": "http_simple_compatible",
"obfs_param": "",
"speed_limit_per_con": 0,
"speed_limit_per_user": 0,
"additional_ports" : {}, // only works under multi-user mode
"additional_ports_only" : false, // only works under multi-user mode
"timeout": 120,
"udp_timeout": 60,
"dns_ipv6": true,
"connect_verbose_info": 0,
"redirect": "",
"fast_open": true
}
همانطور که قبلا در بخش پیکربندی فایروال ذکر شد پورت ۴۴۳
را به منظور رد و بدل ترافیک مبهمسازی شده ShadowsocksR استفاده نمودهایم. بدیهی است که اگر پورت دیگری مدنظر شما میباشد، علاوه بر تغییر آن در این مرحله نیاز است که تنظیمات مربوط به باز نمودن آن پورت در بخش تنظیم فایروال نیز باید انجام شود.
همانطور که در کامنتهای موجود در فایل فوق دیده میشود امکان ایجاد پسوردهای مختلف بر روی پورتهای مختلف برای کاربران مختلف وجود دارد که بدلیل حفظ سادگی مطلب ما به حالت تککاربره بسنده نمودهایم. شما میتوانید کلمه عبور حالت تککاربره را بدون هیچ محدودیتی بصورت همزمان در اختیار کاربران متعدد قرار دهید. حالت چندکاربره تنها به منظور مانیتورینگ لاگ استفاده کاربران مختلف سودمند خواهد بود. در غیر اینصورت هیچ تفاوتی میان حالت چندکاربره و تککاربره وجود ندارد.
بدلیل وجود داده حساسی مانند کلمه عبور در این فایل سطوح دسترسی را تنها به خواندن فایل توسط کاربر مدیر یا root
تقلیل خواهیم داد:
$ chmod 400 /usr/local/shadowsocksr/config.json
جهت راهاندازی و اجرای سرور ShadowsocksR بصورت خودکار در هربار راهاندازی سیستم یک فایل اسکریپت با محتوای ذیل را ایجاد مینماییم:
#!/bin/sh
cd /usr/local/shadowsocksr/shadowsocks && python ./server.py -c ../config.json &
سپس سطح دسترسی اجرا برای تمامی کاربران سیستم را بر روی آن اعمال مینماییم:
chmod a+x /usr/local/shadowsocksr/cron.sh
وقت تنظیم و راهاندازی اصولی سیستم اجرای وظایف FreeBSD که با نام Cron شناخته میشود فرا رسیده است. جهت تنظیم آن و همچنین اجرا نمودن اسکریپت راهاندازی ShadowsocksR، محتوای ذیل را پس از اجرای دستور crontab
برای کاربر root
به Cron بیافزایید:
$ crontab -e -u root
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
MAILTO=""
# shadowsocksr
@reboot /usr/local/shadowsocksr/cron.sh
پس از ذخیره فایل crontab
برای کاربر root
از درست بودن محتویات آن مطمئن شوید:
$ crontab -l -u root
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
MAILTO=""
# shadowsocksr
@reboot /usr/local/shadowsocksr/cron.sh
وقت آزمایش تنظیمات و اسکریپت راهاندازی ShadowsocksR فرا رسیده است. میتوانید بصورت دستی فایل اسکریپت را پیش از راهاندازی مجدد سیستم اجرا نمایید:
$ /usr/local/shadowsocksr/cron.sh
تبریک! اگر همه چیز تا بدین جای کار خوب پیشرفته باشد، سرور VPN شما آماده است! حالا میتوانید با یکی از کلاینتهای ShadowsocksR به سرور متصل شوید و لاگ خروجی ShadowsocksR را کنترل نمایید تا ببیند همه چیز به خوبی کار میکند یا خیر. در صورتی که همه چیز موفقیتآمیر بود میتوانید سرور را مجددا راهاندازی نمایید تا از صحت کارکرد crontab
مطمئن شوید:
$ reboot
جهت کسب اطلاعات بیشتر راجع به crontab این مطلب را مطالعه نمایید.
بروز نگه داشتن سرور
بروزرسانی سرور VPN به منظور مقابله با آسیبپذیریهای احتمالی آینده امری اجتناب ناپذیر در هر سیستمعاملی است. این امر برای چیدمان سرور VPN ما شامل ۳ مرحله میباشد:
۱. بروزرسانی منظم FreeBSD با وصلههای امنیتی
۲. بروزرسانی بستههای نصب شده در سیستمعامل توسط ما با ابزار pkgng
۳. بروزرسانی ShadowsocksR
بدیهی است که نسخههای کلاینت ShadowsocksR که بر روی دستگاه کامپیوتر، لپتاپ، و یا موبایل شما نصب میشوند نیز به طور منظم و مرتب نیازمند بروزرسانی میباشند.
از طریق ابزار crontab
می توان بصورت خودکار و به شکل روزانه بروزرسانیها و وصلههای امنیتی FreeBSD را دریافت نمود:
# fetch and notify root for system's security patches
@daily root /usr/sbin/freebsd-update cron
پس از ذخیره به منظور بررسی محتویات crontab
:
$ crontab -l -u root
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
MAILTO=""
# shadowsocksr
@reboot /usr/local/shadowsocksr/cron.sh
# fetch and notify root for system's security patches
@daily root /usr/sbin/freebsd-update cron
از این پس، اگر وصلهای وجود داشته باشد، بطور خودکار دریافت خواهد شد اما این وصله به صورت خودکار اعمال نخواهد شد. پس از ورود کاربر root
به سیستم از سوی سیستمعامل پیامی به وی ارسال میشود، که با اجرای دستور mail
قابل خواندن خواهد بود:
$ mail
در صورت تمایل کاربر root
میتواند با اجرای دستور freebsd-update
اقدام به نصب و اعمال وصله امنیتی نماید:
$ freebsd-update install
به منظور بررسی آسیبپذیری بستههای نصب شده، ابزار pkgng
به ابزاری با نام audit
مجهز شده است. در زمان اولین اجرای ابزار audit
با یک پیام خطا برخورد خواهید نمود که با افزودن سوییچ -F
این مشکل مرتفع خواهد شد:
$ pkg audit
pkg: vulnxml file (null) does not exist. Try running 'pkg audit -F' first
$ pkg audit -F
Fetching vuln.xml.bz2: 100% 821 KiB 841.0kB/s 00:01
0 problem(s) in 0 installed package(s) found.
پس از اجرا نمودن دورهای و منظم ابزار audit
چنانچه آسیبپذیری در بستههای نصب شده سیستم وجود داشته باشد به شما اطلاع داده خواهد شد، در غیر اینصورت هیچ مشکلی گزارش نخواهد شد:
$ pkg audit
0 problem(s) in 0 installed package(s) found.
در صورت گزارش آسیبپذیری توسط ابزار audit
، توصیه میشود هرچه سریعتر بستههای سیستم را با اجرای دستورات ذیل بروزرسانی نمایید:
$ pkg update
$ pkg upgrade
به منظور بروزرسانی نسخه سرور ShadowsocksR میتوانید بصورت منظم و دورهای دستورات ذیل را اجرا نمایید:
$ cd /usr/local/shadowsocksr
$ git pull
نصب کلاینت در Microsoft Windows
در سیستمعامل Windows میتوانید shadowsocksrr/shadowsocksr-csharp را نصب و پیکربندی نمایید. پس از گشودن فایل فشرده این نرمافزار با دو فایل اجرایی مواجه خواهید شد که هر دوی آنها یک نرمافزار یکسان میباشند و در کارایی تفاوتی ندارند. تنها تفاوت این دو نرمافزار این است که یکی از آنها جهت اجرا شدن نیازمند نصب Microsoft .Net Framework 2.0 و دیگری نیازمند نصب Microsoft .Net Framework 4.0 میباشد.
نصب کلاینت در Android
در سیستمعامل Android میتوانید shadowsocksrr/shadowsocksr-android را نصب و پیکربندی نمایید.
نصب کلاینت در iOS
در سیستمعامل iOS میتوانید اپلیکیشن Potatso Lite را نصب و پیکربندی نمایید که به خوبی از ShadowsocksR پشتیبانی نموده و با آن سازگار میباشد.
نصب کلاینت در macOS
در سیستمعامل macOS میتوانید ShadowsocksR-Live/ssrMac را نصب و پیکربندی نمایید.
نصب کلاینت در GNU/Linux یا سایر سیستمعاملهای یونیکس یا شبهیونیکس و تنظیم آن
نصب و پیگربندی نسخه کلاینت ShadowsocksR در این گونه از سیستمعاملها بسیار به نسخه سرور شبیه میباشد. در واقع همان نسخهای از ShadowsocksR که در سرور نصب شده است را دریافت مینماییم (بدیهی است که مانند FreeBSD پیشنیازهای دریافت و اجرای آن بایستی پیش از این مرحله در سیستم نصب شده باشد):
$ cd /opt/
$ sudo git clone https://github.com/shadowsocksrr/shadowsocksr.git
همانطور که مشاهده مینمایید، فایل تنظیمات کلاینت دقیقا با فایل نسخه سرور در FreeBSD یکسان میباشد:
{
"server": "xxx.xxx.xxx.xxx",
"server_ipv6": "xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx",
"server_port": 443,
"local_address": "127.0.0.1",
"local_port": 1443,
"password": "#IranProtests",
"method": "chacha20",
"protocol": "auth_sha1_v4_compatible",
"protocol_param": "",
"obfs": "http_simple_compatible",
"obfs_param": "",
"speed_limit_per_con": 0,
"speed_limit_per_user": 0,
"additional_ports" : {}, // only works under multi-user mode
"additional_ports_only" : false, // only works under multi-user mode
"timeout": 120,
"udp_timeout": 60,
"dns_ipv6": true,
"connect_verbose_info": 0,
"redirect": "",
"fast_open": true
}
درست مانند نسخه FreeBSD، بدلیل وجود اطلاعات حساسی مانند پسورد در این فایل، سطوح دسترسی را طوری تنظیم مینماییم که تنها کاربر root
توانایی خواندن آنرا داشته باشد:
$ sudo chmod 0400 /opt/shadowsocksr/shadowsocks/shadowsocks-1443.json
در سیستمعامل Gentoo، به منظور اجرای ShadowsocksR در زمان بوت سیستم و اتصال خودکار به سرور VPN، کافیست فایل ذیل را در سیستمتان ایجاد نمایید:
#!/bin/sh
cd /opt/shadowsocksr/shadowsocks && python ./local.py -c ./shadowsocks-1443.json &
در غیر اینصورت میتوانید اجرای خودکار ShadowsocksR را درست مانند نسخه FreeBSD از crontab
کنترل نمایید.
به منظور رد و بدل ترافیک نرمافزارهای غیرگرافیکی تحت خط فرمان یا نرمافزارهای گرافیکی و غیرگرافیکی که امکان تنظیم پراکسی SOCKS5 را ندارند، میتوانید ابزار proxychains
و یا proxychains-ng
را در کنار ShadowsocksR در سیستمعامل خود نصب نمایید. سپس با اعمال تنظیمات ذیل امکان استفاده این گونه از نرمافزارها از ShadowsocksR را فراهم مینمایید:
strict_chain
quiet_mode
proxy_dns
tcp_read_time_out 15000
tcp_connect_time_out 8000
[ProxyList]
socks5 127.0.0.1 1443
برای نمونه چنانچه میخواهید نرمافزار دانلود منیجر aria2c
فایلی را از طریق این فیلتر شکن دریافت نماید:
$ aria2c -s16 -x16 https://download.freebsd.org/ftp/releases/amd64/amd64/ISO-IMAGES/12.1/FreeBSD-12.1-RELEASE-amd64-memstick.img
$ proxychains aria2c -s16 -x16 https://download.freebsd.org/ftp/releases/amd64/amd64/ISO-IMAGES/12.1/FreeBSD-12.1-RELEASE-amd64-memstick.img
همانطور که حدس زدهاید، از این پس به منظور بهرهمندی از ShadowsocksR، تنها کافیست proxychains
را پیش از هر دستوری در خط فرمان اضافه نمایید.
نکته: proxychains
به ترتیب زیر فایل تنظیمات را جستجو مینماید:
۱. فایل مشخص شده در متغیر محیطی PROXYCHAINS_CONF_FILE
یا پارامتر مشخص شده برای سوییچ -f
۲. در مسیر جاری ./proxychains.conf
۳. در مسیر $(HOME)/.proxychains/proxychains.conf
۴. در مسیر $(sysconfdir)/proxychains.conf
؛ برای مثال در عمده توزیعهای گنو/لینوکس /etc/proxychains.conf
و در فریبیاسدی /usr/local/etc/proxychains.conf
مراقب رخنه امنیتی WebRTC Leak Test باشید!
با دریافت افزونههای uBlock Origin برای Firefox و یا uBlock Origin برای Chrome و Chromium و افزونههای مشابه برای سایر مرورگرها و تنظیم و تست آنها از حریم خصوصی خود مراقبت نمایید.
باز هم امنیت بیشتر
بدلیل ساده و کوتاهتر نگهداشتن مطلب، از توضیح برخی از بهترین تمرینهای امنیت در این مطلب جلوگیری نمودم. برای مثال جهت افزایش امنیت میتوان ShadowsocksR را توسط کاربری محدود با دسترسیهای بسیار کمتر از کاربر root
اجرا نمود تا در صورت نفوذ احتمالی به سیستم از طریق خرابکاری یا آسیبپذیری امنیتی احتمالی در ShadowsocksR، نفوذگر احتمالی دسترسی حداکثری به سیستم را بدست نیاورد. و یا حتی بهتر از آن، ShadowsocksR را در سیستمی مختص FreeBSD با نام Jails که ایده Docker در لینوکس از آن گرفته شده است، بصورت ایزوله اجرا نمود. اگر به این موضوع علاقمند هستید، جهت کسب اطلاعات بیشتر، مطالعه مستندات رسمی Jails به شدت توصیه میشود.
فیلترشکن شرعی و حلال بوسیله احضار نمودن روح پلید BSD
بصورت پیشفرض صفحه آغازین FreeBSD در هنگام شروع بکار بدین شکل خواهد بود:
بصورت سنتی FreeBSD دارای یک روح پلید به نام Beastie میباشد که به عنوان طلسم خوششانسی این سیستمعامل بکار میرود. بمنظور احضار این روح پلید در هنگام آغاز بکار نسخه FreeBSD خود این خط را به فایل /boot/loader.conf
اضافه نمایید 😃
# Summon Beastie
loader_logo="beastie"
از این پس صفحه آغازین FreeBSD در هنگام بوت سیستمعامل بدین شکل نمایش داده میشود:
تست سرعت VPN
به منظور سنجش کارایی و سرعت سرویس VPNی که راهاندازی نمودهایم، میتوان در کامپیوتر به Speedtest by Ookla مراجعه نمود. همچنین در سیستمعامل موبایل میتوانید از اپلیکیشن Speedtest by Ookla برای اندروید و Speedtest by Ookla برای آیاواس، بدین منظور استفاده نمایید.
نمونه تستهای انجام شده توسط اپلیکیشن Speedtest و نتایج بسیار جالب و بعضا شگفتانگیر آن (جهت کسب اطلاعات بیشتر و مشاهده جزئیات تستها به بخش انتهایی ویدیوی چهارم مراجعه نمایید):
دانلود (عادی) | آپلود (عادی) | دانلود (SSR) | آپلود (SSR) | |
---|---|---|---|---|
وایفای رایگان کتابخانه عمومی | 31.6 Mb/s | 32.1 Mb/s | 28.4 Mb/s | 45.9 Mb/s |
وایفای رایگان فروشگاه زنجیرهای | 2.20 Mb/s | 0.05 Mb/s | 9.03 Mb/s | 46.5 Mb/s |
بستر اینترنت موبایل - نقطه ۱ | 61.4 Mb/s | 31.8 Mb/s | 64.5 Mb/s | 33.4 Mb/s |
بستر اینترنت موبایل - نقطه ۲ | 79.7 Mb/s | 30.8 Mb/s | 72.6 Mb/s | 33.5 Mb/s |
بستر اینترنت موبایل - نقطه ۳ | 92.8 Mb/s | 30.9 Mb/s | 78.6 Mb/s | 38.0 Mb/s |
بیشتر بخوانید
- امنیت سایبری ۱۰۱ ویژه فعالان حقوق بشر، فعالان مدنی، فعالان سیاسی، روزنامه نگاران و براندازان: اثبات آسیبپذیری تازه کشفشده در سیستمعامل ویندوز مایکروسافت که به هر فردی با دانش ابتدایی کامپیوتر اجازه بدستآوردن و هک رمزهای عبور از ویندوز XP تا ویندوز ۱۰ را میدهد!
- امنیت سایبری ۱۰۱ ویژه فعالان حقوق بشر، فعالان مدنی، فعالان سیاسی، روزنامه نگاران و براندازان: یکی از دلایل نامشخص ساسپند شدن در توییتر؛ VPNهای رایگان نظیر Tor و Tor Browser
- امنیت سایبری ۱۰۱ ویژه فعالان حقوق بشر، فعالان مدنی، فعالان سیاسی، روزنامه نگاران و براندازان: افشای آسیبپذیری توییتر بر روی فایرفاکس که دادههای غیرعمومی را تا ۷ روز بر روی این مرورگر ذخیره مینمایند
- امنیت سایبری ۱۰۱ ویژه فعالان حقوق بشر، فعالان مدنی، فعالان سیاسی، روزنامه نگاران و براندازان: راهنمای نحوه عبور از فیلترینگ سنگین اینترنت در زمان اعتراضات در ایران با استفاده از تکنیک Domain Fronting و نرمافزارهای Tor و meek