آموزش نصب IBSng: راهاندازی، ساخت کاربر، اتصال میکروتیک و بکآپ دیتابیس
پیش از شروع بخوانید: آخرین نسخه منتشرشده IBSng یعنی IBSng-A1.24 مربوط به سال ۲۰۱۲ است و بر پایه Python 2 نوشته شده؛ Python 2 از سال ۲۰۲۰ دیگر پشتیبانی نمیشود. دستورهای اصلی این آموزش هم در اصل با service و chkconfig نوشته شده بودند که مربوط به CentOS 6 و نسخههای قدیمیتر است؛ در متن، معادل systemctl هر دستور را هم آوردهایم. بنابراین این مطلب را بهعنوان مرجع نگهداری سامانههای موجود ببینید، نه توصیهای برای راهاندازی تازه. فایل نصب هم اکنون فقط از صفحه رسمی پروژه IBSng در SourceForge در دسترس است. اجرای چنین سامانهای معمولا روی یک سرور اختصاصی ایران انجام میشود تا منابع و دسترسی شبکه بهطور کامل در اختیار خودتان باشد.
برای نصب IBSng توزیع لینوکس CentOS پیشنهاد میشود و این آموزش هم بر پایه همین توزیع نوشته شده است. روی AlmaLinux و Rocky Linux نسخه ۸ و ۹ (و همچنین نسخههای جدید Ubuntu) بستههای Python 2 و کتابخانههای وابسته به آن یا اصلا وجود ندارند یا دیگر پشتیبانی نمیشوند؛ پس اگر مجبورید IBSng را نگه دارید، منطقیترین کار اجرای آن داخل یک ماشین مجازی یا کانتینر جداگانه با توزیع قدیمی و بستن دسترسی آن به اینترنت است.
یک توصیه عملی: همه دستورهای این آموزش با کاربر root اجرا میشوند و بعضی از آنها (حذف دیتابیس، تغییر فایروال، تغییر SELinux) برگشتناپذیرند. اگر روی سرور در حال کار این مراحل را انجام میدهید، اول یک اسنپشات یا بکآپ کامل بگیرید و مطمئن شوید به کنسول یا KVM سرور دسترسی دارید تا اگر ارتباط SSH قطع شد بتوانید برگردید.
نصب بستههای موردنیاز
در اولین قدم بستههای موردنیاز را نصب کنید:
yum -y install httpd php php-gd php-pdo php-mbstring postgresql-server postgresql-python bzip2
روی توزیعهای جدیدتر خانواده Red Hat بهجای yum از dnf استفاده کنید و نام بسته درایور پایتون PostgreSQL هم بسته به نسخه توزیع python-psycopg2 یا python2-psycopg2 است. روی Debian و Ubuntu معادل این بستهها با apt install apache2 php php-gd postgresql نصب میشود، اما مسیرها و نام سرویسها فرق میکند و اسکریپت نصب IBSng برای ساختار Red Hat نوشته شده است.
راهاندازی سرویسها و PostgreSQL
سرویسها را طوری تنظیم کنید که هنگام بالا آمدن سیستم اجرا شوند. دستور قدیمی روی CentOS 6:
chkconfig httpd on chkconfig postgresql on
معادل امروزی آن روی CentOS 7 به بعد، AlmaLinux، Rocky و Ubuntu:
systemctl enable httpd systemctl enable postgresql
یک نکته که در آموزشهای قدیمی جا افتاده است: از CentOS 7 به بعد دیتابیس PostgreSQL هنگام اولین اجرا بهصورت خودکار مقداردهی اولیه نمیشود و اگر این مرحله را رد کنید، سرویس بالا نمیآید. پس ابتدا:
postgresql-setup initdb
روی نسخههای جدیدتر نام دستور postgresql-setup --initdb است. این دستور را فقط روی سرور تازه اجرا کنید؛ اگر از قبل دیتابیسی در /var/lib/pgsql/data دارید، دستور با پیام خطا متوقف میشود و همین درست است. حالا سرویسها را استارت کنید:
systemctl start httpd systemctl start postgresql
(معادل قدیمی: service httpd start و service postgresql start)
فایل /var/lib/pgsql/data/pg_hba.conf را با ویرایشگر باز کنید:
nano /var/lib/pgsql/data/pg_hba.conf
اگر PostgreSQL را از مخزن رسمی PGDG نصب کرده باشید، مسیر فایل شامل شماره نسخه است؛ مثلا /var/lib/pgsql/16/data/pg_hba.conf. سپس خط زیر را به ابتدای بخش قوانین دسترسی اضافه کنید:
local IBSng ibs trust
ترتیب مهم است: PostgreSQL اولین قانون منطبق را اجرا میکند، پس این خط باید بالاتر از قوانین عمومی قرار بگیرد. مقدار trust یعنی برای اتصال محلی به دیتابیس IBSng رمزی خواسته نمیشود؛ چون فقط روی سوکت محلی اثر دارد قابل قبول است، اما هرگز آن را برای اتصالهای host و شبکهای به کار نبرید. سرویس را دوباره راهاندازی کنید:
systemctl restart postgresql
حال دیتابیس و کاربر موردنیاز IBSng را ایجاد کنید:
su - postgres createuser ibs createdb IBSng createlang plpgsql IBSng exit
دقت کنید که نام دیتابیس با همین حروف بزرگ و کوچک ساخته میشود و در ادامه هم باید دقیقا IBSng بنویسید. دستور createlang در PostgreSQL نسخه ۱۰ به بعد حذف شده است. خبر خوب اینکه از نسخه ۹.۰ به بعد زبان plpgsql بهصورت پیشفرض روی دیتابیسهای جدید فعال است، پس اگر با خطای «دستور یافت نشد» روبهرو شدید کافی است از آن رد شوید یا برای اطمینان اجرا کنید:
su - postgres -c 'psql -d IBSng -c "CREATE EXTENSION IF NOT EXISTS plpgsql;"'
این دستور حتما باید با کاربر postgres اجرا شود؛ اگر آن را مستقیم با root بزنید خطای «role “root” does not exist» میگیرید.
دانلود و اجرای اسکریپت نصب
فایل IBSng را دانلود و از حالت فشرده خارج کنید:
wget https://downloads.sourceforge.net/project/ibsng/IBSng-A1.24.tar.bz2 tar xvjf IBSng-A1.24.tar.bz2 -C /usr/local/
سپس اسکریپت /usr/local/IBSng/scripts/setup.py را اجرا کنید و مراحل زیر را به ترتیب انجام دهید:
cd /usr/local/IBSng/scripts/ ./setup.py 1 Install 2 Test DB Connection and Continue 2 Compile Configuration and Continue 1 Import Tables and Continue Enter System password 1 Copy ibs.conf to '/etc/httpd/conf.d' 2 Chown apache directories to 'apache' 5 Continue 1 Copy logrotate Conf to /etc/logrotate.d 3 Continue 1 Link Init file in /etc/init.d 2 Set IBSng to start on reboot b Back to main menu x Exit
اعداد را دقیقا به همان ترتیبی که نوشته شده وارد کنید. اگر روی سیستم شما دستور python به Python 3 اشاره میکند، اسکریپت اجرا نخواهد شد و باید صریحا با مفسر نسخه ۲ اجرایش کنید:
python2 ./setup.py
در مرحله «Enter System password» رمزی که وارد میکنید رمز کاربر مدیر پنل است؛ آن را جایی یادداشت کنید.
سرویس IBSng را استارت و httpd را دوباره راهاندازی کنید:
systemctl start IBSng systemctl restart httpd
گزینه «Link Init file in /etc/init.d» یک اسکریپت SysV میسازد. تا وقتی systemd مولد سازگاری SysV را داشته باشد (CentOS 7 و ۸ قطعا، و در عمل روی نسخههای بعدی هم معمولا) همین اسکریپت خودکار به یک سرویس systemd ترجمه میشود و systemctl start IBSng کار میکند. اگر روی توزیع شما این اتفاق نیفتاد، یا مستقیم /etc/init.d/IBSng start را صدا بزنید یا یک unit file ساده برای آن بنویسید.
تنظیمات تکمیلی بعد از نصب
اگر از CentOS 6 به بعد (یعنی PHP نسخه ۵.۳ و بالاتر) استفاده میکنید، دو مرحله زیر لازم است.
۱. تعیین منطقه زمانی در PHP
فایل php.ini را باز کنید:
nano /etc/php.ini
سپس خط زیر را اضافه کنید (اگر خط date.timezone از قبل وجود دارد، همان را ویرایش کنید تا دو مقدار تکراری نداشته باشید):
date.timezone = "Asia/Tehran"
برای اعمال تنظیمات، httpd را دوباره راهاندازی کنید:
systemctl restart httpd
اگر PHP روی سرور شما بهجای ماژول آپاچی با php-fpm اجرا میشود، باید systemctl restart php-fpm را هم بزنید.
۲. افزودن سرآیند کدگذاری به دو فایل پایتون
پیش از دست زدن به این دو فایل، از هرکدام یک کپی بگیرید تا در صورت اشتباه بتوانید برگردید:
cp /usr/local/IBSng/core/lib/IPy.py /usr/local/IBSng/core/lib/IPy.py.bak cp /usr/local/IBSng/core/lib/mschap/des_c.py /usr/local/IBSng/core/lib/mschap/des_c.py.bak
حالا دو فایل زیر را باز کنید:
nano /usr/local/IBSng/core/lib/IPy.py nano /usr/local/IBSng/core/lib/mschap/des_c.py
و دقیقا در ابتدای هر فایل این دو خط را قرار دهید:
#!/usr/bin/python # -*- coding:utf-8 -*-
روی سیستمهایی که /usr/bin/python به Python 3 اشاره میکند یا اصلا وجود ندارد، خط اول را #!/usr/bin/python2 بنویسید. سپس سرویس را دوباره راهاندازی کنید:
systemctl restart IBSng
یک هشدار درباره PHP: پنل وب IBSng برای PHP نسخه ۵ نوشته شده است. توابعی مثل ereg() در PHP 7 و each() در PHP 8 حذف شدهاند، بنابراین اگر پنل را روی نسخههای جدید PHP بالا بیاورید و با خطای «Call to undefined function» روبهرو شدید، علتش همین است و راهحل عملی، پایین نگه داشتن نسخه PHP روی همان سرور است.
SELinux و فایروال
در آموزشهای قدیمی برای غیرفعال کردن SELinux دستوری شبیه echo 'SELINUX=disabled' > /etc/selinux/config توصیه میشد. این دستور را اجرا نکنید. علامت > کل محتوای فایل پیکربندی را پاک میکند، از جمله خط SELINUXTYPE، و نبود آن خط میتواند بالا آمدن سیستم را با مشکل روبهرو کند. روش درست، ویرایش همان یک خط است. اول یک نسخه پشتیبان بگیرید:
cp /etc/selinux/config /etc/selinux/config.bak setenforce 0 sed -i 's/^SELINUX=.*/SELINUX=permissive/' /etc/selinux/config
حالت permissive جلوی مسدودسازی را میگیرد ولی همچنان لاگ مینویسد، پس بعدا میتوانید سیاست درست را بنویسید. setenforce 0 بلافاصله اثر میکند و تغییر فایل پیکربندی بعد از ریبوت اعمال میشود.
درباره فایروال هم دستور قدیمی iptables -F بهعلاوه service iptables save یعنی باز کردن کامل سرور روی اینترنت، که کار درستی نیست. بهجای خاموش کردن فایروال، فقط پورتهای لازم را باز کنید. روی CentOS 7 به بعد که firewalld دارند:
firewall-cmd --permanent --add-service=ssh firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-port=1812/udp firewall-cmd --permanent --add-port=1813/udp firewall-cmd --reload
خط اول عمدا آمده است: پیش از هر --reload مطمئن شوید سرویس ssh در zone فعال شما مجاز است، وگرنه ارتباط خودتان با سرور قطع میشود و فقط با کنسول یا KVM میتوانید برگردید. روی CentOS 6 دستور firewall-cmd وجود ندارد و باید همین قوانین را با iptables بنویسید.
پورتهای ۱۸۱۲ و ۱۸۱۳ روی UDP پورتهای استاندارد RADIUS برای احراز هویت و accounting هستند و بهتر است فقط برای IP دستگاههایی که به IBSng وصل میشوند باز باشند، نه برای همه اینترنت. برای محدود کردن به یک IP مشخص بهجای دو خط پورت بالا میتوانید بنویسید:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.5/32" port port="1812" protocol="udp" accept' firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.5/32" port port="1813" protocol="udp" accept' firewall-cmd --reload
بهجای 203.0.113.5 آدرس روتر خودتان را بگذارید. اگر پیکربندی شما از پورتهای قدیمی ۱۶۴۵ و ۱۶۴۶ استفاده میکند، همانها را باز کنید.
ورود به پنل مدیریت و ساخت اولین کاربر
از طریق آدرس http://ip-address/IBSng/admin میتوانید وارد محیط مدیریتی شوید. نام کاربری مدیر system است و رمز آن همان چیزی است که در زمان نصب وارد کردید.
برای ساخت کاربر، از منوی User گزینه Add New User را انتخاب کنید و:
- مقدار Count تعداد اکانتهایی است که یکجا ساخته میشوند. برای یک کاربر تکی عدد ۱ و برای ساخت گروهی، تعداد موردنظر را وارد کنید.
- مقدار Credit اعتبار اولیه اکانت است؛ مثلا ۵۰۰۰ (واحد آن همان واحدی است که در تنظیمات سیستم تعریف کردهاید).
- در قسمت Group گروهی را انتخاب کنید که دوره و شرایط سرویسدهی در آن تعریف شده است. گروهها را از سربرگ Group در بالای پنل میتوانید اضافه یا اصلاح کنید؛ منطقی است اول گروه را بسازید و بعد سراغ ساخت کاربر بروید.
روی OK کلیک کنید. در صفحه بعد تیک Has Internet Username را بزنید تا فیلدهای مربوطه فعال شوند، سپس در Internet Username نام کاربری و در Password رمز را وارد کنید و دوباره OK بزنید تا کاربر ساخته شود. اگر Count را بزرگتر از ۱ گذاشته باشید، اکانتها بهصورت گروهی و بدون نام کاربری ساخته میشوند و بعدا میتوانید برای هرکدام نام کاربری تعیین کنید.
محدود کردن دسترسی به پنل مدیریت
پنل مدیریت IBSng روی HTTP ساده کار میکند و کد آن سالهاست بهروز نشده است؛ در دسترس گذاشتن آن روی اینترنت عمومی ریسک جدی دارد. حداقل کار این است که دسترسی به مسیر مدیریت را به چند IP مشخص محدود کنید. فایل /etc/httpd/conf.d/ibs.conf را باز کنید و بلوک زیر را اضافه کنید.
روی Apache 2.4 (CentOS 7 به بعد، AlmaLinux، Rocky، Ubuntu):
<Location /IBSng/admin>
Require ip 192.0.2.10
</Location>
روی Apache 2.2 (CentOS 6 و قدیمیتر) که هنوز از دستورهای Order استفاده میکند:
<Location /IBSng/admin>
Order deny,allow
Deny from all
Allow from 192.0.2.10
</Location>
بهجای 192.0.2.10 حتما آدرس IP واقعی خودتان را بگذارید؛ اگر این IP را اشتباه بنویسید یا نمونه بالا را دستنخورده بگذارید، خودتان هم دیگر به پنل دسترسی نخواهید داشت و باید با SSH فایل را اصلاح کنید. پیش از اعمال تغییر، درستی پیکربندی را بررسی کنید و بعد سرویس را ریاستارت کنید:
apachectl configtest systemctl restart httpd
اگر IP ثابت ندارید، امنترین راه این است که پنل فقط روی 127.0.0.1 در دسترس باشد و از طریق تونل SSH به آن وصل شوید.
اتصال میکروتیک به IBSng
IBSng خودش کاربران را به اینترنت وصل نمیکند؛ نقش آن سرور RADIUS است و دستگاهی که واقعا کاربر را احراز هویت و مصرفش را گزارش میکند (اینجا روتر میکروتیک) در IBSng بهعنوان RAS تعریف میشود. مراحل کار دو طرف دارد.
سمت IBSng
در پنل مدیریت به بخش RAS بروید و یک RAS جدید بسازید: IP روتر میکروتیک را وارد کنید، نوع (Type) مربوط به میکروتیک را انتخاب کنید و در تنظیمات همان RAS، کلید مشترک (Secret) را تعیین کنید. نام دقیق فیلدها بین نسخههای مختلف IBSng کمی فرق دارد، اما همیشه همین سه چیز لازم است: IP دستگاه، نوع دستگاه و کلید مشترک.
سمت میکروتیک
در ترمینال RouterOS سرور RADIUS را معرفی کنید. برای سرویس PPPoE و PPTP و L2TP:
/radius add service=ppp address=IBSNG-SERVER-IP secret=YOUR-SECRET /ppp aaa set use-radius=yes accounting=yes
و اگر از Hotspot استفاده میکنید:
/radius add service=hotspot address=IBSNG-SERVER-IP secret=YOUR-SECRET /ip hotspot profile set [find] use-radius=yes
توجه کنید که [find] بدون شرط، تنظیم را روی همه پروفایلهای هاتاسپات اعمال میکند؛ اگر بیش از یک پروفایل دارید نام آن را مشخص کنید، مثلا [find name="hsprof1"]. مقدار secret هم باید دقیقا همان چیزی باشد که در IBSng وارد کردهاید. اگر IBSng شما روی پورتهای غیراستاندارد گوش میدهد، آن را هم مشخص کنید:
/radius set [find address=IBSNG-SERVER-IP] authentication-port=1812 accounting-port=1813
اگر قطع کردن سشن کاربر از داخل پنل IBSng کار نکرد، معمولا علتش این است که میکروتیک درخواست قطع اتصال را از سمت سرور نمیپذیرد. با دستور زیر پذیرش این درخواستها را فعال کنید:
/radius incoming set accept=yes
برای عیبیابی، لاگ RADIUS روی میکروتیک (/log print where topics~"radius") و لاگ IBSng (که بهطور پیشفرض زیر /usr/local/IBSng/ ساخته میشود؛ مسیر دقیق را از فایل logrotate در /etc/logrotate.d/ ببینید) اولین جایی است که باید نگاه کنید. رایجترین خطاها هم دو تاست: ناهماهنگی کلید مشترک، و بسته شدن پورت UDP 1812 روی مسیر بین روتر و سرور.
بکآپ و ریستور دیتابیس IBSng
تمام اطلاعات کاربران، گروهها و مصرف در دیتابیس PostgreSQL نگهداری میشود. با توجه به قدیمی بودن این نرمافزار، بکآپ منظم از دیتابیس مهمترین کاری است که میتوانید برای امنیت اطلاعاتتان انجام دهید.
گرفتن بکآپ
su - postgres pg_dump IBSng > /var/lib/pgsql/IBSng.sql exit
حالا در مسیر /var/lib/pgsql/ یک فایل بکآپ دارید که باید آن را از سرور دانلود و جای امنی نگه دارید؛ برای انتقال میتوانید از هر کلاینت SFTP مثل WinSCP استفاده کنید. برای اینکه این کار فراموش نشود، اول یک مسیر بکآپ بسازید:
mkdir -p /var/lib/pgsql/backups chown postgres:postgres /var/lib/pgsql/backups
سپس فایلی در /etc/cron.d/ibsng-backup با این محتوا بسازید تا هر شب ساعت ۳ بکآپ گرفته شود:
PATH=/usr/bin:/bin 0 3 * * * postgres pg_dump IBSng | gzip > /var/lib/pgsql/backups/ibsng-$(date +%F).sql.gz
سه نکته: در فایلهای cron علامت درصد معنای خاصی دارد و باید به شکل % نوشته شود؛ ستون چهارم (postgres) کاربری است که دستور با آن اجرا میشود و فقط در /etc/cron.d و /etc/crontab نوشته میشود، نه در crontab -e؛ و اگر PostgreSQL را از مخزن PGDG نصب کردهاید مسیر pg_dump چیز دیگری است (مثلا /usr/pgsql-16/bin) و باید همان را در خط PATH بگذارید. این بکآپها روی هم جمع میشوند، پس یک کار پاکسازی هم برایشان در نظر بگیرید.
برگرداندن بکآپ
هشدار: مراحل زیر شامل حذف کامل دیتابیس فعلی است. پیش از هر کاری یک بکآپ تازه از وضعیت موجود بگیرید (همان دستور pg_dump بالا با یک نام فایل دیگر) و از سالم بودن فایلی که میخواهید برگردانید مطمئن شوید؛ اگر آن فایل ناقص باشد، بعد از dropdb راه برگشتی نخواهید داشت.
ابتدا سرویسها را متوقف کنید تا هنگام بازگرداندن اطلاعات چیزی روی دیتابیس ننویسد و اتصال بازی باقی نماند (اگر اتصال فعالی باشد، dropdb خطا میدهد):
systemctl stop IBSng systemctl stop httpd
حالا دیتابیس قبلی را حذف و دوباره بسازید؛ ریستور روی یک دیتابیس پر، خطای «تکراری بودن» میدهد:
su - postgres dropdb IBSng createdb IBSng
سپس با همان کاربر postgres فایل را برگردانید:
psql IBSng < /var/lib/pgsql/IBSng.sql
یا اگر پیش نرفت، صریحا کاربر و دیتابیس را مشخص کنید:
psql -U ibs -d IBSng -f /var/lib/pgsql/IBSng.sql
در پایان از کاربر postgres خارج شوید و سرویسها را بالا بیاورید (دستورهای systemctl با کاربر postgres کار نمیکنند و باید دوباره root باشید):
exit systemctl start IBSng systemctl start httpd
حتما یکبار روی یک سرور آزمایشی ریستور را تمرین کنید؛ بکآپی که هرگز تست نشده باشد، بکآپ نیست.