Contents

Public IP 활용하기 - 1

Nginx Proxy Manager를 이용한 Reverse Proxy

Public IP가 없는 PC에 띄워놓은 서비스에 접근하기 위한 방법으로 VPNReverse Proxy를 활용할 수 있습니다. VPN 서버를 구축하고 활용하면 물리적으로 떨어져 있는 컴퓨터를 같은 Local Network에 있는 것처럼 사용할 수 있고, Reverse Proxy를 같이 활용하면 Public IP가 없는 컴퓨터에 VPN 연결 없이 접근 가능합니다. 이 글에서는 Oracle Cloud, DNS/DDNS, Nginx Proxy Manager를 소개합니다.

Oracle Cloud

Oracle cloud에서는 가볍게 쓸만한 Resource를 평생 무료로 제공해줍니다. 그리고 고정 Public IP도 제공해 줍니다. 제공되는 Resource로 큰 작업을 수행하기는 어렵지만, 개인용 VPN 서버와 Reverse Proxy 역할을 하기에는 충분합니다.

제공하는 Resource

  • 2개 머신 각각 1/8 OCPU 및 1GB 메모리
  • 2개 머신 총 100GB Block Storage
  • 2개 머신 총 10TB Network 사용량

가입 및 초기 설정

가입 및 초기 설정을 자세하게 적은 Blog 링크를 소개합니다.

추가 수신 규칙 설정

초기 설정을 수행한 경우, http(80,tcp), https(443,tcp) 포트를 열어주었을 것입니다. 추가적으로 Nginx Proxy Manager동작 확인을 위한 81 tcp포트를 열어 줍니다. 동작 확인 후에는 81번 포트는 닫아 줍니다.

DNS/DDNS

초기 설정을 수행한 경우, Public IP를 하나 할당 받았을 것입니다. 이 Public IP를 Domain Name으로 접근하기 위해서는 2가지 방법이 있습니다.

DNS

Godaddy, 가비아와 같은 곳에서 Domain Name을 구매할 수 있습니다. Domain Name은 Domain(.io, .ai, .xyz, .kim, …)에 따라서 가격이 다릅니다. 좋은 Domain Name은 짧고 기억하기 쉬워야 합니다. 하지만 대부분 좋은 Domain Name은 이미 사용중 입니다. 적절한 Domain Name이 생각나지 않거나, 비용이 부담스러운 경우에는 DDNS를 사용할 수 있습니다. DDNS를 사용하면 Domain Name이 길어지는 단점이 있습니다.

DDNS

무료로 DDNS를 제공하는 Duck DNS가 있습니다. 이곳에서 회원가입을 하면 DDNS를 5개까지 등록할 수 있습니다. 예를 들어 example로 등록하면, example.duckdns.org를 얻게 됩니다. example.duckdns.orgSubdomain을 추가해서 blog.example.duckdns.org를 만들 수 있습니다.

Nginx Proxy Manager

Reverse Proxy로 많이 사용되는 nginx를 사용하기 쉽게 GUI로 조작가능한 도구입니다. Nginx Proxy Manager를 사용하지 않고 nginx만 사용하면 reverse proxy를 위해서 config을 관리해야하고, SSL인증서를 받기 위해서 certbot도 알아야 합니다.

clear iptable

Oracle machine에는 iptable에 설정된 기본적인 규칙이 있습니다. 이 규칙을 삭제하지 않으면, Nginx Proxy Manager에 접근하지 못할 수 있습니다.

1
2
3
4
sudo iptables -F
sudo iptables -X
sudo netfilter-persistent save
sudo netfilter-persistent reload

설치

다른 docker-compose.yml과 겹치지 않게 directory를 만들어 줍니다.

1
mkdir ~/npm; cd ~/npm

