OpenVPN이란?
OpenVPN은 오픈 소스 기반의 VPN (Virtual Private Network) 소프트웨어입니다. SSL/TLS 프로토콜을 사용하여 안전한 포인트-투-포인트 또는 사이트-투-사이트 연결을 제공하며, 인터넷을 통해 개인 네트워크의 보안 및 프라이버시를 확장하고 강화하는 데 사용됩니다.
OpenVPN의 주요 특징
- 암호화 : OpenVPN은 데이터를 암호화하여 인터넷을 통해 안전하게 전송합니다. SSL/TLS를 기반으로 하는 강력한 암호화 기능을 제공합니다.
- 유연성 : 다양한 네트워크 환경에서 사용할 수 있으며, NAT, 방화벽 등 다양한 네트워크 구성과 호환됩니다.
- 플랫폼 호환성 : OpenVPN은 윈도우, macOS, 리눅스, iOS, 안드로이드 등 다양한 운영 체제에서 실행됩니다.
- 구성 가능성 : 고도로 구성 가능하며, 각종 네트워크 설정, 보안 옵션, 인증 방식 등을 사용자가 직접 설정할 수 있습니다.
- 사이트-투-사이트 및 원격 접속 : OpenVPN은 기업 환경에서 사이트 간 네트워크 연결 또는 개인 사용자의 원격 접속 용도로 사용될 수 있습니다.
- 커뮤니티 및 상업적 지원 : 오픈 소스 커뮤니티에서 활발히 지원되며, 상업적 지원도 제공하는 버전이 있습니다.
사용 시나리오
- 원격 근무 : 재택 근무자들이 회사의 네트워크에 안전하게 접근할 수 있습니다.
- 보안 강화된 인터넷 접속 : 공용 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/
윈도우에서 openvpn을 설치하기
C:\Program Files\OpenVPN\config
이 주소로 가상 머신에 있는 ta.key와 woong.ovpn 을 가져오면 됩니다.
가져올 때는 scp를 사용해 가져옵니다.
scp를 사용해 가져올 수 있습니다!!
그 후 실행을 한 뒤 연결을 해보면 접속된 것을 확인 할 수 있습니다.
- VPN을 껐을 때
- VPN을 켰을 때
참고
https://blog.naver.com/taetae94-/223018932241
'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 |