본문 바로가기
DB/RDB

[퍼온 글] MySql 원격 접속 방법

by Jordy-torvalds 2020. 6. 21.
반응형

출처: https://m.blog.naver.com/PostView.nhn?blogId=varkiry05&logNo=198610727&proxyReferer=https:%2F%2Fwww.google.com%2F

 

MySQL 외부접속(원격접속) 열기!!

# mysql -u root -p 를 통해 먼저 접속한 후. > use mysql > grant all privileges on *.* t...

blog.naver.com

# mysql -u root -p 

를 통해 먼저 접속한 후.

 

> use mysql 

> grant all privileges on *.* to 'root'@'%' identified by '비밀번호';

> flush privileges;

 

이후 나간후에 다시 접속해보자

# mysql -u root -h 아이피 -p

 

접속이 된다면 성공,

 

만약 안된다면 my.cnf 를 의심해봐야 한다.(대체로  my.cnf 파일은  /etc/mysql/my.cnf 에 위치한다 없으면 직접 찾아야하고...;;)

 

참조문서 : http://blog.naver.com/PostView.nhn?blogId=ez_&logNo=140119374985

 

간혹 이럴땐 localhost 접속은 되는데 IP address 를 직접 입력할때 안되는 경우가 있다.

예) mysql -u root -h localhost -p    // 이걸로는 접속이 되는데

     mysql -u root -h 10.211.55.111 -p   // 이걸로는 접속이 안되는 경우가 종종 있다

     (10.211.55.111 가 현재 서버 IP주소일 경우)

 

원격 접속 시 발생하는 에러 메세지는 다음과 같다

ERROR 1045 (28000): Access denied for user 'sqoop'@'localhost' (using password: NO)

ERROR 2003 (HY000): Can't connect to MySQL server on '10.211.55.111' (111)

 

ERROR 1045  는 인증실패이고

ERROR 2003 은 접속에 실패한거다.

 

위의 참조문서에 따르면 다음과 같은 순서로 해결하면 된다.

ERROR 2003 에러는 점검리스트 중 (1) 부터 시작하고

ERROR 1045 에러는 점검리스트 중 (7) 부터 시작하자.

 

이하 '설정파일' 이라고 칭함은 'my.con' 파일을 의미한다.

(1) skip-networking : 설정되어 있다면 주석처리

 mysql 서버 실행시에 --skip-networking 옵션을 주거나, 설정파일 내에 skip-networking 이 있는 경우, 서버는 로컬에서의 유닉스 소켓 접속만을 허용하게 된다. 설정되어 있다면 해체한다.

 

 

(2) bind-address  :  0.0.0.0 으로 설정하면 모두 접근 허용

설정파일 내에 bind-address 값 또는 실행 옵션중 --bind-address 값이 127.0.0.1 또는 비활성화 되어 있는지 확인한다. 이는 listen과 관련된 TCP/IP 소켓의 바인딩을 어떤 IP로 할 것인지를 결정한다. 127.0.0.1 은 외부접속을 허용하지 않음을 의미한다. 이를 시스템에 할당된 특정 IP값으로 지정하거나 0.0.0.0 으로 지정하여, 시스템이 가지고 있는 모든 IP주소를 활용하도록 수정한다. 할당된 IP주소가 2개이상인 경우, 적절한 값을 지정하는 것이 일반적이다.

 

=================================== 대체로 여기까지 하면 완료된다

 

(3) port

TCP/IP 소켓 바인딩에 사용될 포트 번호를 확인한다. 기본 값은 3306 이지만, 보안상의 이유 또는 하나의 서버에 여러 개의 MySQL 서버를 구동하기 위해 변경한 경우가 있으니, 이 값을 확인한다. 실행 옵션은 --port=3306, 설정파일에서는 port=3306 과 같이 지정한다.

 

 

(4) listen여부 확인

$ netstat -na | grep 3306

위 명령어를 통해, 해당 포트로 LISTEN이 되고 있는지 확인한다. 확인할 수 없으면 1~3 까지를 다시 한 번 점검한다. 설정 값을 변경한 이후에는 서버를 반드시 재시작해야 한다. ( 포트 설정 값이 다른 경우에는 해당 포트 번호를 입력한다 )

 

 

(5) TCP/IP 소켓으로 접속 시도

mysql client를 로컬에서 실행하면 일반적으로 mysql.sock 파일을 통해 접속하는 것이 일반적이다.

위의 옵션들을 다 확인한 이후에는, 로컬에서 TCP/IP 소켓으로 접속을 시도해본다.

$ mysql -h 127.0.0.1 -P 3306 -u root -p

 

localhost와 127.0.0.1은 같은 이름이지만, localhost로 지정하는 경우에는 유닉스 소켓으로 접속을 시도하게 된다.

로컬에서 TCP/IP 접속이 실패한 경우, 1~4 까지를 다시 한 번 점검한다.

 

 

(6) 방화벽

로컬에서는 TCP/IP 소켓으로 접속이 잘 되는데, 원격지에서 안되는 경우 일단 텔넷으로 접속을 시도해본다.

