🏫 Cloud Practice/🧪 On-Premise

VPN 서버를 만들어보자

나리 집사 2023. 10. 10. 20:30

이론

VPN (Virtual Private Network)

VPC(Virtual Private Network - 가상 사설망)은 네트워크와 네트워크 혹은 사용자와 네트워크간에 암호화된 암호화된 네트워크 연결을 생성하는 기술이다. VPN은 인터넷 상에 암호화된 터널을 만들기 때문에, 안전한 데이터 통신이 가능하다.

VPN은 크게 두 가지 타입이 있다.

  1. Site-To-Site VPN : 두 개의 네트워크를 VPN 장치를 이용해서 연결한다. 네트워크 단위에서 직접 연결이 되기 때문에, 사용자는 PC에 VPN 클라이언트등을 설치할 필요 없이 다른 네트워크에 접근할 수 있다. 온-프레미스 데이터 센터를 클라우드에 연결하기 위해서 혹은 회사 네트워크를 클라우드나 온-프레미스 데이터 센터에 연결하기 위해서 사용한다.
  2. Host-To-Site VPN : 개별 사용자가 자신의 PC에 설치된 VPN 클라이언트를 이용해서 네트워크에 접근한다. 원격 근무자가 안전하게 네트워크에 접근 할 수 있도록 하기 위해서 사용한다.

 

 

내가 집에서 회사 내부의 Bastion 서버와 통신을 하고 싶은 상황이다. 근데, 반드시 Bastion 속해있는 네트워크(10.20.30.0/24) 내에서만 Bastion과 통신을 해야한다.

  • 원래는 외부에서 내부로 접속하는것 자체가 불가능하다. 또한 내부에있는 서버에 접속하기 위해서는 여태까지 DNAT같은 주소 변환을 통해 접속을 했었는데, 내가 실제로 해당 사설네트워크에 존재하고 싶은 경우 VPN을 사용하면 된다.
  • 원래는 그렇지 않은데, ‘내가 마치 해당 사설 대역에 있는 것 처럼 동작’한다.
  • 외부에 있는 호스트(A) 입장에서는 이 서버(mint)가 VPN을 통해 경유를 했는지 그렇지 않는지를 구분할 수 없다.
  • 내가 어떤 네트워크에 속해 있다 = 물리적(인터페이스가 스위치에 연결)+논리적(그 대역의 아이피를 하나 부여받았다)으로 해당 네트워크에 속해 있다. => 내가 VPN을 통해 해당 사설네트워크에 존재한다면 이 법칙이 성립할것이다.

 

암호화 (IPsec)

사용할 프로토콜 = IPsec

IPsec의 종류 AH(Authentication Header), ESP(Encapsulation Security Payload)

*Payload = 원본 패킷

 

사용할 방식 = ESP, 원본패킷(데이터)을 캡슐화 하는 방식. ( 앞뒤로 ESP 헤더 추가하는 방식이다.) 

1.ESP의 두개의 mode = tranport 방식 , tunneling 방식(우리가 사용할 mode)

2.암호화 방식 : DES,3DES,AES(우리가 사용할 방식)

# 복호화를 통해서 원본데이터를 복구 가능하다.

3.무결성 확인 방식 : MD5(Message-Digest Algorithm 5), SHA(Secure Hash Algorithm)

# hash(해시 함수, 알고리즘) => 어떤 데이터든 간에 고정된 비트값으로 변환. 원본값을 복구 불가능. 

4.위와 같은 정책을 사용할 기간

1+2+3+4 => ESP group

 

 

실습

Host-to-VPN 실습

실습1: VPN Server Client

VPN Server(VyOS vpn) - VPN Client(mint) 구조

# <VyOS-vpn Server>
$ conf
$ set ser ssh port 222
$ set system gate 211.183.3.2
$ set int eth eth0 add 211.183.3.10/24

# 설정에서 VMnet5의 eht1 추가

$ set int eth eth1 add 10.20.30.252/24
$ commit
# 터널링 = L2TP
# 암호화 = IPsec

# ipsec을 설정할 인터페이스가 eth0이다.
$ set vpn ipsec ipsec-interfaces int eth0

# VPN을 통해 IP가 변조되더라도 이를 허용하겠다.
# VPN은 IP가 변경되기 때문에 IP정보를 담고 있는 header 정보가 변경이 된다.
# header 정보가 변경되더라도 이를 허용하겠다는 뜻.
$ set vpn ipsec nat-traversal enable

# 어떤 주소에 대해 vpn 접속 허용할 것인지? 전체 대역(0.0.0.0/0)
$ set vpn nat-networks allowed-network 0.0.0.0/0

# vpn 클라이언트들이 접속을 할 주소 (VPN server의 주소)
$ set vpn l2tp remote-access outside-address 211.183.3.10