아래의 명령어를 실행하여 docker-compose.yml을 작성합니다. 공식 문서와 다른점은 network_mode"host"입니다. docker-compose up -d전에 Load Balancing기능을 위해서 사용할 port를 ports부분에 적어주어야 하지만, "host"으로 설정해 주면 ports에 적지않아도 언제든지 어떤 port나 Load Balancing 설정이 가능하기 때문입니다. 추가적으로 db의 MYSQL_PASSWORD를 변경하는 경우에는 app의 DB_MYSQL_PASSWORD도 변경해야 합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
cat > docker-compose.yml << EOF
version: "3"
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: always
    network_mode: "host"
    #ports:
    #  # Public HTTP Port:
    #  - '80:80'
    #  # Public HTTPS Port:
    #  - '443:443'
    #  # Admin Web Port:
    #  - '81:81'
    environment:
      # These are the settings to access your db
      DB_MYSQL_HOST: localhost
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "npm"
      DB_MYSQL_NAME: "npm"
      # If you would rather use Sqlite uncomment this
      # and remove all DB_MYSQL_* lines above
      # DB_SQLITE_FILE: "/data/database.sqlite"
      # Uncomment this if IPv6 is not enabled on your host
      # DISABLE_IPV6: 'true'
    volumes:
      - /home/ubuntu/npm/data:/data
      - /home/ubuntu/npm/letsencrypt:/etc/letsencrypt
    depends_on:
      - db
  db:
    image: 'jc21/mariadb-aria:latest'
    restart: always
    network_mode: "host"
    environment:
      MYSQL_ROOT_PASSWORD: 'npm'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'npm'
    volumes:
      - /home/ubuntu/npm/mysql:/var/lib/mysql
EOF

인증

Browser에서 http://<Public IP>:81으로 접속합니다. 초기 email/password는 다음과 같습니다. 로그인 후에는 새로운 email/password로 설정할 수 있습니다.

Info
Email: admin@example.com
Password: changeme

사용

처음으로 설정해볼 것은 Nginx Proxy Manager를 Public IP가 아닌 Domain Name으로 접근해보는 것입니다. 아래 사용예시는 DDNS에서 Public IP를 example.duckdns.org으로 등록했다고 가정했습니다.

  • Main Page에서 Proxy Hosts를 누릅니다.
  • 오른쪽 상단에서 Add Proxy Host를 누릅니다.
  • Details에 아래와 같이 입력합니다.
    /nginx-proxy-manager/details.png
    Details
  • SSL에 아래와 같이 입력합니다.(Email입력란에는 자신의 Email을 입력합니다.)
    /nginx-proxy-manager/ssl.png
    SSL
  • Save를 누릅니다.

Browser에서 https://npm.example.duckdns.org으로 접속합니다. Nginx Proxy Manager 로그인 화면이 보이면 성공입니다. 81번 포트를 닫아 줍니다.

동작 원리

Reverse Proxy동작 원리에 집중하기 위해서 SSL 설명은 생략했습니다.

  • Browser에서 http://npm.example.duckdns.org으로 접속을 시도합니다.
  • DNS서버는 Domain Name 주소를 해석하여 등록된 IP를 알려줍니다.
  • Browser는 DNS서버로 부터 해석된 IP주소 80번 포트(http)로 Request를 전달합니다.
  • Nginx는 80번 포트에서 Listen하고 있고 Request를 전달받습니다.
  • Nginx는 Request의 Subdomain을 확인합니다.
  • Subdomain의 규칙을 확인하고 127.0.0.1:81으로 Request를 전달합니다.
  • 81번에서 Listen하고 있는 Nginx Proxy Manager의 Admin Web이 응답합니다.

정리

이번 글에서는 Oracle Cloud에 Nginx Proxy Manager를 설치하고 사용하여 Reverse Proxy를 설정하는 것을 소개하였습니다. Public IP가 없는 머신으로 Request를 전달하기 위해서는 VPN 설정이 필요합니다. VPN Server 구축과 VPN IP으로 Reverse Proxy 설정은 다음글에서 소개합니다.