이전 글(구글 클라우드 플랫폼(GCP)에 OpenVPN 서버 구축(7) : 클라이언트 인증서 생성)에 이어서 쓰는 글입니다.

 

본격적으로 OpenVPN 설정을 하겠습니다.
server.conf 파일을 구성해야 되는데, 저는 server.conf 파일 내의 옵션들을 모르기 때문에 샘플 파일을 복사해서 수정하는 식으로 진행하겠습니다.

 

OpenVPN 2.5 버전(이상)을 기준으로 설명합니다. 미만 버전(2.4 이하)에서 deprecated(도태)되거나 도태될 예정에 있는 옵션들은 사용하지 않는 방향으로 적습니다.

 

OpenVPN 2.5.1 버전 소스를 /usr/local/src/ 경로에 압축을 풀었다면 아래의 경로에 server.conf 샘플 파일이 있습니다.

/usr/local/src/openvpn-2.5.1/sample/sample-config-files/server.conf

https://github.com/OpenVPN/openvpn 링크에도 /sample/sample-config/ 하위 경로로 들어가면 server.conf 파일이 보입니다. )

 

▼ 아래처럼 명령어를 입력하여 샘플 server.conf 파일을 /etc/openvpn/server/ 경로에 복사합니다.

sudo cp /usr/local/src/openvpn-2.5.1/sample/sample-config-files/server.conf /etc/openvpn/server/

만약 우분투 20.04 LTS 데스크톱에 내장된 openvpn 패키지를 사용한다면 아래의 대체 명령어를 입력합니다.

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/server/

sudo gunzip /etc/openvpn/server/server.conf.gz

▲ 그리고 nano 에디터로 /etc/openven/server/server.conf 파일을 엽니다.

(sudo nano /etc/openvpn/server/server.conf)

 

▼ 설명을 읽어보시고, # 또는 ; 가 주석(코멘트) 표시인 것을 알아두세요.

(윈도우 환경에서는 백슬래시 두 개 쓴다는 점도 주의!)

 

server.conf 구성의 핵심은 주석을 보면서 눈치껏 대응하는 것입니다.
OpenVPN 버전이 다르면 server.conf 항목이 바뀔 수 있기 때문에, 저의 설명은 보조용으로 활용할 것을 권합니다.

