Pertanyaan Bagaimana cara mengizinkan akses MySQL jarak jauh ke satu IP statis?


Saya mencoba mengaktifkan akses jarak jauh ke MySQL melalui port 3306 tetapi tidak berhasil. Saya telah diberikan akses root ke mesin produksi sehingga saya bisa mengambil file dan database, bekerja pada mereka secara lokal, dan mengembalikan versi yang sudah dimodifikasi.

Akses saya memungkinkan saya untuk SSH ke dalam kotak, dan itu memungkinkan untuk FTP melalui SSH. Saya sekarang mencoba untuk mendapatkan akses MySQL melalui SSH. MySQL berjalan (mendengarkan secara lokal) dan dapat diakses pada baris perintah dan dapat mengaksesnya tidak masalah.

Saya menyadari bahwa saya bisa membuang database, memulihkan file secara lokal dan melakukan modifikasi saya. Namun, di masa depan saya mungkin perlu mengubah beberapa hal, dan saya lebih suka tidak harus melakukannya pada baris perintah, karena lebih cepat melalui GUI. Atau apakah saya bisa terhubung seperti yang saya inginkan.


7
2018-01-22 18:27






Jawaban:


EDIT: Untuk petunjuk di bawah ini jika Anda menggunakan Windows maka ada dua hal yang perlu diingat:

1) Ubah localhost untuk 127.0.0.1 karena Windows tidak mengaturnya secara otomatis di Windows Vista %SystemRoot%\system32\drivers\etc\hosts.

2) Anda dapat menggunakan yang sedikit diketahui plink.exe alat baris perintah dari Dempul seperangkat alat; ia menggunakan sintaks yang sama untuk opsi sebagai ssh perintah jadi jika Anda mengganti ssh dalam contoh di bawah ini plink.exe itu semua harus bekerja.


Anda akan ingin menggunakan terowongan SSH untuk meneruskan port lokal pada klien Anda ke port mysql di server. Anda dapat melakukannya dengan:

% ssh -f -N -L3306:localhost:3306 username@remoteserver
% mysql -h remoteserver -u mysqluser -p

Opsi untuk ssh berarti:

-f Requests ssh to go to background just before command execution.
-N Do not execute a remote command.
-L [bind_address:]port:host:hostport
   Specifies that the given port on the local (client) host is to be 
   forwarded to the given host and port on the remote side.

Menggunakan -f -N juga berarti Anda akan melakukan proses ssh ke latar belakang daripada tetap terhubung ke host jarak jauh seperti yang biasanya Anda lakukan saat masuk ke shell jarak jauh. Jika Anda ingin meruntuhkan terowongan, Anda dapat mematikan proses ssh pada klien Anda seperti ini:

% pgrep -fl ssh
11145 ssh -f -N -L3306:localhost:3306 username@remoteserver
% kill -9 11145

Tentu saja dalam hal ini 11145 adalah PID dari proses ssh yang akan berbeda setiap kali Anda memulai proses ssh baru untuk membuka terowongan.

Juga, anggap ini yang Anda lakukan tidak memiliki server mysql juga berjalan pada klien Anda. Jika demikian, Anda harus mengubah port lokal yang Anda ikat seperti ini:

% ssh -f -N -L3333:localhost:3306 username@remoteserver
% mysql -P 3333 -h remoteserver -u mysqluser -p

Pelabuhan 3333 sewenang-wenang; Anda dapat memilih nomor port gratis yang dimiliki klien Anda.


3
2018-01-23 06:34



Ini adalah persis apa yang ingin saya lakukan, tetapi saya menggunakan Windows ini. Saya memiliki seorang teman melihat semalam dan kami (dia) menemukan jawabannya untuk saya. - Codecraft
Jika Anda terjebak menggunakan Windows maka Anda dapat menggunakan yang sedikit diketahui plink alat baris perintah dari Dempul seperangkat alat; itu menggunakan sintaks yang sama untuk opsi jadi jika Anda mengganti ssh dalam contoh di atas dengan plink itu semua harus bekerja. - aculich