# 클라이언트가 사설 네트워크(10.20.30.0/24)에 존재할 때 부여받게 될 내부 주소
$ set vpn l2tp remote-address client-ip-pool start 10.20.30.200
$ set vpn l2tp remote-address client-ip-pool stop 10.20.30.210

# 사전공유키 방식의 인증(authentication)을 하겠다.
# pre-shared-key는 사전공유키, 사전에 key값을 주고받은다음에 이 키를 인증.
$ set vpn l2tp remote-access ipsec-settings authentication mode pre-shared-secret

# 사전공유키는 chan이다.
$ set vpn l2tp remote-access ipsec-settings authentication pre-shared-secret chan

# 사용자 인증은 로컬로 하겠다.
$ set vpn l2tp remote-access authentication mode local

# 사용자 ID와 PASS는 min // min이다.
$ set vpn l2tp remote-access authentication local-users username min password min

$ commit

# run sh vpn ipsec <옵션>으로 설정 여부 확인 가능
# <mint server>
# mint에서 VPN 접속하기

# L2TP 커널링이 존재하지 않기 때문에 패키지를 설치한다.
# 리눅스 민트에서 VPN Client 설치 명령어
$ apt-get install network-manager-l2tp network-manager-l2tp-gnome

# 다시 리눅스 민트로 가서 +를 누르면 l2tp가 생긴 것을 확인할 수 있다. 
# VyOS에서 pre-shared-key를 chan 으로 설정 (network 설정-identity-IPsec Settings-L2TP IPsec Options-chan)
# VyOS VPN connection VPN 켜기
# ip add 명령어로 ppp0(VPN을 위한 가상 NIC), 10.20.30.200(부여받은 IP) 확인 가능

# mint에서 vmnet5에 존재하는 서버(bastion 10.20.30.100)에 핑을 쳐본다.
# 정확하게 확인을 하려면 ssh접속을 해본다 root@bastion이 뜨는걸로 보아 잘 되는걸 알 수 있다.

 

실습2: VPN DB Server 접속하기

같은 VyOS에서 VPN 설정을 삭제하고 eth2를 만든 후 10.20.31.0 /24 대역에 있는 DB 서버에 ssh 접속을 해본다.

mint 서버는 VPN 접속시 10.20.31.50~60 사이의 주소를 받아온다.

# vyos
$ set vpn ipsec-interfaces int eth0
$ set vpn ipsec nat-traversal enable
$ set vpn ipsec nat-networks allowed-network 0.0.0.0/0

$ set vpn l2tp remote-access outside-address 211.183.3.10
$ set vpn l2tp remote-access client-ip-pool start 10.20.31.50
$ set vpn l2tp remote-access client-ip-pool stop 10.20.31.60
$ set vpn l2tp remote-access ipsec-settings authentication mode pre-shared-secret
$ set vpn l2tp remote-access ipsec-settings authentication pre-shared-secret test
$ set vpn l2tp remote-access authentication mode local
$ set vpn l2tp remote-access authentication local-users username test password test
$ commit

# mint에서 l2tp 연결
# Pre-shared key (PSK)

$ set int eth eth2 add 10.20.31.252/24
$ commit

# DB 서버에 잘 접속되는 것을 확인할 수 있다.
# CentOS7에 vpn client를 설치하는 방법은 아래와 같다.
$ yum install epel-release
$ yum install xl2tpd NetworkManager-l2tp NetworkManager-l2tp-gnome

 

Site-to-Site VPN 실습

실습3: Site-to-Site VPN

# vyos1
$ conf
$ set int eth eth0 add 211.183.3.10/24
$ set ser ssh port 222
$ set system gateway-address 211.183.3.2
# 인터페이스 카드 추가 (VMnet1)
$ set int eth eth1 add 192.168.1.252/24
$ commit
$ run sh int
# vyos2
$ conf
$ set int eth eth0 add 211.183.3.20/24
$ set ser ssh port 222
$ set system gateway-address 211.183.3.2
# 인터페이스 카드 추가 (VMnet2)
$ set int eth eth1 add 192.168.2.252/24
$ commit
$ run sh int

Virtual Network Editor에서 VMnet1, VMnet2의 Host Connection을 해제한다. 상황상  혹시라도 vmnet1과 vmnet2가 통신이 되면 안되기 때문이다.

 

Adress: 192.168.1.100 / Netmask: 255.255.255.0 / Gateway: 192.168.1.252

vmnet1에 두고 사용할 mint OS를 설정한다.

Adress: 192.168.2.100 / Netmask: 255.255.255.0 / Gateway: 192.168.2.252

vmnet2에 두고 사용할 CentOS OS를 설정한다.

 

# vyos1

# ESP 구성시 압축은 하지 않겠다.
$ set vpn ipsec esp-group head-esp compression disable 

