'데이터 엔지니어'로 성장하기

정리하는 걸 좋아하고, 남이 읽으면 더 좋아함

기타/Xen,Proxmox

Proxmox) 외부에서 private ip 접근이 가능하다고? (openvpn)

MightyTedKim 2025. 5. 6. 01:31
728x90
반응형

스터디를 진행하는데

각자 집에 설치한 proxmox에 접속해 테스트하기가 쉽지 않더라고요

그래서 openvpn을 이용해서 그 환경을 만들어 봤습니다.

 

먼저 Openvpn이 무엇인지 알아보겠습니다.

 

1. OpenVPN이란?

OpenVPN은 오픈소스 기반의 가상 사설망(VPN) 소프트웨어로,

인터넷을 통해 두 네트워크 또는 사용자와 네트워크 간에 암호화된 보안 통신 터널을 만들어줍니다.

 

활용 사례설명

🏠 원격 근무 집이나 외부에서 회사 내부 네트워크에 안전하게 접속
🏢 지사 간 연결 본사와 지사를 인터넷을 통해 하나의 내부 네트워크처럼 연결
☁️ 클라우드 보안 접속 AWS, Azure 등 클라우드 서버와의 안전한 접속 통로 제공
🧑‍💻 관리자 접속용 외부에서 Proxmox나 사설 서비스 접속 시 보안 강화
📶 공공 와이파이 보호 카페, 공항 등의 와이파이에서도 개인 정보 보호 가능

> 밖에서도 집의 내부 네트워크에 접속하려는 저에게 딱 맞습니다.

 

작동 원리는 간단하게 아래와 같습니다. 

  1. 클라이언트가 OpenVPN 서버에 접속 시도
  2. TLS 기반 인증서 교환 및 핸드셰이크 수행
  3. 암호화된 터널 생성
  4. 클라이언트의 트래픽이 VPN 서버를 통해 내부망으로 전달됨
  5. 외부에서는 클라이언트의 실제 IP나 데이터 내용을 알 수 없음

 

2. Openvn과 Proxmox

Openvpn이 적합한건 알겠고, Proxmox 공식 문서를 통해 설치합니다.

 

https://pve.proxmox.com/wiki/OpenVPN_in_LXC

 

준비사항은 아래와 같습니다.

1. LXC - Openvpn server

2. OpenVpn Client

3. Openvpn 443 포트포워딩 (공유기 NAT)

 

 

1. LXC - Openvpn server

- openvpn을 설치하기 위한 lxc를 준비

# 템플릿 목록 갱신
$ pveam update #Proxmox VE Application Manager

# 템플릿 다운로드
$ pveam download local  debian-12-standard_12.7-1_amd64.tar.zst
downloading http://download.proxmox.com/images/system/debian-12-standard_12.7-1_amd64.tar.zst to /var/lib/vz/template/cache/debian-12-standard_12.7-1_amd64.tar.zst
--2025-05-05 21:53:25--  http://download.proxmox.com/images/system/debian-12-standard_12.7-1_amd64.tar.zst
Resolving download.proxmox.com (download.proxmox.com)... 103.76.41.50, 2400:ed00:3::2
Connecting to download.proxmox.com (download.proxmox.com)|103.76.41.50|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 126515062 (121M) [application/octet-stream]
Saving to: '/var/lib/vz/template/cache/debian-12-standard_12.7-1_amd64.tar.zst.tmp_dwnl.3455769'
     0K ........ ........ ........ ........ 26% 14.4M 6s
 32768K ........ ........ ........ ........ 53% 44.4M 3s
 65536K ........ ........ ........ ........ 79% 11.2M 1s
 98304K ........ ........ ........         100% 19.9M=7.0s
2025-05-05 21:53:33 (17.1 MB/s) - '/var/lib/vz/template/cache/debian-12-standard_12.7-1_amd64.tar.zst.tmp_dwnl.3455769' saved [126515062/126515062]
calculating checksuhttp://m...OK, checksum verified
download of 'http://download.proxmox.com/images/system/debian-12-standard_12.7-1_amd64.tar.zst' to '/var/lib/vz/template/cache/debian-12-standard_12.7-1_amd64.tar.zst' finished

