본문 바로가기
OS & Infra/Windows

윈도우 환경에서 MySQL 방화벽 포트 설정

by Dev. Jkun 2011. 12. 19.
반응형
Test OS (테스트 환경) : Windows Server 2008 R2 Standard Edition
Test DBMS (테스트 데이터베이스) : MySQL 5.1.57
최초 Window 서버에 구성할때는 WPI (Microsoft Web Platform Installer) 로 구성하였다.

아 뒤지는 줄 알았다. 장장 몇시간을 삽질한 것인가..
간만에 어마어마하게 짜증나게 삽질한 결과를 포스팅한다.

방화벽 인바운드 규칙 설정 완료.
로컬 컴퓨터에서 아웃바운드 점검 이상도 없고..
mysql 데이터베이스에 user, db, host 모두 설정완료. grant 까지
인바운드 규칙에 `원격` 이라고 써진 항목에는 모두 사용, 허용으로 했는데도... 아 뒤지는 줄.. 개짜증...

mysql 설정파일 (mysql.ini) 에서도 호스트설정및 네트워크 액세스 모두 설정완료.
아무리 봐도 설정에는 문제가 없는데...

어메이징 빤따스띡하게 짜증나는게.. 네트워크를 모르는 내 죄....
그러다 보니 인바운드 규칙 설정프로토콜 및 포트 다음과 같은 부분이 있었다.
최초 새 규칙을 생성하여 3306 에 허용을 주었다면 원격포트에는 만일 접속할 특정 IP 가 있다면 특정포트로
범위를 지정하고, 아니라면 모든 포트를 허용해준다.
개인적으로는 테스트 서버를 구성하는 차원이었기에 모든포트로 설정하였다.
뒤지게 구글링, 검색질 해봤는데도 못찾았거나.. 윈도우 환경에서 MySQL 데이터베이스 서버를 구성한
사람들도 나와 같은 재수없는 상황을 겪었었다.


뒤지게 삽질하고 캡쳐까지 떠서 포스팅해준 사람에게
댓글은 센스!

---------------------------------------------------------------------------------------------------


그리고 아래 글이 그래도 잘 정리되어 있었기에.. (왠지 어마어마하게 삽질한.. 아니면.. 고수이시거나..)
원문으로 바로가기
 

로컬에서는 잘 접속되는 MySQL 서버에, 원격지에서 접속이 안되는 경우가 있다.

이럴 때는 다음의 내용을 테스트 해보며 점검해보면 문제점을 확인할 수 있다.



원격 접속 시 겪을 수 있는 에러 메세지는 다음과 같다.


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

ERROR 1045 (28000): Access denied for user 'user'@'host' (using password: ...)


ERROR 2003 은 접속에 실패한 경우로, 아래 점검 리스트 중 (1)부터 시작한다.

ERROR 1045 는 인증에 실패한 경우로, 아래 점검 리스트 중 (7)부터 시작한다.




* 설정 파일(my.cnf / my.ini)보다 실행시 주어지는 옵션의 우선순위가 높으니, 설정 파일과 함께 실행 옵션을 면밀히 살펴보는 것이 중요하다.


(1) skip-networking

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



(2) bind-address

설 정 파일 내에 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여부 확인

shell> netstat -na | grep 3306

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



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

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

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

shell> mysql -h 127.0.0.1 -P 3306 -u root -p


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

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



(6) 방화벽

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

shell> 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


원문출처 : http://blog.naver.com/ez_?Redirect=Log&logNo=140119374985

 

mysql,mysql원격접속,mysql gui,mysql외부접속,mysql3306,mysql telnet,window 환경에서 mysql,window2008,window2008 mysql,윈도우2008,윈도우2008 mysql

반응형

댓글