# 정책을 사용할 기간 1800초
$ set vpn ipsec esp-group head-esp lifetime 1800      

# ESP 터널링 모드를 사용하겠다.
$ set vpn ipsec esp-group head-esp mode tunnel  

# pfs(Perfect Key Exchange) 방식을 활성화 하겠다.
$ set vpn ipsec esp-group head-esp pfs enable

# 암호화 방식은 aes256이다
$ set vpn ipsec esp-group head-esp proposal 1 encryption aes256

# 무결성은 sha256 방식을 쓰겠다.
$ set vpn ipsec esp-group head-esp proposal 1 hash sha256


# IKE(Internet Key Exchange)

# IKE v1만 사용하겠다, v2는 쓰지 않겠다.
$ set vpn ipsec ike-group head-ike ikev2-reauth no
$ set vpn ipsec ike-group head-ike key-exchange ikev1

# 정책 사용기간은 1800초다
$ set vpn ipsec ike-group head-ike lifetime 1800

# 암호화 방식
$ set vpn ipsec ike-group head-ike proposal 1 encryption aes256

# 무결성 확인 방식
$ set vpn ipsec ike-group head-ike proposal 1 hash sha256

# vpn을 구성할 인터페이스
$ set vpn ipsec ipsec-interfaces int eth0

# 인증 방식은 사전공유키
$ set vpn ipsec site-to-site peer 211.183.3.20 authentication mode pre-shared-secret 

# 사전공유키는 aws
$ set vpn ipsec site-to-site peer 211.183.3.20 authentication pre-shared-secret aws

# 위에서 구성한 ike-group 이름은 head-ike
$ set vpn ipsec site-to-site peer 211.183.3.20 ike-group head-ike

# VyOS1의 외부 주소
$ set vpn ipsec site-to-site peer 211.183.3.20 local-address 211.183.3.10

# 주소변환은 허용하지 않겠다
$ set vpn ipsec site-to-site peer 211.183.3.20 tunnel 0 allow-nat-networks disable

# 퍼블릭 대역은 허용하지 않겠다.
$ set vpn ipsec site-to-site peer 211.183.3.20 tunnel 0 allow-public-networks disable

# 위에서 구성한 esp-group 이름
$ set vpn ipsec site-to-site peer 211.183.3.20 tunnel 0 esp-group head-esp           

# site-to-site를 구성할 내(vyos1) 사설 대역
$ set vpn ipsec site-to-site peer 211.183.3.20 tunnel 0 local prefix 192.168.1.0/24

# site-to-site를 구성할 상대(vyos2) 사설 대역
$ set vpn ipsec site-to-site peer 211.183.3.20 tunnel 0 remote prefix 192.168.2.0/24
# vyos2
$ set vpn ipsec esp-group branch-esp compression disable 
$ set vpn ipsec esp-group branch-esp lifetime 1800
$ set vpn ipsec esp-group branch-esp mode tunnel
$ set vpn ipsec esp-group branch-esp pfs enable
$ set vpn ipsec esp-group branch-esp proposal 1 encryption aes256
$ set vpn ipsec esp-group branch-esp proposal 1 hash sha256      

$ set vpn ipsec ike-group branch-ike ikev2-reauth no       
$ set vpn ipsec ike-group branch-ike key-exchange ikev1
$ set vpn ipsec ike-group branch-ike lifetime 1800     
$ set vpn ipsec ike-group branch-ike proposal 1 encryption aes256
$ set vpn ipsec ike-group branch-ike proposal 1 hash sha256

$ set vpn ipsec ipsec-interfaces int eth0
$ set vpn ipsec site-to-site peer 211.183.3.10 authentication mode pre-shared-secret
$ set vpn ipsec site-to-site peer 211.183.3.10 authentication pre-shared-secret aws
$ set vpn ipsec site-to-site peer 211.183.3.10 ike-group branch-ike

$ set vpn ipsec site-to-site peer 211.183.3.10 local-address 211.183.3.20
$ set vpn ipsec site-to-site peer 211.183.3.10 tunnel 0 allow-nat-networks disable
$ set vpn ipsec site-to-site peer 211.183.3.10 tunnel 0 allow-public-networks disable
$ set vpn ipsec site-to-site peer 211.183.3.10 tunnel 0 esp-group branch-esp         
$ set vpn ipsec site-to-site peer 211.183.3.10 tunnel 0 local prefix 192.168.2.0/24
$ set vpn ipsec site-to-site peer 211.183.3.10 tunnel 0 remote prefix 192.168.1.0/24

$ run sh vpn ipsec sa
# state: up 확인

# mint(vmnet1)에서 bastion(vmnet2)로 ping 했을 때 통신이 잘 되는것을 확인할 수 있다.