$ telnet -h xxx.xxx.xxx.xxx -P 3306

 

1~5 까지는 정상적인데, 텔넷 접속이 불가능하다면 이는 방화벽에서 막고 있는 경우가 대부분이다. 방화벽은 접속을 시도하는 호스트의 로컬 방화벽, 접속 대상이 되는 서버의 방화벽, 그리고 해당 경로에 놓여있는 라우팅 내에서의 방화벽 등이 있을 수 있다.

- 로컬 방화벽 : 특정 outgoing 패킷이 제한당하고 있는지 여부를 확인한다.

- 서버 방화벽 : MySQL 서버가 사용하고 있는 포트에 대한 방화벽 옵션을 확인한다.

 

 

(7) user / host 조합 확인

접속할 때 사용하는 사용자 이름과 호스트 주소가 올바르게 등록되어 있는지 mysql 데이터베이스내에서 확인한다.

mysql> USE mysql;

mysql> SELECT user, host FROM user WHERE user='사용자이름';

 

host는 다음과 같이 지정한다.

- % : 모든 호스트로부터의 접속을 허용

- xxx.xxx.xxx.xxx : 특정 호스트로부터의 접속을 허용

- xxx.xxx.% 등 : 특정 대역으로부터의 접속을 허용

- 특정 이름 : 특정 호스트로부터의 접속을 허용 (skip-name-resolve를 사용하는 경우에는 사용 불가)

 

MySQL의 LIKE에 사용되는 구문과 같이, %를 통해 특정 대역 또는 전체 호스트를 지정할 수 있다.

예) 192.168.0.0/16 => 192.168.%

 

 

(8) 패스워드 확인

접속에 사용하고 있는 사용자/호스트/패스워드 조합이 올바른지 확인한다.

mysql> SELECT COUNT(*) FROM user WHERE user='사용자이름' AND host='호스트' AND password=PASSWORD('패스워드')

 

해당 사용자 이름에 대한 레코드가 여러 개 있다면, 그 중 가장 '특정한' 값을 지정한 레코드를 우선 사용하게 된다.

( 참조 : http://dev.mysql.com/doc/refman/5.0/en/connection-access.html 

 

예를 들어, user1@% 과 user1@192.168.0.1 의 레코드가 존재할 때, 192.168.0.1 호스트에서 user1 사용자로 접속을 시도하면, user1@%의 값을 사용하지 않고 user1@192.168.0.1의 값을 통해 인증을 수행하게 되므로, 해당 사용자 이름으로 여러 레코드가 있는 경우에는 권한 및 패스워드 설정에 보다 많은 주의를 요한다.

 

 

(9) FLUSH PRIVILEGES

user 테이블 및 권한에 관련된 테이블의 값을 추가/변경한 경우에는 반드시 아래 구문을 통해 서버가 새로운 인증 데이터를 사용하도록 한다.

mysql> FLUSH PRIVILEGES;

 

 

(10) skip-name-resolve

skip-name-resolve 옵션이 지정되지 않으면, MySQL 서버는 원격 접속하는 호스트의 IP를 DNS를 통해 이름을 확인하는 과정을 거치게 된다. 서버가 설치되어 있는 시스템의 DNS가 올바르게 설정되어 있지 않은 경우에, domain name resolving에 의해 접속 지연이 유발될 수 있으므로, 내부 네트웍에 설치된 서버인 경우에는 이 값을 활성화 시키는 것이 일반적이다.

 

접속을 시도하는 호스트의 IP가 DNS를 통해 이름이 얻어진 경우에는 IP가 아닌 이름으로 user 테이블을 참조하게 되므로, 이를 통한 혼동을 피하기 위해 지정하기도 한다.

 

 

(11) 그 외 특별한 상황들

MySQL은 4.1 부터 새로운 패스워드 해시 함수를 기본적으로 사용하고 있는데, 4.1 이전의 legacy 클라이언트/ODBC 커넥터들을 사용하는 경우에는 아래의 링크를 참조하여 서버의 secure-auth, old-passwords 등의 옵션을 적절히 조정하여 사용해야 한다.

http://dev.mysql.com/doc/refman/5.0/en/password-hashing.html

 

1~10의 과정을 전부 거쳤음에도 불구하고, 1045에러가 발생하는 경우에는 다음의 명령어를 통해 해당 사용자의 암호를 예전 방식의 해시 값으로 지정 후, 접속 테스트를 수행해본다. 드문 일이지만, MySQL 5 버전대의 mysql client가 old-password hashing을 사용하는 경우가 있었다.

mysql> SET PASSWORD FOR 'user'@'host' = OLD_PASSWORD('패스워드');

 

 

 

(12) 최후의 보루

1~11 까지의 점검 리스트에도 해당되지 않는 경우에는 MySQL 커뮤니티를 통해 도움을 구하는 것이 마지막 방법이다. :)

데이터베이스 사랑넷 MySQL 섹션 : http://database.sarang.net/?criteria=mysql

 

[출처] MySQL : 원격 접속이 안될 때|작성자 아미 : http://blog.naver.com/PostView.nhn?blogId=ez_&logNo=140119374985

반응형