CentOS에서 보안 회선 VPN 구성 (실습)

2024. 1. 21. 17:36·AWS Cloud School/project

https://lympsw12.tistory.com/entry/CentOS%EC%97%90%EC%84%9C-%EB%B3%B4%EC%95%88-%ED%9A%8C%EC%84%A0-VPN-%EA%B5%AC%EC%84%B1-%EC%9D%B4%EB%A1%A0

 

CentOS에서 보안 회선 VPN 구성 (이론)

VPN이란? VPN (Virtual Private Network)은 인터넷을 통해 가상의 개인 네트워크를 구축하는 기술입니다. 이는 특히 데이터 보안과 프라이버시를 중시하는 원격 접속 또는 사이트 간 연결에 사용됩니다. V

lympsw12.tistory.com

 

OpenVPN이란?

OpenVPN은 오픈 소스 기반의 VPN (Virtual Private Network) 소프트웨어입니다. SSL/TLS 프로토콜을 사용하여 안전한 포인트-투-포인트 또는 사이트-투-사이트 연결을 제공하며, 인터넷을 통해 개인 네트워크의 보안 및 프라이버시를 확장하고 강화하는 데 사용됩니다.

 

OpenVPN의 주요 특징

  1. 암호화 : OpenVPN은 데이터를 암호화하여 인터넷을 통해 안전하게 전송합니다. SSL/TLS를 기반으로 하는 강력한 암호화 기능을 제공합니다.
  2. 유연성 : 다양한 네트워크 환경에서 사용할 수 있으며, NAT, 방화벽 등 다양한 네트워크 구성과 호환됩니다.
  3. 플랫폼 호환성 : OpenVPN은 윈도우, macOS, 리눅스, iOS, 안드로이드 등 다양한 운영 체제에서 실행됩니다.
  4. 구성 가능성 : 고도로 구성 가능하며, 각종 네트워크 설정, 보안 옵션, 인증 방식 등을 사용자가 직접 설정할 수 있습니다.
  5. 사이트-투-사이트 및 원격 접속 : OpenVPN은 기업 환경에서 사이트 간 네트워크 연결 또는 개인 사용자의 원격 접속 용도로 사용될 수 있습니다.
  6. 커뮤니티 및 상업적 지원 : 오픈 소스 커뮤니티에서 활발히 지원되며, 상업적 지원도 제공하는 버전이 있습니다.

 

사용 시나리오

  • 원격 근무 : 재택 근무자들이 회사의 네트워크에 안전하게 접근할 수 있습니다.
  • 보안 강화된 인터넷 접속 : 공용 Wi-Fi와 같은 불안전한 네트워크를 사용할 때 개인 데이터를 보호합니다.
  • 사이트 간 연결 : 여러 지역에 있는 사무실의 네트워크를 안전하게 연결합니다.

 

1. 설치

EPEL 저장소 설치

  • EPEL(Extra Packages for Enterprise Linux) 저장소는 Fedora 프로젝트에 의해 제공되는, Red Hat Enterprise Linux(RHEL) 및 CentOS와 같은 엔터프라이즈급 리눅스 배포판을 위한 추가 패키지 저장소입니다. 이 저장소는 RHEL 및 CentOS의 기본 저장소에서 제공하지 않는 추가적인 소프트웨어 패키지를 포함하고 있습니다.
  • RHEL 및 CentOS의 기본 저장소에서는 OpenVPN과 같은 일부 소프트웨어를 제공하지 않을 수 있습니다. EPEL 저장소는 이러한 소프트웨어에 대한 접근을 제공합니다.
yum install -y install epel*

 

openvpn / easy-rsa 설치

  • openvpn : TCP와 UDP 프로토콜을 모두 이용 가능한 오픈소스 VPN 프로토콜로서, TAP 또는 TUN 가상 네트워크 어뎁터를 이용해 VPN 연결을 수립
  • easy-rsa : OpenVPN 프로젝트에서 사용하기 위해 만든 하위 프로젝트로 인증 기관 구축(CA; Certificate Authority) 유틸리티
yum install -y openvpn easy-rsa

 

TAP 및 TUN은 가상 네트워크 어댑터 또는 인터페이스를 지칭하는 용어로, 주로 VPN 구축에 사용됩니다. 