# LXC 생성, ex. Target IP: 192.168.219.201
$ pct create 150 /var/lib/vz/template/cache/debian-12-standard_12.7-1_amd64.tar.zst \
  -storage local-lvm \
  -hostname openvpn \
  -net0 name=eth0,bridge=vmbr0,ip=192.168.219.201/24,gw=192.168.219.1 \
  -cores 1 -memory 512 \
  -unprivileged 0 \
  -features nesting=1

 

- openvpn을 설치하기 위한 lxc를 준비

# pxe host에 생성된 150번 VM에 cgroup 추가
$ echo "lxc.cgroup2.devices.allow: c 10:200 rwm" >> /etc/pve/lxc/150.conf
$ echo "lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file" >> /etc/pve/lxc/150.conf

$ cat  /etc/pve/lxc/150.conf
arch: amd64
cores: 1
features: nesting=1
hostname: openvpn
memory: 512
net0: name=eth0,bridge=vmbr0,gw=192.168.219.1,hwaddr=BC:24:11:B5:CA:E5,ip=192.168.219.201/24,type=veth
ostype: debian
rootfs: local-lvm:vm-150-disk-0,size=4G
swap: 512
lxc.cgroup2.devices.allow: c 10:200 rwm
lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file

# LXC 시작
$ pct start 150 #Proxmox Container Tool

# LXC 접근
$ pct exec 150 -- bash
## 비밀번호 설정 
$ passwd 
## ssh, root 접근 허용
$ nano /etc/ssh/sshd_config
PermitRootLogin yes
PasswordAuthentication yes

 

- 이제 openvpn을 설치

원래는 openvpn 설치할 때 인증서 세팅이 있지만, 간단한 script로 정리가 되어 있음  :) 

 

저는 다만 기본 포트인 1194가 아닌 443을 선택했습니다.

  • 1194/UDP는 **"OpenVPN 전용 포트"**로 너무 유명
  • 일부 ISP(통신사), 호텔, 공공 와이파이, 사무실 네트워크 등에서 이 포트를 차단
  • 반면 443/UDP는 HTTPS 트래픽처럼 보이기 때문에 거의 막히지 않음
# lxc 접근
$ pct exec 150 -- bash
# apt update
# apt dist-upgrade
# apt install openvpn git

# git clone https://github.com/Nyr/openvpn-install
# cd openvpn-install
# bash openvpn-install.sh
Welcome to this OpenVPN road warrior installer!

This server is behind NAT. What is the public IPv4 address or hostname?
Public IPv4 address / hostname [125.178.111.140]:

Which protocol should OpenVPN use?
   1) UDP (recommended)
   2) TCP
Protocol [1]:

What port should OpenVPN listen on?
Port [1194]: 443 <----------

Select a DNS server for the clients:
   1) Default system resolvers
   2) Google
   3) 1.1.1.1
   4) OpenDNS
   5) Quad9
   6) AdGuard
   7) Specify custom resolvers
DNS server [1]:

Enter a name for the first client:
Name [client]:

 

 

Openvpn이 잘 설치되어 있는지 확인합니다.

$ systemctl | grep openvpn
  openvpn-iptables.service                                          loaded active exited    openvpn-iptables.service
  openvpn-server@server.service                                     loaded active running   OpenVPN service for server
  openvpn.service                                                   loaded active exited    OpenVPN service
  system-openvpn\x2dserver.slice                                    loaded active active    Slice /system/openvpn-server

$ ps aux | grep vpn
nobody      1655  0.0  1.7  13080  9088 ?        Ss   13:03   0:00 /usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --config server.conf
root        1664  0.0  0.3   3324  1664 pts/3    S+   13:04   0:00 grep vpn

$ ss -tulnp | grep 443
udp   UNCONN 0      0      192.168.219.201:443       0.0.0.0:*    users:(("openvpn",pid=2008,fd=6))

 

이제 openvpn  server 설치는 모두 완료되었습니다.

 

2. OpenVpn Client

ovpn을 만들어보죠

아까 설치할 때 이용했던 bash script를 실행합니다. (ovpn_test로 만듦)

$ bash openvpn-install.sh
OpenVPN is already installed.