(https://github.com/OpenVPN/openvpn/tree/master/doc의 man-sections 디렉토리 문서들을 참고했습니다.)

 

▼ local 옵션은 IP를 특정하기 때문에 쓸 일이 없을 듯합니다. 패스.

port 옵션으로 OpenVPN용 포트번호를 지정하고(UFW같은 방화벽에서도 포트를 개방해야 함. 나중에 설명),

proto 옵션으로 tcp/udp 프로토콜 중에서 지정합니다.

▲ 저는 1194포트(기본값), UDP 프로토콜(기본값)을 그대로 쓸 겁니다.

 

443포트와 TCP 조합을 권하는 글들이 많은데...

https://community.openvpn.net/openvpn/wiki/GettingStartedwithOVPN

▲ 이 문서에 링크된 아래의 문서를 보고 UDP 프로토콜로 가야겠다고 마음을 굳혔습니다.

http://sites.inka.de/bigred/devel/tcp-tcp.html

(proto tcp로 설정할 경우, explicit-exit-notify 항목도 반드시 바꿔주어야 합니다. 본문을 끝까지 보면 나옵니다.)

 

▼ dev tap, dev tun 옵션들은 만질 필요가 없는 것 같습니다. 패스!

우리는 routed IP tunnel을 쓸 거니까 dev tun.
(이더넷 터널링 X, 이더넷 브릿징 X)

▲ dev-node 옵션은 윈도우에서 랜카드를 2개 이상 쓸 경우에 설정해야 할 것 같습니다.
(일반적인 상황에서는 필요 없음)

 

ca, cert, key 옵션은 각각의 파일명을 지정하는 항목입니다. 서버인증서 생성&복사 과정에서 드러났던 파일명을 넣으면 되는데, 보안성을 높이려면 파일명을 바꾸고 ca, cert, key 옵션에도 반영해주면 됩니다.

(파일의 경로를 같이 적어도 됩니다. 예를 들면 ca /etc/openvpn/server/ca.crt 이런 식으로...)

 

dh 옵션은 디피-헬만 파라미터의 파일명을 지정하는 것이겠죠? 저는 서버인증서 생성 과정에서 EasyRSA로 diffie hellman 파일을 만들었기 때문에 파일명이 바뀌었습니다. 반영해 주었습니다.

(EasyRSA vars 파일 구성할 때 set_var EASYRSA_ALGO 옵션을 ec로 바꾼 경우라면 dh 옵션을 안 쓰겠죠?)

(파일의 경로를 같이 적어도 됩니다. dh /etc/openvpn/server/dh.pem 이런 식으로...)

 

▼ topology 옵션. 네트워크 토폴로지를 설정하는 항목입니다. 일반적인 상황에서는 쓸 일이 없는 개념 같습니다. 바꾸지 않고 넘어갔습니다. 패스.

(※ 추가 : topology 주석을 안풀었더니, openvpn.log 파일에서 아래와 같은 경고문이 떴습니다. 그래서 topology subnet 주석을 풀었습니다.)

 

WARNING: --topology net30 support for server configs with IPv4 pools will be removed in a future release. Please migrate to --topology subnet as soon as possible.

 

▼ server 옵션. 서버모드인지, 그리고 VPN망의 내부IP 대역(VPN subnet)을 설정하는 항목입니다. 저는 10.8.0.0(기본값)으로 놔뒀습니다. 그러면 VPN망 내부 IP 대역이 10.8.X.Y가 되는 것이고, 서버의 내부IP는 10.8.0.1로 할당됩니다. 공유기 내부IP를 생각하면 이해하기 쉬워요. 공유기 내부 IP는 192.168.0.1 이 기본인데 192.168.5.1 처럼 대역을 바꿀 수 있지요? 그런 느낌이예요.

(단, 이더넷 브릿지일 경우에는 이 옵션을 지워야 한다고 쓰여 있네요.)

 

▼ ifconfig-pool-persist 옵션. ipp.txt 파일에 클라이언트-가상IP 주소 기록을 하겠답니다. OpenVPN이 중단되거나 재시작되면 ipp.txt를 읽어서 클라이언트에 동일한 가상IP 주소를 다시 할당할 수 있다네요. 좋은 기능인 것 같아서 기본값으로 놔뒀습니다. 임의의 파일명으로 수정해도 됩니다.

 

▼ server-bridge 옵션은 이더넷 브릿지를 쓸 때 필요한 것 같습니다. 주석처리된 상태로 패스.

 

▼ push 옵션. 신호를 다른 내부IP로 전달하겠다는 것 같는데, 쓸 일이 없을 듯합니다. 패스.

(가정에서 공유기 상단에 OpenVPN서버(홈서버)를 위치시킨다면 push "route 192.168.0.0 255.255.255.0" 이런 식으로 입력해야 할 수 있겠네요. 192.168.X.0 대역은 본인 공유기에 맞게...)

 

▼ client-config-dir ccd, route 옵션. 클라이언트에게 내부IP 주소를 특정해야 되는 경우, 또는 VPN 연결을 해야 되는 private subnet를 클라이언트가 가지고 있는 경우라면 아래의 구성을 따르면 된다고 하는데... 저는 쓸 일이 없을 것 같습니다. 패스.

▲ 주석으로 감싸져 있는 route, ifconfig-push 명령어가 핵심인 것 같습니다. 아무튼 패스.

 

▼ learn-address 옵션. 클라이언트 그룹들마다 방화벽 정책을 다르게 주고 싶을 때 사용하는 것 같습니다.
패스.

 

▼ push "redirect-gateway def1 bypass-dhcp" 옵션. 극단적인 터널링 설정인 것 같습니다. 첫번째 push 옵션은 게이트웨이 단계까지 터널링하여 "(웹브라우징, DNS lookup 같은) 모든 트래픽"이 OpenVPN 서버를 거치도록 만듭니다. 일반인은 쓸 일이 없을 것 같습니다. 일단 패스(기본값 : 주석처리 되어 있음). (SSH같은 다른 네트워크 서비스와의 연결 문제가 발생할 수 있다고 하네요.)

▲ 두번째 push 옵션은 특정 DNS서버를 쓰도록 만드는 옵션입니다. 본인(클라이언트)의 컴퓨터/공유기에서 직접 DNS 우회를 구현할 수 없는 조건이라면 이 옵션을 쓰면 되는데... 대부분 구글DNS같은 것을 쓰시잖아요? 그래서 패스.

 

※ 2021. 4. 23. 추가.

push "redirect-gateway def1 bypass-dhcp" 옵션을 켜지 않고 OpenVPN 연결을 했더니, 연결이 실패하지 않았음에도 서버쪽 IP로 바뀌지 않고 클라이언트쪽 IP로 잡혔습니다. 그래서 아래 스크린샷처럼 push "redirect-gateway def1" 옵션을 넣었습니다. 핵심 기능이니까 꼭 챙기세요.

▲ server.conf 파일, client.conf 파일 둘 중 하나에는 무조건 들어가야 되는 옵션인 것 같습니다. 만약 server.conf 파일에 넣지 않고 client.conf 파일에 넣고자 한다면 redirect-gateway def1 이라고 넣으면 됩니다(push와 따옴표 빠짐.). 저는 이 옵션을 client.conf 파일에 넣는 것을 추천합니다(server.conf 파일에는 주석처리.). client.conf 구성 설명 포스팅에서 다시 언급하겠습니다.

 

▼ client-to-clent 옵션. 클라이언트들이 서로를 볼 수 있게 만듭니다. 저는 안써서 패스. 기업에서 쓰면 좋을 것 같습니다.

 

※ 2021. 04. 29. 추가.

중요! 홈서버+공유기 조합은 client-to-client 옵션, redirect-gateway def1 옵션을 무조건 활성화하세요.

(구글 GCP같은 VPS 환경에서는 redirect-gateway def1 옵션만 활성화하는 것이 좋습니다.)

 

홈서버+공유기 조합에서 client-to-client 옵션과 redirect-gateway def1 옵션을 모두 활성화했더니, 해당 홈서버의 내부IP 주소(192.168.XXX.YYY)로 접근할 수 있도록 바뀌었습니다(client-to-client 옵션의 효과). 또한 외부IP 주소는 OpenVPN 서버(홈서버쪽)의 외부IP로 바뀌었습니다(redirect-gateway def1 옵션의 효과).

 

이 경우, 클라이언트 컴퓨터도 공유기 하단에 물려 있다면 홈서버쪽 공유기와 클라이언트 PC쪽 공유기의 내부IP주소 대역이 겹치지 않도록 주의해야 합니다. 예를 들어 클라이언트쪽 공유기가 192.168.0.1 대역을 쓴다면 홈서버쪽 공유기는 192.168.0.1 대역을 피해서 192.168.44.1 대역을 쓰도록 조치해야 합니다. 아예 192로 시작하지 않는 다른 대역으로 바꿀 수 있으면 바꾸는 것이 좋고, 공유기 라우팅테이블을 추가하여 10.8.0.0/24 네트워크를 통해서 192.168.0.X로 보내오는 요청에 대한 게이트웨이를 정의해주면 더 좋은데... 라우팅테이블 추가 없이도 잘 굴러가더군요 => 참고 글 : https://truerain.tistory.com/15

 

▼ duplicate-cn 옵션. 다수의 클라이언트가 하나의 키를 공동 사용할 수 있게 만드는 기능(인증서 하나에 VPN접속용 계정 여러 개를 붙이는 식으로). 테스트용/귀찮음이 많은 분들이 쓰면 좋을 것 같습니다. 패스.

 

▼ keepalive 옵션. 10초에 한번씩 신호를 보내서 120초간 수신 확인이 안되면 연결이 끊어졌다고 판단.

기본값으로 놔뒀습니다.

 

▼ tls-auth ta.key 0 항목에서 0이 key-direction 파라미터인 것 같습니다. 그런데 일부 모바일기기 연결이 안된다는 보고가 종종 있어서 그런지, tls-auth 옵션을 쓸 경우 key-direction 0 이라는 줄을 추가하라는 글이 보이더군요. 혹시라도 문제가 될까봐 넣었습니다.

(추가 : key-direction 0 삭제하고 진행해 보겠습니다. => 문제 없음. 삭제한 채로 놔둠.)

(파일의 경로를 같이 적어도 됩니다. tls-auth /etc/openvpn/server/ta.key 이런 식으로...)

 

key-direction 0 에 대한 논의는 아래 글에서 확인할 수 있습니다.

https://forums.openvpn.net/viewtopic.php?t=11978

(나중에 클라이언트 설정 파일에서 key-direction 1로 명시하면 문제 없을 것 같은데...)

 

▼ 2021. 4. 23. 추가. 아래처럼 바꿨습니다.

tls-crypt ta.key

 

※ tls-auth 와 tls-crypt 의 차이점. 뭐가 더 좋을까?

https://serverfault.com/questions/929484/openvpn-2-4-security-differences-between-tls-crypt-and-tls-auth

 

▼ 디지털오션의 OpenVPN 서버 구축 가이드(우분투 18.04용, 우분투 20.04용)에서 일관적으로 권장되는 부분입니다. cipher AES-256-CBC 아랫줄에 auth SHA256 추가하기.

※ 추가 : OpenVPN 2.5부터는 cipher 옵션을 썼을 때 log파일에서 경고를 띄웁니다.

cipher AES-256-CBC 라인을 지우거나 주석처리하고, data-ciphers AES-256-CBC 이라고 적으세요.

=> 이렇게 적었는데도 log 파일에 에러가 떠서 data-ciphers-fallback AES-256-CBC 이라고 바꿨습니다.

 

grep VPN /var/log/syslog

Apr 20 11:47:11 newbie openvpn[3620]: DEPRECATED OPTION: --cipher set to 'AES-256-CBC' but missing in --data-ciphers (AES-256-GCM:AES-128-GCM). Future OpenVPN version will ignore --cipher for cipher negotiations. Add 'AES-256-CBC' to --data-ciphers or change --cipher 'AES-256-CBC' to --data-ciphers-fallback 'AES-256-CBC' to silence this warning.
Apr 20 11:47:11 newbie openvpn[3620]: OpenVPN 2.5.1 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [MH/PKTINFO] [AEAD] built on Apr 14 2021

 

※ 참고글 : https://community.openvpn.net/openvpn/wiki/CipherNegotiation

 

▼ 2021. 4. 23. 추가. 아래처럼 바꿨습니다.

cipher AES-256-GCM
auth SHA256

 

▼ compress 또는 comp-lzo 옵션. 데이터 압축(compression)하는 항목이 있었군요? 서버 사양이 충분하다면(ex: 홈서버) compress lz4-v2 옵션을 켰을 겁니다. 구글클라우드 무료 VPS 사양이 낮다는 피드백이 많아서 비활성화 하였습니다.

 

▼ max-clients. 동시접속자 수. 적당히 정하세요. 저는 패스.

 

▼ 설명을 보면 초기화(initialization) 후 OpenVPN 데몬(서비스)의 권한을 줄이는 것이 좋다고 하는데, 저는 편의성이 중요해서 주석을 해제했습니다. 디지털오션에서도 주석을 푸는 쪽으로 가이드하고 있습니다.

▲ 터미널창에 cut -f1 -d: /etc/passwd 이라고 입력하여 user 목록에 nobody가 있는지 확인해야 합니다.

터미널창에 cut -f1 -d: /etc/group 이라고 입력하여 group 목록에 nobody가 있는지 확인해야 합니다.

저는 user 목록에는 nobody가 있었으나, group 목록에는 nogroup이 있었습니다(nobody 없음).

그래서 위 스샷에서 group nogroup 으로 바꾸었습니다(user nobody 는 유지).

 

▼ persist-key, persist-tun. 재부팅했을 때 권한 부족으로 접근이 안되는 요소들에 접근하지 않게끔 하는 옵션입니다. 유지(persist)된 자료에 대신 액세스하는 것이지요. 기본값으로 주석이 풀려 있으니, 패스.

 

▼ status openvpn-status.log
간단한 상태 파일(로그). 이름 바꾸고 싶으면 바꾸세요. 저는 기본값으로 유지합니다.

 

▼ log 옵션. 저는 패스. syslog 대신 openvpn.log 파일에 openvpn 로그가 기록되게 합니다. log 옵션은 openvpn 시작시 truncate(갱신) 시키는 식으로, log-append 옵션은 openvpn 시작시 덧붙이는 식으로 작동하니... 둘 중 하나만 골라 쓰세요(둘 다 쓰면 안됨).

(작동 테스트 과정 동안에는 log openvpn.log 를 주석 해제하여 썼습니다. 서비스 재시작 할때마다 로그가 갱신 저장되기 때문에, syslog를 뒤지는 것보다 문제 파악이 쉬웠습니다.)

 

※ OpenVPN 서버 서비스를 작동시키고 나서 보면 좋은 팁! (지금은 무쓸모)

 

log 옵션을 안 쓸 경우에 OpenVPN 로그를 보려면 아래의 명령어를 입력하면 됩니다.

  grep VPN /var/log/syslog

log 옵션을 쓸 경우에는 아래의 명령어를 입력하면 OpenVPN 로그를 볼 수 있습니다.

  sudo cat /etc/openvpn/server/openvpn.log

 

▼ verb 옵션은 로그파일을 얼마나 자세하게(장황하게. verbose) 쓸 것인지 정하는 항목인데, 3이 기본값입니다. 저는 패스.

 

▼ mute 옵션을 20이라고 설정하면 연속적으로 반복 출력되는 메세지가 최대 20개까지만 로그파일에 기록됩니다. 저는 패스.

 

▼ 저는 UDP 프로토콜로 정했기 때문에 explicit-exit-notify 옵션을 기본값(1)으로 놔뒀습니다. tcp 프로토콜을 사용하도록 설정했다면 explicit-exit-notify 옵션을 0으로 수정해야 합니다(1번 값은 UDP 프로토콜에서만 쓸 수 있기 때문입니다.).

(만약 tcp 환경일 때 explicit-exit-notify 1 이라고 설정하면 OpenVPN 서비스 시작할 때 에러가 난다고 합니다. 0으로 바꿔주세요.)

 

이것으로 OpenVPN의 server.conf 구성이 끝났습니다.

저장하고 빠져나오세요(nano에디터 단축키 Ctrl+X).

 

※ 참고한 한글 문서들

https://dejavuqa.tistory.com/243

www.t8.co.kr/bbs/board.php?bo_table=networking&wr_id=2

hasu0707.nflint.com/blog/?p=959

 

이후 과정은 다음 글에서 적겠습니다.

 

※ 다음 글 : 구글 클라우드 플랫폼(GCP)에 OpenVPN 서버 구축(9) : 네트워크, 방화벽 설정

반응형