Menggunakan -s 192.168.100.0/24 berarti Anda hanya mengizinkan akses ke port 3306 jarak jauh untuk rentang IP yang cocok dengan 192.168.100.0/24, yang merupakan jaringan internal pribadi. Apakah ini benar-benar yang ingin Anda lakukan? Kalau tidak ini adalah masalah mengapa koneksi remote dari IP lain tidak berfungsi.

Anda juga biasanya tidak membutuhkan aturan keluar.

Jika ini tidak membantu, berikan sedikit lebih banyak informasi tentang dari mana Anda menguji, IP / antarmuka mesin, apa yang terjadi dan mungkin keluaran penuh dari iptables -vnL untuk kita?

Edit 1:
Berdasarkan informasi lebih lanjut, ini menunjukkan bahwa contoh yang digunakan sebagai template salah dimengerti, Anda harus menghapus rentang IP sumber (karena Anda ingin mengizinkan semua orang dari jarak jauh). Ketik saja ini, dan hanya ini, dan seharusnya berfungsi:

iptables -A INPUT -i eth0 -p tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT

Jika Anda ingin memasukkan IP eksternal Anda, itu haruslah IP tujuan, seperti:

    iptables -A INPUT -i eth0 -p tcp -d xx.xx.xx.xx --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT

-s, seperti dalam sumber, hanya digunakan jika Anda ingin membatasi akses dari rentang IP tertentu.

Edit 2:
Tampaknya tidak menjadi pertanyaan iptables sama sekali, tetapi lebih dari satu mySQL. Untuk memungkinkan mySQL untuk mendengarkan koneksi remote sama sekali, pastikan untuk mengkonfigurasinya untuk mendengarkan alamat eksternal Anda. Edit /etc/mysql/my.cnf dan periksa bind-address pernyataan dan mengubahnya menjadi:

bind-address = xx.xxx.xx.xx

Anda memilih untuk mengganti xx.xx.xx.xx dengan alamat IP eksternal Anda, atau Anda dapat mengaturnya untuk mendengarkan 0.0.0.0 yang berarti itu akan mendengarkan semua antarmuka.

Setelah itu pertanyaan untuk Anda adalah bagaimana mengatur seluruh firewall untuk server Anda di tempat pertama. Baik Anda secara manual memblokir semua port tertentu yang tidak dapat diakses oleh orang lain, atau Anda harus menetapkan kebijakan default untuk menolak lalu lintas dan kemudian membuka port secara manual dengan port (seperti yang diindikasikan oleh pertanyaan awal Anda) untuk layanan yang ingin Anda izinkan. Menjadi SANGAT Hati-hati dengan ini meskipun, jika mesin remote-nya sangat mudah untuk mengunci diri jika Anda menempatkan hal-hal salah urutan atau cara yang salah.


4
2018-01-22 18:34



Itu contoh dari halaman yang saya lihat, saya telah menggantikan IP eksternal saya sendiri di sana. - Codecraft
Jika Anda menambahkan IP eksternal itu berarti bahwa Anda mengizinkan lalu lintas dari (-s, seperti dalam sumber) IP eksternal Anda ke port 3306 masuk. Untuk mengizinkan semua jenis lalu lintas hanya menghapus -s 192.168.100.0/24 sepenuhnya, tinggalkan saja: iptables -A INPUT -i eth0 -p tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT - Mattias Ahnberg
Saya hanya ingin dapat diakses dari jaringan saya, maka alamat IP. Saya tidak ingin port MySQL terbuka mengundang orang untuk pergi ... - Codecraft
Aha. Situasi yang sama sekali berbeda, lalu. Anda mengatakan Anda ingin mengaksesnya dari jarak jauh. : P Saya juga melihat bahwa kebijakan default adalah MENERIMA, dan Anda tidak menjatuhkan lalu lintas di tempat lain, sehingga firewall tidak masalah dalam kasus Anda setelah semua. Apa yang perlu Anda lakukan mungkin untuk mengkonfigurasi mySQL untuk mendengarkan koneksi jarak jauh. - Mattias Ahnberg
Ya, itu berarti hanya mendengarkan localhost. Anda dapat dengan mudah melakukan tunnel melalui SSH, saya melakukannya sepanjang waktu. Dari klien Anda: ssh user@remote.host -L 3305:localhost:3306 dan kemudian, di terminal lain pada klien, lakukan: mysql -h 127.0.0.1 -P 3305 -u username -p dan Anda akan terhubung ke mySQL jauh melalui terowongan SSH. Ini mengasumsikan bahwa server jauh belum memblokir port forwarding, dll. Tetapi biasanya berfungsi dengan baik! - Mattias Ahnberg


