외부에서 mysql에 접속이 가능하게끔 하고 싶습니다. 어떻게 하면 좋을까요? 제 디비 서버는 172.30.1.36에 있고, 172.30.1.8에서 접근을 하려고 합니다. 클라이언트에는 dbeaver가 깔려 있습니다.

 


 제가 접속하려는 계정은 cho입니다. 

 

 

 host가 %인 것으로 보아서는 외부에서도 접근이 가능하게끔 하려던 모양입니다.

 

 

 해당 계정으로 접속해 보겠습니다.

 

 

 그러면, 뜬금없이 이런 메세지가 나옵니다. 영어를 해석해 보면, last packet이 서버에 갔지만, 드라이버가 어떠한 패킷을 응답받지 않았다고 합니다. 가는 건 문제가 없었다면, 오는 게 문제였을까요? 아니면, 중간에 차단이 일어났을까요?

 

 

 방화벽이 의심스러우니, 방화벽부터 보겠습니다. 이미 172.30.1.0/24에 대해서 3306으로 들어오는 packet을 허용한다는 규칙을 넣으려니까, 이미 규칙이 존재한다고 합니다. 그래서, 리스트를 뽑았더니, 3306이 허용 리스트에 들어가 있습니다. 그러면, 최소한 제 클라이언트 주소인 172.30.1.8에서 mysql 서버인 172.30.1.36에 접속을 할 때, 방화벽에는 걸리지는 않는다는 소리가 됩니다.

 

 당연하게도, 모든 주소에서 3306 포트를 막지 않게 하려면 ufw allow 3306 이렇게만 써 주시면 됩니다. 저는 주소 172.30.1.0/24에서, 3306번 포트를 타고 들어오는 income을 허용하게 했으므로, ufw를 후보에서 배제할 수 있습니다. mysql-server 자체에서 막았다는 이야기가 되는데, 정말 그럴까요?

 


 netstat으로 어떻게 된 건지 보도록 합시다.

 

 

 3306을 필터링 걸어보면, 127.0.0.1:33060과, 127.0.0.1:3306이 있는데요. 로컬에서만 돌아갈 거 같은 쎄한 느낌이 있습니다. 서버 변수에 그러한 것들이 있는지 보도록 하겠습니다.

 

 

 show variables like 구문을 치면 알 수 있습니다. 뒤에 '%bind%'라고 붙였는데요. 이는 변수 이름이 bind를 substring으로 가지는 경우를 모두 출력합니다. bind_address와, mysqlx_bind_address가 보이는데요. 둘 다 127.0.0.1이 적혀져 있습니다. 이 변수에 대한 설명은 공식 문서의 이 부분에 잘 나와 있습니다.

 

 대충 읽어보면, 이 값에 따라서, mysql server가 accept를 할 건지 denied를 할 건지 결정이 된다는 내용입니다. 이 값이 127.0.0.1이였기 때문에 local에서 접속하는 것 말고는 허용되지 않았던 셈입니다.

 


 ubuntu에는 /etc/mysql/mysql.conf.d 밑에, mysqld.conf가 있습니다. 이 파일을 건드려 보겠습니다.

 

 

 여기서, bind-address를 0.0.0.0으로 바꾸겠습니다. 문서에 따르면, 이것은 ipv4 인터페이스에서의 모든 요청을 허용합니다.

 

 

 아무튼, 이렇게 하시고, 다시 mysql 서비스를 재시작 합시다.

 

 

 그리고 netstat -ntlp 명령 결과를 grep 3306에 파이핑 처리를 하면, 위와 같이 나옴을 볼 수 있습니다.

 

 

 mysql에 접속해서, bind를 포함하는 변수들을 보았을 때, bind_address가 0.0.0.0이 나오는 것도 볼 수 있습니다.

 

 

 dbeaver로 접속을 하실 때, allowPublicKeyRetrieval을 True 옵션으로 주고 접속해 봅시다.

 

 

 그러면, 서버에 아주 잘 접속됨을 확인할 수 있습니다.