이들은 네트워크 패킷을 가상 인터페이스로 전송하여, 가상 네트워크를 구현하는 데 사용됩니다. TAP과 TUN은 서로 다른 네트워크 레벨에서 작동하며, VPN의 구성 및 필요에 따라 선택됩니다.

TAP(Network Tap)

  • 레벨 : OSI 모델의 데이터 링크 계층(레벨 2)에서 작동합니다.
  • 기능 : 이더넷 프레임을 처리합니다. 즉, 가상 네트워크 어댑터가 실제 네트워크 카드처럼 작동하며, MAC 주소를 포함한 네트워크 트래픽을 처리할 수 있습니다.
  • 사용 사례 : TAP은 브리지 네트워크를 구성하거나, 가상 머신 네트워킹에 사용될 수 있습니다. 일반적으로 네트워크 상의 물리적 장치를 모방하는 데 적합합니다.

TUN (Tunnel)

  • 레벨: OSI 모델의 네트워크 계층(레벨 3)에서 작동합니다.
  • 기능: IP 패킷을 처리합니다. TUN 인터페이스는 네트워크 라우터처럼 작동하여, IP 패킷을 가상 네트워크를 통해 전달합니다.
  • 사용 사례: TUN은 라우팅 및 IP 터널링에 주로 사용되며, 대부분의 VPN 시나리오에서 사용됩니다. 가벼운 VPN 터널 구축에 적합합니다.

 

2. 서버 인증서 만들기