Itu -A beralih ke iptables menambahkan aturan baru untuk kemudian mengakhiri rantai. Kemungkinan Anda memiliki aturan sebelumnya yang menolak akses dan dengan iptables, kemenangan pertandingan pertama. Coba gunakan -I beralih untuk memasukkan aturan di awal rantai.

Jika itu tidak berhasil, tolong tunjukkan kepada kami output dari iptables -L -v -n sebagai pengeditan pertanyaan Anda.


1
2018-01-22 19:14



Tampaknya tidak ada aturan lain, saya telah mengedit pertanyaan, xx.xx.xx.xx sebenarnya adalah alamat IP eksternal saya. - Codecraft
@Codecrat: Sudahkan Anda mengesahkan remote host Anda untuk terhubung ke server mysql? Mencoba telnet yourserver.tld 3306 dan lihat apa yang dikatakannya. - Iain
Jika saya telnet (menggunakan PuTTy) ke 3306, itu hanya pergi 'boing' dan keluar. Saya bisa SSH untuk itu baik-baik saja (thats bagaimana saya di server untuk memodifikasi iptables). Saya telah menggunakan klien MySQL (SQLYog) untuk mengakses MySQL melalui SSH, tetapi dikatakan tidak dapat mengotentikasi (menggunakan kredensial SSH yang sama seperti saya untuk mengakses terminal). FTP melalui SSH berfungsi dengan baik. Ada yang aneh! - Codecraft
silakan gunakan telnet dari komputer jarak jauh yang Anda coba izinkan aksesnya. - Iain
koneksi ditolak. - Codecraft


Kebijakan default Anda untuk INPUT dan OUTPUT adalah ACCEPT. Anda belum menetapkan aturan apa pun untuk menjatuhkan atau menolak paket. Ini berarti firewall Anda tidak memblokir koneksi apa pun.

Masalahnya ada di tempat lain.

Menggunakan netstat -tan | grep LISTEN untuk memastikan Anda menjalankan MySQL dan mendengarkannya.

Jika itu berhasil, mungkin ada firewall lain di suatu tempat yang memblokir koneksi.


1
2018-01-23 11:36



Menjalankannya, situs web sudah aktif dan berjalan dan saya dapat mengakses MySQL pada baris perintah dengan baik, tetapi ini tidak berguna untuk pengembangan. Saya agak curiga terhadap kekosongan iptables dan juga jujur, tetapi saya tidak punya banyak hal untuk dilakukan - saya tidak memiliki akses ke pengembang sebelumnya yang telah pindah, dan pemilik proyek tidak teknis. Saya menikam IPTable karena saya telah diberi login ke panel web host, dan ada tiket sebelumnya yang meminta akses jarak jauh - yang dijawab dengan mengatakan bahwa itu perlu dikonfigurasi dalam IPTables di server itu sendiri. - Codecraft
Apache, PHP, dan klien baris perintah dapat berkomunikasi dengan server MySQL menggunakan soket, tanpa menggunakan jaringan. Itu netstat perintah memeriksa bahwa itu mendengarkan juga. - Ladadadada
Saya menjalankan perintah dan mengasumsikannya menunjukkan bahwa itu sudah bangun dan mendengarkan (127.0.0.1:3306) - Codecraft


