30일차) 2025-02-11 (VyOS 풀이, VPN, Overlay Network)
문제)
호성이는 VyOS를 통해 다양한 서버를 운영하고자 한다.
주어진 내부 대역은 10.20.30.0 /23 대역이며 vmnet5, 6을 사용한다. VAR과 DB라는 두개의 내부 Zone과 PUB zone을 통해 다음과 같은 구성을 하고자한다.
→ 10.20.30.0 /24 , 10.20.31.0 /24
1. VAR zone에 varwp라는 호스트네임을 갖는 wordpress 서버를 구성하고, DB zone에는 dbdb라는 이름의 mariadb 데이터베이스 서버 구성을 하고자한다. wordpress 서비스는 PUB 대역에 제공하며 사용자들은 www.rapa.com으로 접속해야한다.
2. 재택근무중인 태호 사원은 데이터베이스 관리자이며, VAR zone의 bastion이라는 호스트네임을 갖는 서버에 bastion.rapa.com이라는 영문주소로 ssh 접속이 가능하며, 이 서버를 경유하여 DB zone의 dbdb 서버에 ssh로 접속하여야 한다. DB서버는 절대 PUB zone에서의 접속을 허용하지 않는다.
3. bastion 서버는 PUB 대역에 tftp 서비스도 제공한다. 사용자들은 tftp.rapa.com으로 이 서버에 접속할 수 있다.
주의) firwall-cmd로 방화벽 열어줄때 --add-service=tftp, --add-port=69 양쪽 다 열어주세요.
이때 서버의 방화벽은 물론, ZONE기반 방화벽 정책 구성을 통해 반드시 필요한 트래픽만 허용해야한다.
풀이)
PUB mint 211.183.3.100 211.183.3.0 /24 (vmnet8) |
|||
↑ (X) / ↓(△ http, ssh, tftp, dns) | .252 .252 VyOS .252 |
↑ (X) / ↓(X) | |
VAR varwp: wordpress, dns 10.20.30.80 bastion: ssh, tftp 10.20.30.100 10.20.30.0 /24 (vmnet5) |
← (X) → (db, ssh) |
DB mariadb(dbdb) 10.20.31.33 10.20.31.0 /24 (vmnet6) |
- 인터페이스 추가 후 주소 및 설명 설정
set int eth eth0 add 211.183.3.252/24
set int eth eth1 add 10.20.30.252/24
set int eth eth2 add 10.20.31.252/24
set int eth eth0 desc PUB
set int eth eth1 desc VAR
set int eth eth2 desc DB
- vyos 접근을 위한 포트를 222번으로 설정
set service ssh port 222
- 디폴트 루트 설정
set system gateway-address 211.183.3.2
NAT 설정
- VAR, DB존이 외부로 통신되기 위한 PAT 설정
set nat source rule 10 outbound-interface eth0
set nat source rule 10 source address 10.20.30.0/23
set nat source rule 10 translation address masquerade
- bastion의 ssh, varwp, tftp의 http접속을 위한 DNAT 설정
set nat destination rule 10 inbound-interface eth0
set nat destination rule 10 destination port 22
set nat destination rule 10 protocol tcp
set nat destination rule 10 translation add 10.20.30.100
set nat destination rule 20 inbound-interface eth0
set nat destination rule 20 destination port 80
set nat destination rule 20 protocol tcp
set nat destination rule 20 translation add 10.20.30.80
set nat destination rule 30 inbound-interface eth0
set nat destination rule 30 destination port 69
set nat destination rule 30 protocol udp
set nat destination rule 30 translation add 10.20.30.100
bastion server
tftp
- 패키지 설치
[root@bastion ~]# yum install -y tftp-server
varwp server
wordpress
- bastion에서 varwp로 ssh 접속하여 필요한 패키지
php php-mysql wget unzip mysql
- 필요한 패키지 설치
[root@varwp ~]# yum install -y wget unzip mysql
[root@varwp ~]# yum install -y mysql epel-release yum-utils https://rpms.remirepo.net/enterprise/remi-release-7.rpm
[root@varwp ~]# yum-config-manager --enable remi-php73
[root@varwp ~]# yum install -y php php-mysql
- wp-config 구성
DB이름 : wpdb
DB사용자 : wpuser
DB암호 : 1234
DB주소 : 10.20.31.33
- wordpress의 하위폴더 포함 내용물을 웹루트디렉토리에 복사
[root@varwp ~]# wget https://wordpress.org/latest.zip[root@varwp ~]# unzip latest.zip
[root@varwp ~]# cp -r wordpress/* /var/www/html
- wp-config.php 파일 구성
[root@varwp ~]# cd /var/www/html
[root@varwp html]# mv wp-config-sample.php wp-config.php
- db서버에 ssh로 접속하여 db 구성
[root@varwp html]# ssh root@10.20.31.33
dbdb server
MariaDB
- 데몬 설치 후 기타 보안 설정
[root@dbdb ~]# yum install -y mariadb-server
[root@dbdb ~]# systemctl restart mariadb
[root@dbdb ~]# systemctl enable mariadb
[root@dbdb ~]# mysql_secure_installation
[root@dbdb ~]# mysql -u root -p1234
MariaDB [(none)]> create database wpdb;
- 권한 부여
MariaDB [(none)]> grant all privileges on wpdb.* to wpuser@'%' identified by '1234';
bastion server
DNS
- 영역 생성
[root@bastion ~]# vi /etc/named.rfc1912.zones
- rapa.com의 안내파일 생성
[root@bastion ~]# vi /var/named/rapa.com.db
$TTL 3H
@ SOA @ root (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
IN NS @
IN A 211.183.3.252
www IN A 211.183.3.252
tftp IN A 211.183.3.252
bastion IN A 211.183.3.252
ssh IN A 211.183.3.252
[root@bastion ~]# systemctl restart named
[root@bastion ~]# systemctl enable named
- vyos에서 DNS를 위한 DNAT 설정
set nat destination rule 40 destination port 53
set nat destination rule 40 inbound-interface eth0
set nat destination rule 40 protocol tcp_udp
set nat destination rule 40 translation add 10.20.30.100
방화벽 구성
vyos@vyos# set zone-policy zone pub interface eth0
vyos@vyos# set zone-policy zone var interface eth1
vyos@vyos# set zone-policy zone db interface eth2
vyos@vyos# commit
1. VAR_TO_DB
# DB에서 VAR는 모두 거부이기때문에 배려해줄 필요가 없음 = est, releate 해줄 필요 없음
set firewall name VAR_TO_DB rule 10 action accept
set firewall name VAR_TO_DB rule 10 protocol tcp
set firewall name VAR_TO_DB rule 10 destination port 3306,22
set zone-policy zone db from var firewall name VAR_TO_DB
2. DB_TO_VAR
# VAR에서 db,ssh로 접속하는애들을 돌려보내줘야 하기때문에 이들을 배려해서 정책을 생성
set firewall name DB_TO_VAR rule 20 action accept
set firewall name DB_TO_VAR rule 20 state established enable
set firewall name DB_TO_VAR rule 20 state related enable
set firewall name DB_TO_VAR rule 20 protocol all
set zone-policy zone var from db firewall name DB_TO_VAR
# 외부에서 varwp로 접근할 수 있는 방법이 없기때문에 vyos에서 ssh로 varwp 접속
# varwp에서 db로 잘 접근되는걸 확인 가능 → var_to_db 및 db_to_var 방화벽이 잘 구성된걸 확인
# 핑은 안된다 = db만되고 딴건 안됨
3. PUB_TO_VAR
set firewall name PUB_TO_VAR rule 30 action accept
set firewall name PUB_TO_VAR rule 30 protocol tcp
set firewall name PUB_TO_VAR rule 30 destination port 53,80,22
set firewall name PUB_TO_VAR rule 31 action accept
set firewall name PUB_TO_VAR rule 31 protocol udp
set firewall name PUB_TO_VAR rule 31 destination port 69,53
set zone-policy zone var from pub firewall name PUB_TO_VAR
4. VAR_TO_PUB
# PUB에서 VAR로 오는 애들을 배려해주는 정책 생성
set firewall name VAR_TO_PUB rule 40 action accept
set firewall name VAR_TO_PUB rule 40 protocol all
set firewall name VAR_TO_PUB rule 40 state established enable
set firewall name VAR_TO_PUB rule 40 state related enable
set zone-policy zone pub from var firewall name VAR_TO_PUB
서버의 방화벽 구성
- bastion의 firewalld 구성
[root@bastion ~]# systemctl start firewalld
- bastion의 tftp 서비스 오픈
[root@bastion ~]# firewall-cmd --permanent --add-service=tftp
[root@bastion ~]# firewall-cmd --reload
- bastion의 dns 서비스 오픈
[root@bastion ~]# firewall-cmd --permanent --add-service=dns
[root@bastion ~]# firewall-cmd --reload
- bastion에서 db로 ssh 접속해서 db 서버방화벽 설정
[root@bastion ~]# ssh root@10.20.31.33
- db에서 방화벽 활성화
[root@dbdb ~]# systemctl restart firewalld
- dbdb에서 방화벽 오픈
[root@dbdb ~]# firewall-cmd --permanent --add-port=3306/tcp
[root@dbdb ~]# firewall-cmd --reload
- varwp의 방화벽 활성화
[root@varwp ~]# systemctl restart firewalld
[root@varwp ~]# firewall-cmd --permanent --add-service=http
[root@varwp ~]# firewall-cmd --reload
♨ DNS를 어디에 두는게 좋은지
♨ 하나하나 검증하는게 좀 중요
자율과제)
vyos에서 firewall 정책을 최대한 적게 만들려면 어떻게 하면 좋을까?
= 중복되는 정책들을 줄이는것에 대해서 생각해보라는 뜻입니다.
♨ VPN(Virtual Private Network) ♨
마치 내가 다른 사설 네트워크에 존재하는 것처럼 여겨질 수 있도록 하는 매커니즘
- server-client VPN
- site-to-site VPN
# 내가 만약 터키에 있는것처럼 여겨지고 싶다면, 터키 어딘가의 사설네트워크에 속해있으면 된다. 단순히 내 집의 라우터나 컴퓨터에 공인아이피를 넣는것만으로는 불가능하다. 내가 터키 어딘가의 사설네트워크에 속해있다면, 외부의 누군가와 통신했을때 터키의 공인아이피로 PAT되어 통신이 될것이며 내부 사정을 알 수 없는 외부에서는 이게 한국에서 VPN을 통해 나온건지, 아니면 그냥 터키에서나온건지 식별이 거의 불가능하다.
레거시 네트워크(legacy = underlay)
물리적인 서버, 네트워크 장비 = underlay (↔ 가상화, 클라우드 = overlay)
♨ Overlay Network
가상, 통신이 안되는 사설 네트워크간의 연결을 통해 통신 가능하게 만드는
- 기존의 레거시 네트워크 위에(overlay) 존재하는 가상의 네트워크
- 터널링을 통해 구성되며, 원래는 통신이 안되어야하는 사설, 혹은 가상의 네트워크들끼리 서로 통신이 되게 하는 원리
- 각각의 네트워크에 존재하는 sw를 연결해서 하나의 커다란 vswitch(Virtual switch)를 만든다고 생각하기
= 같은 스위치면 같은 네트워크
tunneling
터널링 → 하나의 방 → 하나의 네트워크 → 스위치간의 연결 → 가상의 vswitch
(∵ 같은 네트워크 → 같은 스위치)
위의 그림과 같이 구성할 vpn-server 역할을 할 vm을 생성해보자.
2core 2GB 5GB, IP 211.183.3.250 /24
- 기본 설정
- 터널링 방식 = L2TP(Layer 2 Tunneling Protocol)
- 암호화 방식 = IPsec
- ipsec 암호화를 할 인터페이스
vyos@vyos# set vpn ipsec ipsec-interfaces int eth0
- VPN을 통해 패킷의 헤더가 변조 되더라도 이를 허용
vyos@vyos# set vpn ipsec nat-traversal enable
- vpn을 허용할 대상 = vpn server에 접속하는 대상은 전체
vyos@vyos# set vpn ipsec nat-networks allowed-network 0.0.0.0/0
- vpn을 통해 내부로 진입하는 client가 받게될 시작 아이피(dhcp의 range랑 비슷)
vyos@vyos# set vpn l2tp remote-access client-ip-pool start 10.20.30.200
- vpn을 통해 내부로 진입하는 client가 받게 될 마지막 아이피(dhcp의 range랑 비슷)
vyos@vyos# set vpn l2tp remote-access client-ip-pool stop 10.20.30.210
# 만약에 vpn에 성공했다면 client는 10.20.30.200 ~ 210 사이의 아이피를 부여받음
- 사전공유키(pre-shared-secret), 미리 주고받은 키값을 통해 서로를 인증
vyos@vyos# set vpn l2tp remote-access ipsec-settings authentication mode pre-shared-secret
- 그 사전공유키 = chan
vyos@vyos# set vpn l2tp remote-access ipsec-settings authentication pre-shared-secret chan
- 사용자 식별은 로컬(그곳의 방식)로 함(ID/PASS)
vyos@vyos# set vpn l2tp remote-access authentication mode local
- 사용자 ID / PASS = min / min
vyos@vyos# set vpn l2tp remote-access authentication local-users username min password min
- vpn client들이 접속할 VyOS의 eth0(외부) 주소
vyos@vyos# set vpn l2tp remote-access outside-address 211.183.3.250
vyos@vyos# commit
vyos@vyos# set int eth eth1 add 10.20.30.250/24
vyos@vyos# commit
# 테스트할 서버를 vmnet5
- client로 사용할 민트
IP 211.183.3.100/24
- network-manager = IP설정하는 GUI 관련 패키지 설치
apt install -y network-manager-l2tp-gnome
- local 인증 = min / min
- IPsec Settings
# 새로운 가상의 인터페이스가 생성되어 아이피를 부여받았다.
# 왜 새로운 NIC가 생겼을까? = vpn을 통해서 접속한 네트워크에 속해있기 위해
# vpn 내부네트워크의 스위치에 연결될 NIC가 필요하니까. 가상의 NIC가 하나 생성됐다.
- vyos에서 pat 설정
set nat source rule 10 outbound-interface eth0
set nat source rule 10 source address 10.20.30.0/24
set nat source rule 10 translation address masquerade
commit
- varwp에서 실제로 패킷을 받는건지 확인해보기 위해 vyos에서 varwp로 ssh 접속
vyos@vyos# ssh root@10.20.30.80
- 패킷을 확인할 tcpdump라는 패키지를 설치
[root@varwp ~]# yum install -y tcpdump
실습)
vpn server의 외부 인터페이스를 211.183.3.150/24와 내부인터페이스 eth1은 10.20.31.0 /24로 하여 비슷하게 구성 후 잘 되는지 테스트해보세요!
- pre-shared-secret : ah
- id / pass = aws / cloud