반응형
처음에는 네비어 클라우드 플랫폼(NCP)에서 말하는 포트포워딩 이 무슨 의미인지 몰랐었다. 메뉴 뒤적거리고, 가이드를 여러 개 읽어본 뒤에야 조금 감이 잡혔다.

 

네이버 클라우드 플랫폼(NCP) 구조

간략하게 구조에 대해서 설명하겠다.

네이버 공식 가이드 : https://docs.ncloud.com/ko/database/database-9-10.html

파란색 부분이 공통 부분, 노랑+검정색이 각 인스턴스 설정이다

파란색 부분은 NCP 계정 내 사설 네트워크 영역이다. 처음 계정을 생성하면 NCP에서 제공하는 네트워크 영역이 할당된다. 예제에서는 106.x.x.x가 나에게 할당된 사설IP 영역이라고 보면 된다.

노란색 부분은 각 인스턴스에 대한 부분이다. 인스턴스는 NCP에서 제공하는 사설 네트워크 영역에 생성되고, 각 인스턴스별로 사설 네트워크 망에서 접근할 수 있는 비공인IP(사설IP)가 생성된다. 각 인스턴스에 접근하기 위해서는 먼저 106.x.x.x 네트워크에 접근해야한다. 이 때 사용되는 게 NCP의 포트포워딩이다. 우리가 자유롭게 지정하는 포트포워딩이 아니라, NPC 사설 네트워크 영역(106.x.x.x) 내에서 내가 생성한 특정 인스턴스로 접근할 수 있게 포트포워딩 해주는 것이다. 그렇기 때문에 22번(ssh)로 고정된다. (NCP가 말하는 포트포워딩이 내가 예상한 것이 아니라 처음에 많이 헤맸다.)

터미널을 통해서 인스턴스에 접근하고 싶다면 아래와 같이 하면 된다.