Saya menemukan jawaban untuk pertanyaan saya sendiri (saya harus mengklarifikasi bahwa saya menggunakan Windows 7 secara lokal, dan linux jarak jauh).

Bagaimanapun, jawabannya adalah untuk meneruskan port menggunakan PuTTy, sesuai dengan penjawab lainnya - tetapi ini untuk pengguna Windows.

Di PuTTy, atur koneksi SSH seperti biasa tetapi kemudian masuk ke pengaturan untuk terowongan, di bawah SSH, pilih port arbitrer (saya menggunakan 5555) secara lokal untuk meneruskan ke 127.0.0.1:3306

PuTTy Tunneling Options

Buka sesi SSH dan masuk seperti biasa.

Kemudian di klien MySQL Anda, atur alamat host ke 127.0.0.1 dan port ke alamat yang Anda pilih (5555).

Oleh karena itu Klien MySQL terhubung ke mesin lokal Anda, yang pada gilirannya diteruskan melalui SSH ke 3306 pada mesin jarak jauh dan memungkinkan koneksi.

CATATAN BESAR: Kami benar-benar telah menyiapkan ini menggunakan istilah localhost (seperti yang Anda lakukan) bukannya 127.0.0.1, di suatu tempat antara PuTTy dan Klien MySQL, ini tidak menyelesaikan - jadi sepertinya Anda harus menggunakan alamat loopback!


1
2018-03-29 02:59



Ah, ya ... belum ada gangguan Windows lain yang tidak memiliki resolusi 127.0.0.1 untuk localhost. Anda bisa melakukannya jika Anda menambahkannya %SystemRoot%\system32\drivers\etc\hosts pada sistem Anda, tetapi ya, senang melihat Anda mengetahuinya dengan mengubah ke representasi numerik; Saya akan memperbarui jawaban saya dengan info tambahan itu. Juga, Anda bisa menggunakan plink alat baris perintah dari Dempul suite jika Anda tidak ingin harus membuka alat GUI PuTTY. - aculich
Ketika Anda menggunakan mesin klien Windows Anda mungkin ingin memeriksa HeidiSQL (www.heidisql.com), yang memungkinkan Anda untuk mengelola sistem MySQL Anda melalui koneksi SSH tanpa perlu menggunakan perangkat lunak tambahan. - John Gardeniers
@aculich Saya menerima jawaban Anda; rasanya tidak adil untuk menerima saya sendiri :) - Codecraft
@ JohnGardeniers klien SQL yang saya gunakan (SQLYog) memiliki opsi untuk menghubungkan melalui terowongan SSH tetapi untuk beberapa alasan yang tidak diketahui itu tidak akan mengotentikasi, meskipun saya tidak menjalankan versi terbaru - maka solusi. - Codecraft
@Codecraft, HeidiSQL digunakan untuk menderita masalah yang sama dan itu paling sering kasus terlalu pendek batas waktu, jadi jika itu disesuaikan pada SQLYog mungkin patut dicoba. - John Gardeniers


Terima kasih banyak! Saya mencoba segala macam omong kosong untuk dapat menggunakan Workbench MySQL dari jarak jauh untuk bekerja pada tabel dalam implementasi MySQL CentOS saya. Pada dasarnya satu-satunya solusi adalah membuka port 3306 untuk semua orang (buruk untuk keamanan).

Kami sudah menggunakan Putty untuk akses baris perintah aman ke server kami dan tidak tahu kami bisa mengatur terowongan seperti ini. Pada dasarnya kita dapat menggunakan koneksi SSH aman yang ada untuk menghubungkan MySQL Workbench dengan server kami. Terima kasih ! ! !


0



Selamat Datang di Server Fault! Situs ini adalah situs Q & A, bukan forum. Posting Anda tidak benar-benar menjawab pertanyaan asli OP. Lihat FAQ untuk info lebih lanjut. - slm