mkdir ~/easy-rsa                           # 홈 파일에서 easy-rsa 폴더 만들기
ln -s /usr/share/easy-rsa/* ~/easy-rsa/    # easy-rsa 폴더 링크
chmod 777 ~/easy-rsa                       # 모드 변경 사용가능하게 하기 위해서

init-pki 생성

cd ~/easy-rsa/3.0.8
./easyrsa init-pki

easyrsa로 ca.crt 생성

./easyrsa build-ca nopass

nopass는 비번을 안 넣기 위해 지정 해줬습니다. 

참조할 인증기관이 있는지 물어봅니다. 전 없기 때문에 그냥 Enter를 눌렀습니다. (default 인증 기관이 지정)

ca.crt가 생긴 것을 볼 수 있습니다.

ca.crt란?
 ca.crt 파일은 VPN 설정에서 사용되는 CA(Certificate Authority, 인증 기관)의 공개 인증서입니다.
ca.crt는 CA의 루트 인증서로, VPN 네트워크 내에서 다른 인증서(클라이언트 및 서버 인증서)의 신뢰성을 검증하는 기준이 됩니다. 이 인증서에는 공개 키가 포함되어 있으며, 이를 통해 서버 및 클라이언트 인증서의 디지털 서명을 검증할 수 있습니다.

key 생성

./easyrsa gen-req server nopass

gen-req 옵션을 주고 바로 다음에 인증서를 사용할 장비의 이름을 넣습니다. (server로 지정)

server.req와 server.key가 생성 된 것을 볼 수 있습니다.

server.req: 인증서 요청 파일 (CSR)
 이 파일은 서버의 인증서 서명 요청(Certificate Signing Request, CSR)을 포함하고 있습니다. CSR은 인증서 발급 과정에서 사용되며, 공개 키와 서버의 식별 정보(예: 이름, 주소 등)를 포함합니다. 
 CSR 파일은 인증 기관(CA)에 제출되어, 해당 서버의 공개 키를 포함하는 디지털 인증서를 발급받는 데 사용됩니다. CA는 이 요청을 검증하고 서명하여 서버의 인증서(server.crt)를 생성합니다.
server.key: 개인 키 파일
 이 파일은 VPN 서버의 개인 키를 포함하고 있습니다. 개인 키는 인증서의 공개 키와 쌍을 이루며, 데이터의 암호화 및 디지털 서명에 사용됩니다. 개인 키는 매우 중요한 보안 요소입니다. 이 키가 노출되면, 해당 키를 사용하는 모든 암호화 통신이 위험에 노출될 수 있습니다. 따라서 server.key 파일은 안전하게 보관하고 접근을 엄격히 제한해야 합니다.

openVPN 디랙토리에 key 파일 복사

cp ~/easy-rsa/3.0.8/pki/private/server.key /etc/openvpn/server/

인증서 파일 생성

./easyrsa sign-req server server

sign-req 옵션을 줍니다. sign-req는 CSR을 서명하기 위해 사용됩니다. 즉, CA(Certificate Authority)가 CSR을 검증하고 서명하는 과정을 나타냅니다.

이 명령어를 실행하면 server라는 이름의 csr을 찾아 해당 서버의 공개 키가 포함된 csr을 검증하고 서명합니다. 이 과정에서 공식적인 서버 인증서인 server.crt가 생성됩니다.

생성된 server.crt / ca.crt 파일을 openvpn 폴더로 복사

cp ~/easy-rsa/3.0.8/pki/issued/server.crt /etc/openvpn/server/
cp ~/easy-rsa/3.0.8/pki/ca.crt /etc/openvpn/server/

Diffie-Hellman key 생성

./easyrsa gen-dh

 

Diffie-Hellman 키는 암호화에서 사용되는 핵심 암호 교환 방식의 일부로, 두 당사자가 안전한 채널을 통하지 않고도 공유 비밀 키를 생성할 수 있도록 해줍니다. 이 방식은 1976년에 Whitfield Diffie와 Martin Hellman에 의해 처음 소개되었으며, 공개 키 암호화의 초기 형태 중 하나입니다.

Diffie-Hellman 키 교환의 원리

  • 공개 키와 비밀 키: Diffie-Hellman은 각 당사자가 공개 키와 비밀 키를 갖는 방식으로 작동합니다. 공개 키는 노출되어도 안전하지만, 비밀 키는 각자만이 알고 있어야 합니다.
  • 암호화된 통신 채널 생성: 두 당사자는 서로의 공개 키를 공유하고, 이를 사용하여 공통의 비밀 키를 독립적으로 계산합니다. 이렇게 해서 얻은 비밀 키는 데이터 암호화 및 복호화에 사용됩니다.
  • 중간자 공격 방지: 중간에 데이터를 가로채는 중간자가 공개 키를 얻더라도, 비밀 키를 계산할 수 없기 때문에 암호화된 통신을 해독할 수 없습니다.

위에서 공개키를 생성!!

openvpn을 통해 ta.key 파일 생성

 
openvpn --genkey --secret ta.key

 ta.key 파일은 OpenVPN에서 사용하는 TLS 인증(Authentication) 키입니다. 이 키는 TLS 핸드셰이크 과정에서 추가적인 보안 계층을 제공하는 데 사용됩니다.

TLS 인증(Authentication)은 TLS(Transport Layer Security) 프로토콜의 중요한 부분으로, 네트워크 통신에서 서버와 클라이언트 간의 상호 인증을 보장하는 과정입니다. 이 과정은 네트워크 통신의 보안을 강화하고, 데이터의 기밀성과 무결성을 보장하는 데 중요한 역할을 합니다.

생성된 dh.pem/ta.key 파일 openvpn 폴더로 복사

cp ~/easy-rsa/3.0.8/ta.key /etc/openvpn/server/
cp ~/easy-rsa/3.0.8/pki/dh.pem /etc/openvpn/server/

 

3. VPN 계정 생성

Client 인증서 폴더 생성 및 권한 추가

mkdir -p ~/client-configs/keys
chmod -R 777 ~/client-configs

easyrsa에서 vpn 계정에 대한 인증서 생성 후 클라이언트 폴더로 복사

cd ~/easy-rsa/3.0.8
./easyrsa gen-req woong nopass
cp pki/private/woong.key ~/client-configs/keys/

woong.key 파일로 인증서 만든 후 client 폴더로 복사

./easyrsa sign-req client woong
cp pki/issued/woong.crt ~/client-configs/keys/

ca.crt와 ta.key를 client 폴더로 복사

cp ~/easy-rsa/3.0.8/ta.key ~/client-configs/keys/
cp /etc/openvpn/server/ca.crt ~/client-configs/keys/

 

4. OpenVPN 설정

openVPN에서 제공한 sample config files를 복사

cp /usr/share/doc/openvpn-2.4.12/sample/sample-config-files/server.conf /etc/openvpn/

conf 파일 수정

vi /etc/openvpn/server.conf
port 1194                                              # 포트 설정
proto udp                                              # udp 설정
dev tun                                                # tun 설정
ca server/ca.crt                                       # 경로 변경
cert server/server.crt                                 #  ""
key server/server.key                                  #  ""
dh server/dh.pem                                       #  ""
topology subnet                                        # 주석 해제
tls-auth /root/client-configs/keys/ta.key 0             # 경로 변경 
key-direction 0                                        # 추가
cipher AES-256-CBC                                     # 주석 해제
auth SHA512                                            # 추가 
;user nobody                                           # 주석 해제 X
;group nobody                                          #  "" 
;mute 20                                               #  ""
push "redirect-gateway def1 bypass-dhcp"               # 주석 해제
push "dhcp-option DNS 8.8.8.8"                         # DNS 설정
push "dhcp-option DNS 8.8.4.4"                         # DNS 설정

openVPN server의 네트워크 설정을 변경

 
vi /etc/sysctl.conf
 

net.ipv4.ip_forward=1 추가

sysctl -p                           # 변경 사항 적용 후
systemctl restart network           # 네트워크 재시작

 

5. CentOS 방화벽 설정

방화벽 실행

systemctl start firewalld
systemctl status firewalld

현재 열려있는 포트는 없습니다. 1194포트를 udp로 열어줘야 합니다.

firewall-cmd --zone=public --add-port=1194/udp --permanent
firewall-cmd --zone=public --add-service openvpn --permanent
firewall-cmd --add-masquerade --permanent
firewall-cmd --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.8.0.0/24 -o enp0s3 -j MASQUERADE
firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.8.0.0/24 -o enp0s3 -j MASQUERADE
firewall-cmd --reload

실행 후 열린 것을 확인할 수 있습니다.

 

6. Client 설정

client-congifs에 하위 폴더 생성 후 configuration 샘플 파일 복사

mkdir -p ~/client-configs/files/
cp /usr/share/doc/openvpn-2.4.12/sample/sample-config-files/client.conf ~/client-configs/base.conf

base.conf 파일 수정

vi ~/client-configs/base.conf
client
dev tun
proto udp
remote 192.168.56.104 1194                       # 공인 IP 수정
user body                                        # 주석 해제 X
group nogroup                                    # 주석 해제 X
#ca.crt                                          # 주석 처리
#cert server.crt                                 #  ""
#key server.key                                  #  ""
auth SHA512                                      # 추가
key-direction 1                                  # 추가

스크립트 생성

vi ~/client-configs/make_config.sh
#!/bin/bash 

# First argument: Client identifier                           # 클라이언트 식별자
 
KEY_DIR=/root/client-configs/keys                             # 각 변수 설정
OUTPUT_DIR=/root/client-configs/files
BASE_CONFIG=/root/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

지금 까지 만든 인증서와 키들을 적절한 태그 들로 묶어줍니다.

chmod 777 ~/client-configs/make_config.sh
cd ~/client-configs
./make_config.sh woong

들어가보면 지금까지 만든 내용들이 적절한 태그에 묶여 있는 것을 볼 수 있습니다.

 

7. openvpn 실행

systemctl start openvpn@server.service

실행을 하면 이런 에러가 나옵니다. 분명 ta.key에 권한을 변경해줘도 똑같은 에러가 반복적으로 나옵니다.

SELinux 때문이었습니다.

SELinux (Security-Enhanced Linux)

리눅스 운영 체제의 보안을 강화하기 위해 개발된 보안 모듈입니다. 원래 미국 국립안보국(NSA)에 의해 개발되었으며, 리눅스 커널에 통합되어 리눅스 배포판에서 널리 사용됩니다.

 

SELinux의 주요 기능과 목적

  • 강제적 접근 제어(MAC): SELinux는 강제적 접근 제어(MAC) 모델을 사용합니다. 이는 각 프로세스와 파일에 대해 정책을 설정하여, 시스템에서 무엇을 할 수 있는지 엄격하게 제어합니다.
  • 보안 정책의 구현 : 시스템의 각 요소에 대해 보안 정책을 정의하고 적용합니다. 이 정책들은 프로세스의 권한, 파일 접근 권한, 네트워크 인터페이스의 사용 등을 제어합니다.
  • 보안 위협으로부터 시스템 보호 : SELinux는 루트 사용자(시스템 관리자)의 권한을 넘어서는 보안 위협으로부터 시스템을 보호합니다. 일반적인 리눅스 보안 모델인 DAC(임의적 접근 제어)만으로는 방지하기 어려운 보안 취약점을 완화합니다.
ls -lZ /root/client-configs/keys/ta.key

ls -lZ 로 SELinux의 컨텍스트를 포함한 정보를 보면 admin_home_t에서만 접근 가능하게 나옵니다.

이걸 openvpn에서도 접근 가능하게 변경해줘야 합니다.

chcon -t openvpn_etc_t /root/client-configs/keys/ta.key

위 명령어를 실행하면 이렇게 openvpn에서도 실행 가능하게 바뀝니다.

그 후 다시 실행을 하면 

이렇게 openvpn이 실행 된 것을 확인할 수 있습니다.

 

윈도우에서 접근해보기

https://openvpn.net/community-downloads/

 

Community Downloads - Open Source VPN | OpenVPN

The OpenVPN community shares the open source OpenVPN. Download the latest version of the open source VPN release OpenVPN 2.6.3 for a secure network.

openvpn.net

윈도우에서 openvpn을 설치하기

 

C:\Program Files\OpenVPN\config

이 주소로 가상 머신에 있는 ta.key와 woong.ovpn 을 가져오면 됩니다.

가져올 때는 scp를 사용해 가져옵니다.

scp를 사용해 가져올 수 있습니다!!

 

그 후 실행을 한 뒤 연결을 해보면 접속된 것을 확인 할  수 있습니다.

 

  • VPN을 껐을 때

 

  • VPN을 켰을 때

 

 

참고

https://blog.naver.com/taetae94-/223018932241

 

Open VPN을 통해 VPN 구축

1. 설치 EPEL 저장소 설치 openvpn / easy-rsa / ntp 설치 openvpn : TCP와 UDP 프로토콜을 모두...

blog.naver.com

 

'AWS Cloud School > project' 카테고리의 다른 글

CloudFormation을 TerraForm으로 변경하기  (0) 2024.03.11
CloudFormation 실행하기 및 테스트  (0) 2024.03.11
CloudFormation을 이용하여 인프라 관리 Yaml 파일 생성  (0) 2024.03.02
DMZ 구성  (0) 2024.02.01
'AWS Cloud School/project' 카테고리의 다른 글
  • CloudFormation을 TerraForm으로 변경하기
  • CloudFormation 실행하기 및 테스트
  • CloudFormation을 이용하여 인프라 관리 Yaml 파일 생성
  • DMZ 구성
인프라 감자
인프라 감자
  • 인프라 감자
    삶은 인프라
    인프라 감자
  • 전체
    오늘
    어제
    • 분류 전체보기 (243)
      • 클라우드&인프라 (28)
        • 인프라 공부 (4)
        • AWS 구조와 서비스 (18)
        • 클라우드 공부 (4)
        • Terraform (2)
      • AWS Cloud School (13)
        • project (5)
        • Linux, Network (6)
        • Docker (2)
      • BackEnd (162)
        • JAVA 공부 (15)
        • 알고리즘 공부 (71)
        • MySQL 문제 풀기 (8)
        • 스프링 핵심 원리 - 기본편 (18)
        • 스프링 MVC 1편 (4)
        • 자바 ORM 표준 JPA 프로그래밍 (21)
        • 실전! 스프링 부트와 JPA 활용1 (8)
        • 실전! 스프링 부트와 JPA 활용2 (5)
        • 스프링 데이터 JPA (8)
        • Querydsl (4)
      • 혼자하는 프로젝트 (32)
        • 배달의 민족 클론코딩 (7)
        • 나만의 프로젝트 (10)
        • 스프링 부트로 구현한 웹 (15)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Email
    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    프로그래머스
    정렬
    querydsl
    자동 배포
    쿼드 압축
    다이나믹 프로그래밍
    linux
    중첩 선언
    네트워크 기본 용어
    조합
    상속
    이것이 자바다
    백트래킹
    자바
    유니온 파인드
    스프링 핵심 원리-기본편
    VPN
    완전탐색
    디팬스 게임
    dp
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
인프라 감자
CentOS에서 보안 회선 VPN 구성 (실습)
상단으로

티스토리툴바