آموزش تغییر پورت mysql در centos

آموزش تغییر پورت mysql در centos

برای تغییر پورت MySQL یا MariaDB باید پارامتر port را در بخش [mysqld] فایل پیکربندی سرویس تنظیم کنید، پورت جدید را در SELinux و فایروال مجاز کنید، سرویس را ری‌استارت کنید و در پایان رشتهٔ اتصال همهٔ برنامه‌ها را به‌روز کنید. سه مرحلهٔ آخر همان جایی است که معمولاً فراموش می‌شود و سایت بعد از ری‌استارت بالا نمی‌آید.

تغییر پورت MySQL

پیش‌نیازها

پیش از شروع، این چهار مورد را آماده داشته باشید:

  • دسترسی root یا کاربری با اجازهٔ sudo. اگر روی سرور مجازی ایران کار می‌کنید، این دسترسی کامل مدیریتی در اختیار شماست و می‌توانید فایل‌های پیکربندی سیستمی را مستقیم ویرایش کنید.
  • یک راه دسترسی جایگزین مثل کنسول یا KVM؛ اگر قانون فایروال را اشتباه بنویسید ممکن است اتصال خودتان قطع شود.
  • نسخهٔ پشتیبان از فایل پیکربندی: cp /etc/my.cnf /root/my.cnf.bak
  • یک بازهٔ کم‌ترافیک، چون ری‌استارت دیتابیس یعنی قطعی کوتاه سرویس.
  • همین منطق برای پورت SSH هم برقرار است و مراحلش را در تغییر پورت سرور نوشته‌ایم.

فایل پیکربندی کجاست؟

آموزش‌های قدیمی فقط /etc/my.cnf را معرفی می‌کنند، اما مسیر واقعی به توزیع و موتور دیتابیس بستگی دارد:

  • خانوادهٔ RHEL (AlmaLinux، Rocky Linux، RHEL): /etc/my.cnf و فایل‌های داخل /etc/my.cnf.d/
  • MySQL روی Debian و Ubuntu: /etc/mysql/mysql.conf.d/mysqld.cnf
  • MariaDB روی Debian و Ubuntu: /etc/mysql/mariadb.conf.d/50-server.cnf

حواستان به خط !includedir در انتهای my.cnf باشد؛ فایل‌هایی که بعداً خوانده می‌شوند می‌توانند مقدار شما را بازنویسی کنند. تنظیم‌های دیگری مثل innodb_default_row_format هم در همین فایل می‌نشینند و کاربردشان را در حل خطای MySQL Error 1118 توضیح داده‌ایم. اگر هنوز روی CentOS 7 یا CentOS 8 هستید بدانید که هر دو به پایان پشتیبانی رسیده‌اند و دیگر وصلهٔ امنیتی نمی‌گیرند؛ مهاجرت به AlmaLinux یا Rocky Linux کار درست‌تری از تغییر پورت است.

مرحلهٔ ۱: نوشتن پورت جدید

فایل را باز کنید (nano /etc/my.cnf) و زیر بخش [mysqld] این خط را اضافه کنید — در این مثال پورت 6464 را انتخاب کرده‌ایم:

[mysqld]
port=6464

اگر می‌خواهید کلاینت خط فرمان هم به‌صورت پیش‌فرض سراغ همین پورت برود، بخش [client] را هم تنظیم کنید:

[client]
port=6464

در nano با Ctrl+X سپس y و Enter ذخیره کنید. پورتی بالای 1024 انتخاب کنید که سرویس دیگری از آن استفاده نکند؛ با ss -lntp می‌توانید پورت‌های در حال گوش‌دادن را ببینید. اگر این خط را ننویسید، سرویس روی پورت پیش‌فرض 3306 بالا می‌آید.

مرحلهٔ ۲: SELinux را فراموش نکنید

روی توزیع‌های خانوادهٔ RHEL که SELinux فعال است، سرویس اجازه ندارد روی پورت دلخواه گوش بدهد و با خطای Permission denied بالا نمی‌آید. وضعیت را با getenforce ببینید و اگر Enforcing بود، برچسب پورت را اضافه کنید:

dnf install -y policycoreutils-python-utils
semanage port -a -t mysqld_port_t -p tcp 6464

اگر پیام داد که پورت از قبل تعریف شده است، به‌جای -a از -m استفاده کنید.

مرحلهٔ ۳: قانون فایروال

پورت قدیمی را ببندید و پورت جدید را باز کنید. با firewalld:

firewall-cmd --permanent --remove-port=3306/tcp
firewall-cmd --permanent --add-port=6464/tcp
firewall-cmd --reload

روی Ubuntu با ufw: ufw delete allow 3306/tcp و سپس ufw allow 6464/tcp. روی سرورهایی که کنترل‌پنل cPanel دارند فایروال معمولاً CSF است؛ در این حالت باید فهرست TCP_IN را در /etc/csf/csf.conf ویرایش و بعد csf -r را اجرا کنید. اگر CSF هنوز روی سرور نیست یا با پارامترهایش آشنا نیستید، نصب و کانفیگ فایروال CSF را ببینید.

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

