آموزش تغییر پورت mysql در centos
برای تغییر پورت MySQL یا MariaDB باید پارامتر port را در بخش [mysqld] فایل پیکربندی سرویس تنظیم کنید، پورت جدید را در SELinux و فایروال مجاز کنید، سرویس را ریاستارت کنید و در پایان رشتهٔ اتصال همهٔ برنامهها را بهروز کنید. سه مرحلهٔ آخر همان جایی است که معمولاً فراموش میشود و سایت بعد از ریاستارت بالا نمیآید.
پیشنیازها
پیش از شروع، این چهار مورد را آماده داشته باشید:
- دسترسی
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]یا در فایلی نوشتهاید که فایل دیگری آن را بازنویسی میکند.
اگر سرور شما در حال سرویسدهی است و نمیخواهید ریسک قطعی را خودتان بپذیرید، انجام این تغییرات همراه با هاردنینگ و پیکربندی فایروال از خدماتی است که تیم پشتیبانی و مدیریت سرور میتواند برایتان انجام دهد.