Select an option:
   1) Add a new client
   2) Revoke an existing client
   3) Remove OpenVPN
   4) Exit
Option: 1

Provide a name for the client:
Name: ovpn_test
.+........+....+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+...+......+.+...........+..........+.....+............+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*........+...+.........+..+......+.......+...+............+...+..+............+...+.......+......+..+.......+.....+.+.........+......+........+.+.....................+...+.....+....+..+...+...+.......+......+............+............+..+.+...+......+........+......+....+..+.+........+......+.........+......+...+.+..+.............+.................+...+.......+..+.....................+.........+...+....+...+..+.+.....+.......+..+..........+...+..+...+.+............+........+.+.....+....+..............+.......+...+..+...+..........+......+..+.........+..........+.....+.........+....+.....+......+.+...+.....+.+.....+..........+...........+.+..+..........+...........+.......+.....+....+..................+.....+...............+.......+......+...............+.....+..........+...+.....+.........+..........+......+..+...+.+......+...+..+.........+...+.......+.....+..........+........+..........+..+.+........+....+..+....+.........+.....+.+..............+.......+.........+............+...+.........+..+..........+...+...............+..+.+...+..............+......+.+......+..+...+.........+.+..............+......+...+....+..+..........+.....+.........+....+........+....+...........+.............+.....+......+.+...+...............+.....+.......+........+.+.....+......+.......+...+..+.+..............+.......+.......................+.......+......+..+.+..+...+....+...+........+....+......+.....+....+..+......+.........+...+.+..............+......+.......+.........+.....+......+.......+..+...+...+....+....................+.+..+................+..+....+......+...+..+.......+..................+........+....+...............+...+...+...........+....+..+.......+.....+...+...+....+.....+.+.........+..+.........+.+......+..+...+...+.........+......+.+.....+.+.....+...+..........+.........+..+..................+..........+..+.+.........+...........+....+........+......+...............+......+....+.........+..+.........+....+...+............+...+...+.....+............+...+......+.............+..+.+...+.........+........+.........+...+.+............+...+......+.....+...+......+......+.+..+.+..+.......+..+.+..+.............+........+......+..........+.....+..........+...+...+..+.+.........+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
............+...+.+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...........+...+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+.+........+.......+..+............+...+.+......+...............+......+...+.....+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-----

Notice
------
Private-Key and Public-Certificate-Request files created.
Your files are:
* req: /etc/openvpn/server/easy-rsa/pki/reqs/ovpn_test.req
* key: /etc/openvpn/server/easy-rsa/pki/private/ovpn_test.key

Using configuration from /etc/openvpn/server/easy-rsa/pki/6ddcf7d0/temp.6.1
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'ovpn_test'
Certificate is to be certified until May  3 16:06:24 2035 GMT (3650 days)

Write out database with 1 new entries
Database updated

Notice
------
Inline file created:
* /etc/openvpn/server/easy-rsa/pki/inline/private/ovpn_test.inline


Notice
------
Certificate created at:
* /etc/openvpn/server/easy-rsa/pki/issued/ovpn_test.crt


ovpn_test added. Configuration available in: /openvpn-install/ovpn_test.ovpn

$ ls | grep ovpn_test
ovpn_test.ovpn

 

저는 윈도우로 테스트했습니다. 아이패드에서도 정상 실행됩니다. 

클라이언트 다운로드: https://openvpn.net/client/ 

드래그앤 드롭하면 됩니다.

 

아직은 방화벽을 오픈하지 않아서, 무한로딩이 될겁니다.

3. Openvpn 443 포트포워딩 (공유기 NAT)

이제 확인하려면 내 고정 IP를 외부에 오픈해야해요.

저는 LG U+ 공유기를 사용하고 있고, NAT에서 포트포워딩을 해줍니다

 

이제 테스트해볼게요

 

PC에서도, 태블릿에서도 정상연결됩니다.

이제 잘 작동되는지 확인해야죠. 아래는 태블릿(셀룰러)에서 접속한 proxmox입니다. 정상 접근 가능한지 확인했습니다.

 

지금까지 proxmox에 openvpn이 필요한 이유와 설치 및 연결 방법까지 확인해봤습니다.

728x90
반응형