VPN 서버 구축(feat. openvpn)

Asher·2025년 2월 25일

VPN

목록 보기
1/3
post-thumbnail

0. 도입

실무를 하면서 VPN을 구축할 일이 생겼습니다.
원격으로 상용서버를 접속 할 때 Any IP를 오픈하면 안되니 하나의 접속 포인트에서 상용서버들을 접속하는게 보안상 안전할 것입니다.

먼저 VPN 서버를 구축 하기 전에 VPN이 뭔지 간단하게 개념을 짚고 넘어가겠습니다.

🤔VPN이란?

VPN(가상 사설 네트워크, Virtual Private Network)은 공용 네트워크를 통해 데이터를 전송할 때, 사용자의 연결을 암호화하고 보안을 강화해 주는 기술입니다. 이를 통해 인터넷 연결이 보다 안전해지고, 사용자의 프라이버시를 보호할 수 있습니다.

👍VPN의 장점?

  1. 데이터 암호화
  2. 익명성 보호
  3. 지역 차단 우회
  4. 안전한 원격 접속

1. OpenVPN 및 Easy-RSA 설치

  • OpenVPN, Easy-RSA 설치
    sudo apt-get install update
    sudo apt-get install openvpn easy-rsa
  • 폴더 생성 및 심볼릭 링크 생성
    # 폴더 생성
    mkdir ~/easy-rsa
    # 심볼릭 링크 생성
    ln -s /usr/share/easy-rsa/* ~/easy-rsa/
    • 결과화면

2. OpenVPN용 PKI 만들기

PKI란? --> PKI(Public Key Infrastructure)는 공개 키 암호화 기술을 활용하여 네트워크 상에서 보안성과 신뢰성을 제공하는 체계

  • vars 파일 생성 및 수정

    # 폴더로 이동
    cd easy-rsa
    
    # vars 파일 생성
    vi vars
    
    # 세팅 값 붙여넣기
    set_var EASYRSA_ALGO "ec"
    set_var EASYRSA_DIGEST "sha512"
    • 결과화면
  • PKI 생성

    ./easyrsa init-pki

3. OpenVPN용 서버 인증서 요청 및 개인키 생성

  • 인증서 생성

    cd /easy-rsa
    
    ./easyrsa build-ca nopass
    -> Enter
    ./easyrsa gen-req server nopass
    -> Enter
    • 결과
      sudo cp /home/ubuntu/easy-rsa/pki/private/server.key /etc/openvpn/server/

4. OpenVPN 서버 인증서 요청 서명 및 암호화 자료 구성

  • 인증서 서명 및 암호화 자료 구성

    sudo cp ~/easy-rsa/pki/private/server.key /etc/openvpn/server/
    
    # 인증서 서명
    ./easyrsa sign-req server server
    -> yes
    
    sudo cp ~/easy-rsa/pki/issued/server.crt /etc/openvpn/server/
    sudo cp ~/easy-rsa/pki/ca.crt /etc/openvpn/server/
  • Diffie-Hellman key 생성 및 ta.key 생성

    # Diffie-Hellman key 생성
    ./easyrsa gen-dh
    
    # ta.key 생성
    sudo openvpn --genkey --secret ta.key
    
    # ta.key, dh.pem 파일 복사
    sudo cp ~/easy-rsa/ta.key /etc/openvpn/server/
    sudo cp ~/easy-rsa/pki/dh.pem /etc/openvpn/server/

5. 클라이언트 인증서 및 키 쌍 생성

  • VPN Clinet 계정 만들기

    # 폴더 생성 및 권한 부여
    mkdir -p ~/client-configs/keys
    chmod -R 777 ~/client-configs
    
    # 계정 인증서 생성
    ./easyrsa gen-req 유저명 nopass
    -> Enter
  • 파일 복사

    # 키 파일 이동
    sudo cp pki/private/유저명.key ~/client-configs/keys/
    
    # 인증서 생성
    ./easyrsa sign-req client 유저명
    -> yes
    
    sudo cp pki/issued/유저명.crt ~/client-configs/keys/
  • ta.key 복사

    sudo cp ~/easy-rsa/ta.key ~/client-configs/keys/
    sudo cp ta.key /etc/openvpn/server
    sudo cp /etc/openvpn/server/ca.crt ~/client-configs/keys/
    
    # 권한 부여
    sudo chmod -R 777 ~/client-configs

6. OpenVPN 설정

  • Server.conf 수정

    # 파일 이동
    sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf  /etc/openvpn/server
    
    # Server.conf 수정
    sudo vi /etc/openvpn/server/server.conf
  • server.conf

    일부 설정은 제외 하였습니다.

    
     ;local a.b.c.d
    
     port 1194
    
     # TCP or UDP server?
     ;proto tcp
     proto udp
    
     dev tun
    
     ca /etc/openvpn/server/ca.crt
     cert /etc/openvpn/server/server.crt
     key /etc/openvpn/server/server.key  # This file should be kept secret
    
     dh /etc/openvpn/server/dh.pem
     topology subnet
    
     server 10.8.0.0 255.255.255.0
    
     ifconfig-pool-persist /var/log/openvpn/ipp.txt
    
     ;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
    
     ;server-bridge
    
     push "route 192.168.10.0 255.255.255.0"
     push "route 192.168.20.0 255.255.255.0"
    
     ;client-config-dir ccd
     ;route 192.168.40.128 255.255.255.248
     ;client-config-dir ccd
     ;route 10.9.0.0 255.255.255.252
     ;learn-address ./script
    
     push "redirect-gateway def1 bypass-dhcp"
    
     push "dhcp-option DNS 8.8.8.8"
     push "dhcp-option DNS 1.1.1.1"
    
     ;client-to-client
    
     ;duplicate-cn
    
     keepalive 10 120
    
     tls-auth ta.key 0
     key-direction 0
     cipher AES-256-GCM
     auth SHA256
    
     ;compress lz4-v2
     ;push "compress lz4-v2"
    
     ;comp-lzo
    
     ;max-clients 100
    
     user nobody
     group nogroup
    
     persist-key
     persist-tun
     status /var/log/openvpn/openvpn-status.log
    
     log         /var/log/openvpn/openvpn.log
     log-append  /var/log/openvpn/openvpn.log
    
     verb 3
    
     ;mute 20
    
     explicit-exit-notify 1
    
     #### OTP 설정 ####
     reneg-sec 0
     plugin openvpn-plugin-auth-pam.so "openvpn login USERNAME password PASSWORD 'verification code' OTP"
     verify-client-cert none
     username-as-common-name
     ```

7. OpenVPN 서버 네트워킹 및 방화벽 구성 변경

  • 네트워크 구성 변경

    sudo vi /etc/sysctl.conf
    
    # 주석 해제
    net.ipv4.ip_forward=1

    • 결과확인
      sudo sysctl -p
  • 네트워크 NAT 설정

    • 네트워크 인터페이스 조회
      ip route list default
  • 자신의 인터페이스 nat 설정

    vi /etc/iptables/rules.v4
    
    # 추가
    ##### NAT #####
    *nat
    :PREROUTING ACCEPT [0:0]
    :INPUT ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    :POSTROUTING ACCEPT [0:0]
    -A POSTROUTING -o ens3 -j MASQUERADE
    COMMIT

  • 결과확인

    iptables -t nat -L

  • 적용
    iptables-restore < /etc/iptables/rules.v4

8.OpenVPN 시작 및 Client 구성

  • OpenVPN 시작

    sudo systemctl -f enable openvpn-server@server.service
    sudo systemctl start openvpn-server@server.service
  • VPN 상태 확인

    systemctl status openvpn-server@server


  • Client 추가 구성

    # 폴더 생성
    mkdir -p ~/client-configs/files
    
    # 샘플 파일 복사
    sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf
    
    sudo vi ~/client-configs/base.conf

자신의 환경에 맞게 base.conf를 수정하시면 됩니다!

  • Simple Script(make_config.sh) 작성

    vi ~/client-configs/make_config.sh
    
    # make_config.sh
    
    #!/bin/bash
    
    # First argument: Client identifier
    
    KEY_DIR=/home/ubuntu/client-configs/keys
    OUTPUT_DIR=/home/ubuntu/client-configs/files
    BASE_CONFIG=/home/ubuntu/client-configs/base.conf
    
    cat ${BASE_CONFIG} \
          <(echo -e '<ca>') \
          ${KEY_DIR}/ca.crt \
          <(echo -e '</ca>\n<cert>') \
          ${KEY_DIR}/${1}.crt \
          <(echo -e '</cert>\n<key>') \
          ${KEY_DIR}/${1}.key \
          <(echo -e '</key>\n<tls-auth>') \
          ${KEY_DIR}/ta.key \
          <(echo -e '</tls-auth>') \
          > ${OUTPUT_DIR}/${1}.ovpn
  • Config file 권한부여

    sudo chmod 777 ~/client-configs/make_config.sh

9. ovpn 파일(vpn 접속에 필요한 파일) 생성

  • .ovpn 생성

    cd /home/ubuntu/client-configs
    
    ./make_confing.sh 계정명
    ex) ./make_config.sh asher
  • 생성확인(파일 위치)

    cd ~/client-configs/files
    ll

10. VPN 접속

profile
System Engineer의 발전기록

0개의 댓글