1. 인스턴스 생성 및 외부 포트 지정
2. ACG로 방화벽 설정 (내 컴퓨터의 IP로 22번 포트 접근 시 방화벽 통과하도록)
3. 터미널에서 서버 접속용 공인IP(106.x.x.x) + 외부포트(1024) 입력하여 ssh 방식으로 접근
4. (NCP) 접속 요청된 외부포트(1024)와 연결된 인스턴스(Server#1 WEB)으로 포트포워딩

 

이런 모습으로 접근된다.

- 내 로컬(PC) 터미널에서 접근 106.x.x.x:22 - NCP 포트포워딩 106.x.x.x:22 -> 1024로 포트 포워딩 - 포트포워딩 결과 : WEB서버 1024 = WEB 인스턴스를 가르킴

터미널 접근 방법&ACG 설정에 대한 포스팅은 아래를 참고하면 된다. (예제에서는 0.0.0.0/0로 모든 IP에 대해 열어놨지만, 각자 개인 IP를 넣기를 바란다.)

https://prohannah.tistory.com/84


NCP에서 서버 외부 접근을 위해 공식적으로 제안하는 방법이다.

  1. 프라이빗 네트워크 내에서 사설 도메인(혹은 IP)를 이용해서 접근
  1. SSL VPN 상품을 이용하여 접근 (안알아봄)
  1. 공인IP를 이용하여 접근 (ACG 설정만 되어 있다면 접속 가능

DB 권한 설정 (서버에 직접 DB를 설치하는 경우)

AWS 같은 경우는 모든 인스턴스에 공인IP를 제공해주기 때문에 이런 부분에 대해 크게 신경쓰지 않았는데, NCP에서는 공인IP를 하나만 무료로 제공해주기 때문에 Web 서버에만 공인IP를 할당했다. 그리고 DB 서버는 사설IP를 이용하여 접근하려고 한다.

참고로 DB는 Server 인스턴스 생성 시 mariaDB 이미지를 선택하였다. NCP 에서 제공하는 RDS 인스턴스를 생성한 경우에는 DB 계정 설정을 따로 하지 않아도 된다. 나 같은 경우 RDS에서 mariaDB 이미지를 따로 제공하지 않아서 일반 DB로 생성했다. 하지만... mariaDB에서 제공하는 특정 기능을 사용하지 않는 경우 RDS 사용을 권장한다. 설정이 편하고 가격이 비교적 저렴하기 때문이다. 하지만 서비스가 복잡하고 개별 설정이 많은 경우에는 잘 모르겠당 :)

DB 계정 권한 설정하는 방법은 아래와 같다. 참고로, RDS로 생성 시에는 옵션으로 외부에서 접근할 수 있도록 선택이 가능하다. 그래서 아래와 같이 별도로 작업하지 않아도 된다.

# : 서버 bash 명령
<mysql> : mariaDB 접속 후 명령


1. mysql root 계정으로 로그인하여 password 설정 (보안을 위해서 설정함)
# mysql -u root
<mysql> select password('비밀번호'); // 내용복사
<mysql> update mysql.user set password= '복사한암호화된비번' where user = 'root';

2. 별도 계정 생성하기 ('%'는 계정에 접근 가능한 Host를 제한하지 않겠다는 뜻)
<mysql> CREATE USER 'myuser'@'%' IDENTIFIED WITH mysql_native_password BY '비밀번호';
// 혹시 위 명령어가 수행되지 않는다면 계정을 먼저 생성 후, 1번 방법으로 비밀번호를 설정해보자
// CREATE USER 'myuser'@'%' IDENTIFIED WITH mysql_native_password;
// update mysql.user set password= '복사한암호화된비번' where user = 'myuser';

3. 유저의 접근 권한 부여
<mysql> GRANT ALL PRIVILEGES ON *.* to 'myuser'@'%' IDENTIFIED BY '비밀번호';
//grant all on *.* to 'doctor'@'%' with grant option;

4. 사용할 데이터베이스도 미리 생성해두기
<mysql> create database 디비명;

5. mysql 설정 적용
<mysql> FLUSH PRIVILEGES;
// 그래도 안되면 mysql 재부팅

6. 환경파일 수정 (bind-address 주석처리)
<mysql> quit; //mysql 밖으로 나간다.


// 환경 파일은 아래 위치에 있다.
// /etc/my.cnf - CentOS
// /etc/mysql/my.cnf - Ubuntu.
// 네이버 DB 환경설정 정보 : https://docs.ncloud.com/ko/database/database-1-1.html
# vim etc/mysql/my.cnf

i // i를 누르면 편집 모드로 된다.
// NCP 같은 경우 bind-address가 127.0.0.1로 설정되어 있다.
// 계정에서 접근 가능한 HOST 제한을 풀어도 mysql 설정에서 localhost만 가능하게 설정되어 있는것이다.
// 환경파일 접속해서 bind-address 주석처리 혹은 0.0.0.0으로 변경하자.

[esc] 버튼 클릭, :wq! // [esc] : 편집모드를 종료하고, :wq! : 파일 저장 후 밖으로 나가기.

사실 DB에 접근하지 못하는 이유가 mariaDB 설정 문제라고 생각했기 때문에(반은 맞다), DB 설정을 잘 해놓고도 많이 헤맸다. 그리고 ssh 접근 시 포트포워딩을 한번 더 해야했는데, 나는 이 설정을 NCP에서 해야하는 줄 알았었다. NCP에서 말하는 포트포워딩과 ACG의 의미도 헷갈렸다. 아니 나는... 내가 일반적으로 쓰는 포트포워딩인 줄 알았지...

팁 : 서버에 접근해서 maraiDB(mysql)가 3306 포트를 잘 바라보고 있는 지 확인해보기 (안해도됨)

# netstat -ntlp | grep mysqld
tcp6       0      0 :::3306                 :::*                    LISTEN      46344/mysqld

외부에서 DB 서버에 접근하기

NCP 공식 가이드 : https://docs.ncloud.com/ko/database/database-1-1.html

  • 동일 네트워크 영역에서 접근

    같은 네트워크 망에 있는 서버#1(WEB)에서 서버#2(DB)로 접근하는 경우를 말한다. 이 때는 WEB 서버에서 DB 서버의 비공인 IP로 접근하면 된다. DB 서버에서 외부 접근이 가능하도록 Database 계정의 접근 권한을 열어 놓고(RDS는 안해도 된다), DB 서버의 ACG에서 WEB서버 접근을 허용하면 된다.

    WEB서버에서 DB 접속이 가능한 지 ping을 날려보자.

    root@huray-checkup:~/doctor-answer# telnet 10.41.155.120 3306
    Trying 10.41.155.120...
    //대충 접속 잘 됐다는 메시지

    위에 NCP 공식 가이드 [서버접속 설정 및 확인] 부분을 읽고 아래와 같이 접속하면 된다.

    기본접속
    host : 10.30.x.x (비공인IP)
    port : 3306
    user : mysql 유저
    password : mysql 패스워드 (이때 유저는 localhost권한이 있어야함)

     

  • 외부에서 접근

    DB 권한 설정 및 ACG 설정이 되어있다고 가정하겠다. 같은 사설 네트워크 망이 아닌 곳, 예를 들면 나의 로컬 PC에서 DB에 접근하고 싶을 때의 포트포워딩 방법이다.

    기본접속
    host : 127.0.0.1
    port : 3306 (DB 포트, 기본 3306)
    user : mysql 유저
    password : mysql 패스워드
    ---
    SSH 접속
    host : 106.x.x.x (네이버 서버접속용 공인IP)
    port : 2024 (네이버 포트포워딩 번호)
    user : root (서버 계정 user)
    auth method : public key (pem 이용)
    passphrase : 서버 계정 비번

    Springboot와 같은 웹 어플리케이션에서 DB로 접근할 때, 동일 서버에서는 DB의 사설IP로 붙고 로컬에서는 ssh 터널링을 하면 된다. 하지만 springboot에서 ssh 터널링은 지원하지 않으므로 jcraft를 이용해야 한다.


결론 : 그냥 공인IP를 구매하도록 하는 것을 추천한다. AWS도 RDS는 기본적으로 public IP를 제공해준다. 사설 IP를 이용하는 것이 보안에 더 유리하겠지만, 운영기가 아니라면 그냥 공인IP를 돈 내고 추가로 할당받는 것도 좋은 것 같다.

NCP와 AWS가 서로 동일한 기능에 대해서 표현하는 이름이 달라서 많이 헤맸다. 일단 NCP가 말하는 포트포워딩의 의미가 내가 예상하던 것이 아니어서 헤맨 것도 크다. NCP에서는 충분히 친절한 가이드를 제공하고 있지만 초보자가 엔지니어링 지식을 슥듭할 수 있게끔 부가 정보를 더 주었으면 좋을 것 같다. 규모가 있는 곳은 서버 엔지니어가 있을 수 있지만, 작은 서비스 회사의 경우 백엔드 개발자들이 알음알음 서버 설정을 하기 때문에 한 걸음도 더디게 나아가고 있다. 나만 그럴 수도...

반응형