이론
VPN (Virtual Private Network)
VPC(Virtual Private Network - 가상 사설망)은 네트워크와 네트워크 혹은 사용자와 네트워크간에 암호화된 암호화된 네트워크 연결을 생성하는 기술이다. VPN은 인터넷 상에 암호화된 터널을 만들기 때문에, 안전한 데이터 통신이 가능하다.
VPN은 크게 두 가지 타입이 있다.
- Site-To-Site VPN : 두 개의 네트워크를 VPN 장치를 이용해서 연결한다. 네트워크 단위에서 직접 연결이 되기 때문에, 사용자는 PC에 VPN 클라이언트등을 설치할 필요 없이 다른 네트워크에 접근할 수 있다. 온-프레미스 데이터 센터를 클라우드에 연결하기 위해서 혹은 회사 네트워크를 클라우드나 온-프레미스 데이터 센터에 연결하기 위해서 사용한다.
- 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 했을 때 통신이 잘 되는것을 확인할 수 있다.
'🏫 Cloud Practice > 🧪 On-Premise' 카테고리의 다른 글
Port Forwarding(DNAT), Zone 기반 방화벽 설정을 해보자 (1) | 2023.10.04 |
---|---|
방화벽을 설정해서 웹과 DB에 접근 가능하도록 해보자 (0) | 2023.09.27 |
Wordpress를 설치하고 MariaDB(MySQL)과 연동해보자 (0) | 2023.09.26 |
Migration이란? (0) | 2023.09.21 |
가상화(전가상화, 반가상화)를 이해해보자 (0) | 2023.09.20 |