참고
http://www.jidum.com/jidums/view.do?jidumId=616
http://www.ktword.co.kr/test/view/view.php?m_temp1=1708
https://vpn-mall.com/vpn-openvpn/
https://indienote.tistory.com/606
https://woo-dev.tistory.com/132
https://www.cloudflare.com/ko-kr/learning/ssl/what-happens-in-a-tls-handshake/
https://www.cloudflare.com/learning/ssl/how-does-ssl-work/
0. PV
특정한 회사나 조직이 소유하고 독점적으로 사용하는 네트워크
인터넷 어드레싱 아키텍처에서 사설 IP 주소 공간을 이용하는 네트워크
1. VPN의 정의. ( Virtual Private Network )
터널링(Tunneling) 기법을 사용해 public 망에 접속해 있는 두 네트워크사이의 연결을 전용회선을 이용해 연결한 것과같은 효과를 내는 가상(Virtual) 네트워크.
인터넷(Public network)을 통해 설정되는 디바이스에서 네트워크로의 암호화된 연결
터널링이란?
- 두 노드 또는 두 네트워크 간에 가상의 링크를 형성하는 기법
- 하나의 프로토콜이 다른 프로토콜을 감싸는 캡슐화 기능을 통해 운반
- 대부분, 보안 채널의 역할을 하므로, 암호화 기법 적용
- 오버레이 네트워크 구성도 가능하게 함
- 오버레이 네트워크 : 네트워크의 정의는 물리 네트워크 위에 성립되는 가상의 네트워크.
- 자동차로 부산을 갈 때, 많은 신호등과 고속도로, 국도 등을 지나지만, 비행기를 타고 간다고 생각하면 이 많은 요소를 무시하고 출발과 도착만을 고려한다는 의미
( 오버레이 네트워크는 쿠버네티스에서 사용되는 개념이므로 꼭 숙지하길 바람 )
2. 등장 배경
1) 이동 근무, 본점 지점간, 해외 자회사간, 기업간 협업을 위한 전용망 수요 증가 및 대응 한계
2) 전용망 구성과 관리를 위한 비용의 증가 및 사용량에 따른 대역폭의 탄력적 변경 필요.
3. 특징
1. 적은 비용으로 넓은 범위의 네트워크 구성이 가능
2. 인터넷과 같은 Public IP 네트워크 사용의 안정성 확보
4. 주요 터널링 기법
ㅇ Layer 2 터널링 방식 (데이터링크 계층) : PPTP, L2TP, MPLS 등
- PPP 확장에 의한 터널링 구현 : PPTP, L2TP 등 (단, 데이터 암호화 기능 없음)
. PPTP : MS社에서 개발하고, RFC 2637로 표준화
.. 터널링 외 암호화를 추가하려면, IPSec을 함께 사용해야 함
. L2TP : PPTP 기능을 개선하여, 표준화(RFC 2661,3931) 됨
.. 터널링 외 암호화를 추가하려면, MS社의 MPPE를 함께 사용해야 함
.. 초기 VPN 구현에 광범위하게 사용되었으나, 지금은 IPSec,SSL/TLS 등에 의해 대체
- 망 기반의 터널링 구현 : MPLS
ppp : Point-to-Point Protocol
ㅇ Layer 3 터널링 방식 (IP 계층) : IPSec, GRE 등
- GRE : 터널링 있으나 암호화 없음
. 데이터 암호화 필요시에, `GRE + IPSec`로 결합시켜 보안성 확보
- IPSec : 암호화 및 터널링 모두 있음
ㅇ Layer 4 터널링 방식 (전송 계층) : SSL/TLS, SSH, SOCKS v5 등
- 클라이언트/서버 내 두 응용 간에 세션 단위로 터널링 설정됨
. 주로, TCP(때론, UDP) 보안 채널을 형성함
참고 - 우리가 VPN 을 사용해서 IP를 우회하는
방법1.
방법2.
브라우저로 '네이버'를 접속하고자 하면 SNI 필드 값은 'www.naver.com' 이 됩니다. 정부는 이 점을 이용해 특정 사용자가 접속하려는 도메인 정보를 읽어서 지정된 유해사이트에 해당되면 차단하고 있습니다.
하지만, SNI 정보를 못 읽도록 암호화 한다면 어떻게 될까요? SNI필드를 제대로 읽지 못하므로 검열에서 걸리지 않게 됩니다. 유니콘 https는 바로 이러한 방법으로 검열을 통과합니다. 서버에 요청하기 전에 SNI필드를 암호화하여 오직 접속하려는 서버만 암호화된 SNI를 해석할 수 있도록 하는 것이죠.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
5. 이번에 사용하게되는 OpenVPN이란? : 4계층 VPN
- SSLv3/TLSv1 프로토콜과 OpenSSL 라이브러리를 결합한 방식.
TLS (Transport Layer Security) : SSL의 향상된, 더욱 안전한 버전
- 인터넷에서의 정보를 암호화해서 송수신하는 프로토콜이다.
- 넷스케이프 개발한 SSL(Secure Sockets Layer) 기반 기술이다.
- 국제 인터넷 표준화 기구에서 인증받은 프로토콜이다.
- 표준에 명시된 명칭은 TLS (but, SSL 이라는 용어가 매우 많이 사용되고 있다.)
- 최신 버전인 TLS 버전 1.0은 SSL 버전 3.0으로부터 발전한 업그레이드를 제공한다.
- IETF에서 SSLv3를 기반으로 표준화
- 아래의 프로토콜 및 암호 요구사항이 변경: 필수
- Diffie-Hellman key agreement
- Digital Signature Standard
- 3DES encryption
- HMAC 사용
SSL
웹사이트와 브라우저 사이(또는 두 서버 사이)에 전송되는 데이터를 암호화하여 인터넷 연결을 보호하기 위한 표준 기술
1. 아래의 프로토콜 및 암호 요구사항: 옵션
- Diffie-Hellman key agreement
- Digital Signature Standard
- 3DES encryption
SSL/TLS 터널링 연결 과정. // https://www.cloudflare.com/ko-kr/learning/ssl/what-happens-in-a-tls-handshake/ 참고
TLS 핸드셰이크가 이루어지는 단계는 어떻게 될까요?
- '클라이언트 헬로' 메시지: 클라이언트가 서버로 "헬로" 메시지를 전송하면서 핸드셰이크를 개시합니다. 이 메시지에는 클라이언트가 지원하는 TLS 버전, 지원되는 암호 제품군, 그리고 "클라이언트 무작위"라고 하는 무작위 바이트 문자열이 포함됩니다.
- '서버 헬로' 메시지: 클라이언트 헬로 메시지에 대한 응답으로 서버가 서버의 SSL 인증서, 서버에서 선택한 암호 제품군, 그리고 서버에서 생성한 또 다른 무작위 바이트 문자열인 "서버 무작위"를 포함하는 메시지를 전송합니다.
- 인증: 클라이언트가 서버의 SSL 인증서를 인증서 발행 기관을 통해 검증합니다. 이를 통해 서버가 인증서에 명시된 서버인지, 그리고 클라이언트가 상호작용 중인 서버가 실제 해당 도메인의 소유자인지를 확인합니다.
- 예비 마스터 암호: 클라이언트가 "예비 마스터 암호"라고 하는 무작위 바이트 문자열을 하나 더 전송합니다. 예비 마스터 암호는 공개 키로 암호화되어 있으며, 서버가 개인 키로만 해독할 수 있습니다. (클라이언트는 서버의 SSL 인증서를 통해 공개 키를 받습니다.)
- 개인 키 사용: 서버가 예비 마스터 암호를 해독합니다.
- 세션 키 생성: 클라이언트와 서버가 모두 클라이언트 무작위, 서버 무작위, 예비 마스터 암호를 이용해 세션 키를 생성합니다. 모두 같은 결과가 나와야 합니다.
- 클라이언트 준비 완료: 클라이언트가 세션 키로 암호화된 "완료" 메시지를 전송합니다.
- 서버 준비 완료: 서버가 세션 키로 암호화된 "완료" 메시지를 전송합니다.
- 안전한 대칭 암호화 성공: 핸드셰이크가 완료되고, 세션 키를 이용해 통신이 계속 진행됩니다.
모든 TLS 핸드셰이크가 비대칭 암호화(공개 키와 개인 키)를 사용하지만, 세션 키를 생성하는 과정에서 모두가 개인 키를 사용하는 것은 아닙니다. 예를 들어, 임시 Diffie-Hellman 핸드셰이크는 다음과 같이 진행됩니다.
- 클라이언트 헬로: 클라이언트가 프로토콜 버전, 클라이언트 무작위, 암호 제품군 목록을 포함하는 클라이언트 헬로 메시지를 전송합니다.
- 서버 헬로: 서버가 SSL 인증서, 선택한 암호 제품군, 서버 무작위를 포함하는 응답을 전송합니다. 위에 설명한 RSA 핸드셰이크와 달리, 서버는 이 메시지에 다음 내용도 포함합니다(단계 3).
- 서버의 디지털 서명: 서버가 개인 키를 사용하여 클라이언트 무작위, 서버 무작위, 서버의 DH 매개변수를 암호화합니다*. 이 암호화된 데이터가 서버의 디지털 서명 역할을 하면서 서버가 SSL 인증서의 공개 키와 일치하는 개인 키를 보유하고 있다는 것을 증명합니다.
- 디지털 서명 확인: 클라이언트가 공개 키를 사용하여 서버의 디지털 서명을 해독하고, 서버가 해당 개인 키를 관리하고 있으며 인증서에 명시된 서버가 맞다는 것을 검증합니다. 클라이언트 DH 매개변수: 클라이언트가 DH 매개변수를 서버로 전송합니다.
- 클라이언트와 서버가 예비 마스터 암호를 계산: RSA 핸드셰이크의 경우에서처럼 클라이언트가 예비 마스터 암호를 생성하여 서버로 전송하는 대신, 클라이언트와 서버가 서로 교환한 DH 매개변수를 사용하여 일치하는 예비 마스터 암호를 별도로 계산합니다.
- 세션 키 생성: 이제 클라이언트와 서버가 RSA 핸드셰이크에서와 마찬가지로 예비 마스터 암호, 클라이언트 무작위, 서버 무작위를 사용하여 세션 키를 계산합니다.
- 클라이언트 준비 완료: RSA 핸드셰이크와 동일합니다.
- 서버 준비 완료
- 안전한 대칭 암호화 성공
*DH 매개변수: DH는 Diffie-Hellman을 의미합니다. Diffie-Hellman 알고리즘은 지수 계산을 이용해 동일한 예비 마스터 암호를 생성합니다. 서버와 클라이언트가 각자 계산을 위한 매개변수를 제공하고, 각자 서로 다른 계산 결과가 나오지만, 합치면 결과가 동일해집니다.
7. OpenVPN 동작 방식
- 1. 클라이언트 연결
- 클라이언트와 VPN 서버와의 터널링이 연결됨.
- 클라이언트의 IP가 VPN 서버에 연결이 되었다고 기록이됨.
- 2. 클라이언트와 서버와의 통신 // vpn이 연결되어있는 상태에서 ping을 보내면 외부 public 망의 ip만 노출이된다.
내부 inner ip는 암호화되어 보이지 않는다. 이를 확인하려면, Secure Gateway(OpenVPN TAP-Windows6)에서 확인을 해야한다. - 클라이언트가 PN 망 내부의 호스트로 데이터를 보내려고 한다.
- 패킷이 VPN 대역의 IP로 연결을 할 시에는 Virtual NIC Driver를 거치면서 Inner IP가 생성되고, 암호화된다.
- 그 다음 NIC DRIVER를 거치면서 Public IP가 Outer IP로 감싸진다.
- 이 패킷은 인터넷을 가로질러서 목적지(서버측 Public IP)까지 도착한다.
- 목적지의 Secure Gateway는 public ip가 vpn서버에 기록이 되어있으므로, TUN0로 전달되고 나머지 암호화된 패킷을 깐다.
- 패킷을 까면 원래 보내고자 하는 패킷이 나오고, 목적지 호스트로 전달할 수 있다.
- 응답 패킷은 정확히 반대의 과정을 거친다
8. OpenVPN에서 사용하는 인증서를 발급하는 방법
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
1) EasyRSA : OpenVPN 에서 사용하는 인증서를 발급하기위해 만든 CA (CertIficate Authority) 구축 유틸리티
단계
1. CA 초기화 :
./easyrsa init-pki
2. CA 구축
easyrsa build-ca
3. CSR ( Certificate Signing Request ) 생성
인증서가 필요한 시스템 (클라이언트) 쪽에서 인증서 서명 요청 (CSR : Certificate Signing Request) 를 생성한 후에 이를 CA 쪽에 전달해주어 CA 쪽에서 CA 개인키로 전자서명을 해서 생성하는게 인증서
./easyrsa gen-req ${서버명}
4. 서버/클라이언트 인증서 생성
./easyrsa sign-req ${server | client} ${이름}
5. 보안 키 생성
./easyrsa gen-dh
6. TA(Trusted Authority) 키 생성 << 얘와 ca.crt 키 파일은 서버, 클라이언트 측에 모두 존재해야함.
openvpn --genkey --secret ta.key
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
8. OpenVPN 서버측 설정.
sudo ufw allow 443/tcp << 방화벽 오픈
우리가 주로 봐야할 파일은 /etc/openvpn/server.conf 파일이다.
또한 방화벽도 설정해야하므로, firewall을 설정해야한다.
위에서 Diffie–Hellman key를 생성하면 dh.pem으로 나옴
dh dh2048.pem >> dh.pem
암호화 방식 설정
;cipher AES-256-CBC > cipher AES-256-GCM
auth SHA256 추가
key-direction 1 추가
통신방식 tcp
proto udp > proto tcp
통신 포트 설정
remote ${server ip} ${port} << 원하는 것으로
권한 설정 - 주석 해제
user nobody
group nogroup
nat, dns 허용
push "redirect-gateway def1 bypass-dhcp" 주석 해제
dns 서버, 보조 dns 서버 설정
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
/etc/sysctl.conf 파일 설정
net.ipv4.ip_forward=1 // 포트포워딩 허용
/etc/ufw/before.rules
POSTROUTING : 호스트에서 아웃바운드로 나가는 트래픽을 다른 IP나 포트로 포워딩 한다
https://blog.pages.kr/1444 : 참고
- 추가 -
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to enp3s0
-A POSTROUTING -s 10.8.0.0/8 -o enp3s0 -j MASQUERADE
/etc/default/ufw
'네트워크' 카테고리의 다른 글
path vector, distance vector, link state (0) | 2022.12.28 |
---|---|
dhcp 동작과정 - 요약 (0) | 2022.12.27 |
DNS, Resolver (0) | 2022.09.26 |
쿠키와 세션 // 퍼옴 (1) | 2022.09.25 |
네트워크 dmz, public, private (0) | 2022.09.17 |