1. 서론
나의 앱 서버를 외부에 노출시키게 되면 보안상의 문제로 원치 않는 정보를 탈취당할 수 있다. 따라서 VPN 서버만을 외부에 노출하고, 인가된 사용자만 내부 리소스에 접근할 수 있도록 설정할 수 있다. 대략 과정은 아래와 같다.
단말(휴대폰) ↔ VPN 서버 ↔ 앱 서버 ↔ DB 서버
2. DDNS 설정
하지만 위에서 생략된 부분이 있다. 바로 공유기에 의해 외부망과 내부망으로 나뉜다는 점이다. 따라서 정확히 다시 그리면 다음과 같다.
단말(휴대폰) ↔ VPN 서버로 포트포워딩된 공인 IP ↔ 공유기 ↔ VPN 서버 ↔ 앱 서버 ↔ DB 서버
여기서 문제가 되는 점은, 공인 IP는 유동적으로 변한다는 것이다. 따라서 단말에서 매번 IP 설정을 바꿔줘야 하는 번거로움이 있다.
다행히도 iptime에서는 DDNS라는 서비스를 제공한다. DNS는 도메인을 IP로 바꿔주는 정적인 자료라면, DDNS는 도메인을 유동 IP로 바꿔주는 역할을 한다. 할당된 공인 IP가 변하면 자동으로 업데이트되는 것이다.
주소창에 192.168.0.1을 입력 후 로그인하면 iptime 관리자 창이 뜬다.

여기서 위처럼 DDNS 설정을 하면 된다.

이렇게 '정상 등록' 이라는 문구가 떠야 제대로 등록된 것이다. 다른 사용자가 사용 중이라던가 사용할 수 없는 사용자 ID 등의 메세지가 보이면 안 된다.
3. OpenVPN 설치 (서버)
간략하게 요약하자면 ~/openvpn-ca 경로에서 key와 인증서 등을 만들고 /etc/openvpn 경로로 옮겨서 운영한다. 따라서 아래에는 포함되어 있지 않지만 server.conf 파일에 설정한 경로(ex. /etc/openvpn)로 각종 파일들을 옮겨야 한다.
### OpenVPN 설치
sudo apt update
sudo apt install openvpn easy-rsa
### Easy-RSA 설정 및 인증서 생성
make-cadir ~/openvpn-ca
cd ~/openvpn-ca
./easyrsa init-pki
./easyrsa build-ca
### 서버용 인증서 및 키 생성
./easyrsa gen-req server nopass
./easyrsa sign-req server server
./easyrsa gen-dh
openvpn --genkey --secret ta.key
### 클라이언트용 인증서 생성
./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1
### OpenVPN 서버 구성
# server.conf 파일은 아래 참고하여 작성
sudo nano /etc/openvpn/server.conf
# net.ipv4.ip_forward=1 부분 주석 해제하여 IP 포워딩 활성화 후 설정 적용
sudo nano /etc/sysctl.conf
sudo sysctl -p
# 방화벽 OpenVPN 포트 허용
sudo ufw allow 1194/udp
# NAT 규칙 추가
# 파일 상단(filter 이전!!)에 아래 내용 추가
# eth0는 ip a 명령어로 확인한 네트워크 인터페이스 사용
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT
sudo nano /etc/ufw/before.rules
# 방화벽 재시작
sudo ufw disable
sudo ufw enable
### OpenVPN 서버 시작
sudo systemctl start openvpn@server
sudo systemctl enable openvpn@server
# 에러 로그는 journalctl 명령어로 확인
journalctl -xeu openvpn@server.service
server.conf 파일은 아래와 같이 작성한다
# server.conf
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh.pem
tls-auth ta.key 0
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
keepalive 10 120
cipher AES-256-CBC
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 3
위에서 ca.crt, server.crt, server.key, dh.pen, ta.key 파일이 올바른 곳에 있어야 한다.
4. OpenVPN 앱 설치 (클라이언트)
우선 OpenVPN 앱을 다운받고, 클라이언트에서 VPN 서버에 연결하기 위해서는 .ovpn 파일이 필요하다. /etc/openvpn/client1.ovpn으로 생성하면 된다.
# client1.ovpn
client
dev tun
proto udp
remote yourserver.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
tls-auth ta.key 1
cipher AES-256-CBC
verb 3
yourserver.com 부분에 처음 DDNS 설정한 도메인(ex. ddns.iptime.org)을 넣으면 된다. 클라이언트에서는 client1.ovpn과 함께 ca.crt, client1.crt, client1.key, ta.key 파일이 필요하다. 이미 생성된 파일들이므로 /etc/openvpn 이나 ~/openvpn-ca/pki/issued 에서 찾으면 된다.
이렇게 총 5개의 파일을 휴대폰으로 옮긴 후 앱에서 파일을 한 번에 업로드하면 된다.
5. 포트포워딩 설정
거의 다 끝났지만, 아직 클라이언트는 VPN 서버의 내부 IP를 모른다. 이건 공유기에서 할당하는 값으로 공인 IP와는 다르기 때문이다. 따라서 공인 IP + 1194 포트로 요청이 들어왔을 때 VPN 서버 내부 IP + 1194 포트로 포트포워딩하도록 설정해줘야 한다.

아까와 같이 iptime 관리자 화면에서 위와 같이 설정할 수 있다. 다만 VPN 서버의 내부 IP가 계속 변하면 위 설정도 의미가 없기 때문에 고급 설정 > 네트워크 관리 > DHCP 서버 설정에서 미니 PC 서버의 IP를 꼭 지정해야 한다.
6. VPN 서버 연결
드디어 모든 설정을 마쳤다! 이제 실제로 연결해보자.


연결 성공이다! 10.8.0.6으로 사설 IP까지 잘 할당된 걸 볼 수 있다.
7. 결론
외부에 앱 서버 포트를 노출하면 보안상의 위험이 있기 때문에 VPN 서버만 외부에 노출하고 검증된 사람만 접속 가능하도록 한다. VPN 서버에 접속하면 내부망에 있는 것처럼 내부 앱 서버에 접근 가능하기 때문에 내부망에 존재하는 서비스를 잘 사용할 수 있다.
다음에는 도커를 설치하고 실제 애플리케이션을 올려보려고 한다. 아주 신나는 일이다!
'홈서버 만들기' 카테고리의 다른 글
| [홈서버 만들기 - 6] 미니 PC 도커 설치 및 CI/CD 구축 (0) | 2024.10.01 |
|---|---|
| [홈서버 만들기 - 4] Linux 설치 후 원격 접속하기 (1) | 2024.09.22 |
| GMKtec N100 미니 PC 언박싱 (0) | 2024.09.21 |
| [홈서버 만들기 - 3] 클라이언트 앱 만들기 (5) | 2024.09.15 |
| [홈서버 만들기 - 2] 아키텍처 설계 (0) | 2024.09.15 |