ufw allow from 203.0.113.10 to any port 6464 proto tcp

مرحلهٔ ۴: ری‌استارت و راستی‌آزمایی

دستور service mysqld restart که در آموزش‌های قدیمی می‌بینید امروز فقط یک لایهٔ سازگاری روی systemd است. شکل درست، بسته به سرویس نصب‌شده:

systemctl restart mysqld برای MySQL روی RHEL، systemctl restart mysql روی Debian و Ubuntu، و systemctl restart mariadb برای MariaDB.

سپس بررسی کنید که واقعاً کار کرده است:

ss -lntp | grep mysql
mysql -h 127.0.0.1 -P 6464 -u root -p -e "SHOW GLOBAL VARIABLES LIKE 'port';"

اگر خروجی دستور دوم پورت جدید را نشان داد، پیکربندی اعمال شده است. در صورت بروز خطا، لاگ سرویس را با journalctl -xeu mariadb یا فایل /var/log/mysqld.log بخوانید.

مرحلهٔ ۵: به‌روزرسانی برنامه‌ها

اینجا حساس‌ترین بخش کار است. هر برنامه‌ای که با TCP به دیتابیس وصل می‌شود باید پورت جدید را بداند: مقدار DB_HOST در wp-config.php وردپرس به شکل 127.0.0.1:6464، متغیر DB_PORT در فایل .env لاراول، تنظیمات phpMyAdmin، اسکریپت‌های بکاپ که mysqldump اجرا می‌کنند و ابزارهای مانیتورینگ.

یک تذکر مهم پیش از آنکه وقت بگذارید: اگر سایت شما روی هاست لینوکس اشتراکی میزبانی می‌شود، این کار اصلاً در اختیار شما نیست؛ در هاست اشتراکی دسترسی به my.cnf و به سرویس دیتابیس وجود ندارد و پورت را مدیر سرور تعیین می‌کند. تمام مراحل این آموزش فقط روی سروری معنا دارد که دسترسی root آن با شماست.

یک نکتهٔ مهم که خیلی‌ها را سردرگم می‌کند: در لینوکس اگر میزبان را localhost بنویسید، کلاینت از سوکت یونیکس استفاده می‌کند و پورت را کاملاً نادیده می‌گیرد. برای اینکه واقعاً از TCP و پورت جدید استفاده شود باید 127.0.0.1 بنویسید. به همین دلیل، برنامه‌هایی که روی خودِ سرور و از طریق سوکت وصل می‌شوند اصلاً تحت تأثیر تغییر پورت قرار نمی‌گیرند.

واقعیت امنیتی: تغییر پورت امنیت نیست

تغییر پورت «امنیت از راه گمنامی» است، نه امنیت. اسکنرها کل بازهٔ پورت‌ها را جست‌وجو می‌کنند و سرویس MySQL با بنر خودش به‌سرعت شناسایی می‌شود. کاری که واقعاً ریسک را کم می‌کند این است که دیتابیس اصلاً روی اینترنت شنونده نباشد:

  • در بخش [mysqld] مقدار bind-address = 127.0.0.1 را تنظیم کنید تا فقط از خودِ سرور قابل اتصال باشد.
  • برای دسترسی از راه دور به‌جای باز کردن پورت، تونل SSH بسازید: ssh -L 3306:127.0.0.1:6464 user@server
  • کاربر root را از راه دور غیرفعال کنید و برای هر برنامه کاربر جداگانه با کمترین سطح دسترسی بسازید.
  • اگر MySQL 8 یا جدیدتر دارید بدانید که پروتکل X روی پورت جداگانه‌ای گوش می‌دهد و با متغیر mysqlx_port تنظیم می‌شود؛ تغییر port روی آن اثری ندارد.

اگر وب‌سرور و دیتابیس روی دو ماشین جدا هستند، معماری امن‌تر این است که دیتابیس فقط روی شبکهٔ داخلی گوش بدهد و در فایروال، دسترسی به پورت آن تنها برای آی‌پی داخلی وب‌سرور باز باشد؛ در این حالت پورت دیتابیس هیچ‌وقت از اینترنت عمومی دیده نمی‌شود.

خطاهای رایج

  • سرویس بالا نمی‌آید: معمولاً برچسب SELinux یا اشتباه تایپی در فایل پیکربندی. لاگ خطا را بخوانید.
  • پیام Address already in use: پورت انتخابی اشغال است؛ با ss -lntp ببینید چه سرویسی آن را گرفته.
  • اتصال timeout می‌شود: نشانهٔ فایروال بسته است. اما پیام Connection refused یعنی چیزی روی آن پورت گوش نمی‌دهد.
  • مقدار اعمال نشده: احتمالاً port را بیرون از بخش [mysqld] یا در فایلی نوشته‌اید که فایل دیگری آن را بازنویسی می‌کند.

اگر سرور شما در حال سرویس‌دهی است و نمی‌خواهید ریسک قطعی را خودتان بپذیرید، انجام این تغییرات همراه با هاردنینگ و پیکربندی فایروال از خدماتی است که تیم پشتیبانی و مدیریت سرور می‌تواند برایتان انجام دهد.