آموزش نصب IBSng: راه‌اندازی، ساخت کاربر، اتصال میکروتیک و بک‌آپ دیتابیس

آموزش نصب 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

حتما یک‌بار روی یک سرور آزمایشی ریستور را تمرین کنید؛ بک‌آپی که هرگز تست نشده باشد، بک‌آپ نیست.

آموزش‌های مرتبط