Proxmox 에서 SDN (영역 및 VNets) 설정하여 네트워크 분리하기
웹 UI 에서 데이터센터 > SDN > '영역' 과 'VNets' 설정을 적절히 하여 네트워크를 분리할 수 있습니다.
VNets 생성시 영역을 선택하도록 되어 있으므로, 아래와 같이 영역을 미리 만들고 계획에 맞게 분리하면 됩니다.
1. 영역 생성
영역은 zone 과 같은 의미 입니다.
1) 웹 UI 에서 설정할 경우
- 메뉴 : 데이터센터 > SDN > 영역 > 추가
생성 유형은 아래와 같습니다. 저는 모든 그룹을 VXLAN 으로 설정하겠습니다.
- Simple : 소규모 네트워크 또는 기본적인 네트워크 설정이 필요한 경우
- VLAN : 논리적인 네트워크 분리가 필요하거나, 네트워크 세그먼트 별로 트래픽을 격리해야 하는 경우
- QinQ : 서비스 프로바이더 환경에서 고객 VLAN 태그를 보존하면서 추가적인 VLAN 태그가 필요한 경우
- VXLAN : 대규모 데이터센터에서 네트워크를 확장하거나, 멀티 테넌트 환경에서 네트워크 격리가 필요한 경우
- EVPN : 대규모 네트워크에서 다중 테넌트 지원, 확장성, 유연성을 제공해야 하는 경우
여기에서는 서비스 목적에 맞는 영역으로 2개를 생성하였습니다.
ID : 8자리 이하로 만들어야 합니다.
Bridge 는 호스트에서 ifconfig 명령으로 확인된 통신할 브릿지를 입력하면 됩니다.
- 기업 사용자 / 유형 : VLAN / ID : company / Bridge : vmbr0 / 나머지 기본
- 개인 사용자 / 유형 : VLAN / ID : personal / Bridge : vmbr0 / 나머지 기본
2) CLI 에서 설정할 경우
SDN 영역을 생성합니다.
# pvesh create /cluster/sdn/zones -zone company -type vlan -bridge vmbr0 -ipam pve
# pvesh create /cluster/sdn/zones -zone personal -type vlan -bridge vmbr0 -ipam pve
mtu 옵션이 없으면 자동 설정되지만, 값을 지정하고 싶을 경우 다음과 같은 옵션을 추가합니다.
-mtu 1450
생성된 SDN 영역 리스트를 출력합니다.
# pvesh ls /cluster/sdn/zones
-rw-d company
-rw-d personal
2. VNets 생성
기업의 경우 '경영지원본부', '개발팀' 등과 같이 부서 용도에 맞게 VNet 을 할당 하면 되고, 개별 VM 사용자의 경우 계정별로 VNet 를 생성해서 할당 할 예정입니다.
1) 웹 UI 에서 설정할 경우
- 메뉴 : 데이터센터 > SDN > VNets > 생성
여기에서는 개별 사용자 zone 에 vnet 을 생성하였습니다.
태그 : 없으면 생성이 되지 않고, 숫자로만 입력이 가능하므로 이름과 동일한 값으로 입력해 보겠습니다.
- 이름 : vnet1 / 영역 : personal / 태그 : 1
- 이름 : vnet2 / 영역 : personal / 태그 : 2
2) CLI 에서 설정할 경우
VNet 을 생성합니다.
# pvesh create /cluster/sdn/vnets --vnet vnet1 --zone personal --tag 1
# pvesh create /cluster/sdn/vnets --vnet vnet2 --zone personal --tag 2
생성된 VNets 리스트를 출력합니다.
# pvesh ls /cluster/sdn/vnets
-rw-d vnet1
-rw-d vnet2
3. VM 생성
Ubuntu 24.04 cloud image 를 다운로드 합니다.
# cd /var/lib/vz/template/iso
# wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img
이미지에 qemu-guest-agent 를 설치하고 패키지 목록을 업데이트 합니다.
# virt-customize -a /var/lib/vz/template/iso/noble-server-cloudimg-amd64.img --install qemu-guest-agent
# virt-customize -a /var/lib/vz/template/iso/noble-server-cloudimg-amd64.img --update
---------- 여기까지는 한 번만 해두면 됩니다 ----------
VM 을 생성하고 cloud image 를 VM 에 추가합니다.
# qm create 1001 --name ubuntu-1001 --cores 1 --memory 1024 --net0 virtio,bridge=vmbr0
# qm importdisk 1001 /var/lib/vz/template/iso/noble-server-cloudimg-amd64.img local-lvm
디스크를 virtio0 디스크로 설정하고 부팅하도록 설정합니다.
# qm set 1001 --virtio0 local-lvm:vm-1001-disk-0
# qm set 1001 --boot c --bootdisk virtio0
시리얼 콘솔과 VGA를 설정합니다.
# qm set 1001 --serial0 socket --vga serial0
QEMU 게스트 에이전트를 활성화합니다.
# qm set 1001 --agent enabled=1
디스크의 사이즈를 설정합니다. 현재 이미지 용량 (3.5G) 보다 10G 더 증가됩니다.
# qm resize 1001 virtio0 +10G
cloud-init 사용을 위해 드라이브를 추가합니다.
# qm set 1001 --ide2 local-lvm:cloudinit
(명령어로 처리 하려면)
# qm set 1001 --ciuser root --cipassword 12345678 --nameserver 8.8.8.8 --ipconfig0 "ip=192.168.10.101/24,gw=192.168.10.1"
(파일을 생성하여 처리 하려면)
네트워크 설정 및 cloud-init.yml 파일을 작성하고 적용합니다.
# qm set 1001 --ipconfig0 ip=192.168.10.101/24,gw=192.168.10.1
# mkdir /var/lib/vz/snippets
# vi /var/lib/vz/snippets/cloud-init.yml
#cloud-config hostname: ubuntu-vm1 users: - name: root chpasswd: list: | root:12345678 expire: False packages: - cloud-guest-utils ssh_pwauth: true runcmd: - 'sed -i "s/^#PermitRootLogin .*/PermitRootLogin yes/" /etc/ssh/sshd_config' - 'sed -i "s/^#PasswordAuthentication .*/PasswordAuthentication yes/" /etc/ssh/sshd_config' - 'systemctl restart ssh' - growpart /dev/vda 1 - resize2fs /dev/vda1 |
# qm set 1001 --cicustom "user=local:snippets/cloud-init.yml"
4. VM 에 VNet 설정 (같은 vlan 태그끼리만 통신 / 외부 네트워크 x)
1) 웹 UI 에서 설정할 경우
- 메뉴 : 데이터센터 > 하드웨어 > 네트워크 디바이스 > '수정' 누르고, VLAN 태그를 1로 설정
그리고 1001 VM 을 시작합니다.
2) CLI 에서 설정할 경우
VM 에 VNet 을 연결할때 tag 값으로 설정해야 합니다.
# qm set 1001 --net0 virtio,bridge=vmbr0,tag=1
VM 을 시작합니다.
# qm start 1001
※ 참고
- tag 가 같은 VM 끼리만 통신이 가능합니다.
- 예제와 같이 사설 IP 를 셋팅하면, 외부 통신은 불가능합니다. 사설 IP 라 할지라도 외부 통신이 되게 하려면 공인 IP 추가하거나 NAT 를 사용해야 합니다.
VM 에 두번째 네트워크 인터페이스를 추가하고 IP 정보를 셋팅합니다.
# qm set 1001 --net1 virtio,bridge=vmbr0
# qm set 1001 --ipconfig1 ip=115.68.142.7/27,gw=115.68.142.1
Cloud-Init 설정은 일반적으로 VM이 처음 부팅될 때 적용되지만, 네트워크 설정과 같은 일부 변경 사항은 VM이 재부팅 되어야만 반영됩니다.
VM 을 리부팅하여 적용합니다.
VM 내에서 리부팅 하려면, reboot 명령 말고 init 0 을 사용해서 서버를 완전히 껐다가 켜야 합니다.
# qm reboot 1001
5. 방화벽 사용 (모든 VM 끼리 통신 차단 / 외부 네트워크 o)
다른 방법이 있는지 모르겠지만, 웹 UI 에서 제공하는 방화벽 만으로 처리가 가능하다는 것을 알았습니다.
방화벽 설정을하면 다양한 룰 적용이 가능하며, 이렇게 적용한 룰은 iptables 에 바로 반영이 됩니다.
아래 예제는 모든 VM 끼리 통신을 차단하면서 외부 네트워크는 연결이 되도록 설정한 방법입니다.
(Vnet 아님)
1) 방화벽 활성화 설정
데이터센터 레벨 / 노드 레벨 / VM 레벨 세군데 모두 '방화벽' 메뉴가 있습니다. 이곳으로 이동하여 옵션의 방화벽을 '예' 로 바꾸어 활성화 합니다.
추가로 VM > 하드웨어 > 네트워크 디바이스에서도 '방화벽' 옵션을 체크하여 활성화 합니다.
2) 규칙 설정
PVE 웹UI 에서 특정 VM 을 선택합니다.
방화벽 메뉴에서 '추가' 버튼을 눌러 새 규칙을 추가합니다.
아래 규칙을 통해 들어오는 모든 트래픽을 차단합니다.
- 방향 : in
- 작업 : DROP
- 소스 : 0.0.0.0/0
- 대상 : 10.0.0.101/32 // 현재 VM IP
- 프로토콜 : tcp
외부에서 VM 특정 포트로 접근을 한다면 호스트를 거쳐오기 때문에 호스트 IP 및 목적지 포트를 허용해 주어야 합니다.
- 방향 : in
- 작업 : ACCEPT
- 소스 : 10.0.0.1/32 // 호스트 IP
- 대상 : 10.0.0.101/32 // 현재 VM IP
- 프로토콜 : tcp
- 목적지 포트 : 3389
6. 퍼포먼스 확인 (따라할 필요 x)
테스트 환경 노드 1대가 8 Core / 16 GB 메모리를 사용중입니다.
개별 VM 사용자가 1개의 VM 만 사용시, VM 개수만큼 VNet 가 생성되므로, 여기에서는 퍼포먼스 확인을 위해 VM 100개와 VNet 100개를 생성해 보았습니다.
1) VNets 생성
스크립트를 이용해 100개의 VNet 을 생성합니다. (기존 VNets 는 지워주세요)
# vi make_vnets.sh
#!/bin/bash for i in `seq 1 100`; do pvesh create /cluster/sdn/vnets --vnet vnet${i} --zone personal --tag ${i} done |
# sh make_vnets.sh
그다음 VM 생성 스크립트를 이용해 local-lvm 스토리지에 100개의 VM 을 생성합니다. 생성할때 먼저 만들어진 VNet 을 할당하는 방식입니다.
서버 자원이 부족할 수 있기 때문에 VM 의 CPU 는 공유 형태로 생성합니다.
- VM ( CPU : 1 Core / Memory : 1GB ) * 100개
2) VM 생성
스크립트를 이용해 100개의 VM 을 생성합니다. (기존 VM 은 지워주세요)
# vi make_vm.sh
#!/bin/bash for i in `seq 1 100`; do id=$((1000 + i)) ip=$((100 + i)) qm create ${id} --name ubuntu-${id} --cores 1 --memory 1024 --net0 virtio,bridge=vmbr0 qm importdisk ${id} /var/lib/vz/template/iso/noble-server-cloudimg-amd64.img local-lvm qm set ${id} --virtio0 local-lvm:vm-${id}-disk-0 qm set ${id} --boot c --bootdisk virtio0 qm set ${id} --serial0 socket --vga serial0 qm set ${id} --agent enabled=1 qm set ${id} --ide2 local-lvm:cloudinit qm set ${id} --ciuser root --cipassword 12345678 --nameserver 8.8.8.8 --ipconfig0 "ip=192.168.10.${ip}/24,gw=192.168.10.1" qm set ${id} --net0 virtio,bridge=vmbr0,tag=${i} qm start ${id} done |
# sh make_vm.sh
* 결과
- CPU 와 메모리의 합산이 물리적인 사양을 넘어설 경우 공유 형태로 사용이 되어집니다.
- 100개의 VM 을 생성하였지만 켜지지 않는 VM 이 있었습니다. 일부러 부팅을 시도하면 켜지긴 하지만 모두 켜놓으면 다시 꺼지는 VM 이 있습니다. 꺼져있는 VM 을 삭제하니 60개의 VM 만 남아 있었고, VM 에서 명령을 수행할때 느린 느낌은 없었습니다.
3) LXC 생성
이번에는 LXC (리눅스 컨테이너) 를 여러개 생성해 보겠습니다.
사용가능한 LXC 리스트를 업데이트 하고 원하는 OS 를 출력합니다. (여기에서는 Ubuntu)
# pveam update
# pveam available | grep ubuntu
system ubuntu-20.04-standard_20.04-1_amd64.tar.gz
system ubuntu-22.04-standard_22.04-1_amd64.tar.zst
system ubuntu-23.04-standard_23.04-1_amd64.tar.zst
system ubuntu-23.10-standard_23.10-1_amd64.tar.zst
system ubuntu-24.04-standard_24.04-2_amd64.tar.zst
원하는 버전의 파일을 다운로드 합니다.
# pveam download local ubuntu-22.04-standard_22.04-1_amd64.tar.zst
스크립트를 이용해 100개의 LXC 를 생성합니다. (기존 VM 은 지워주세요)
# vi make_lxc.sh
#!/bin/bash for i in `seq 1 100`; do id=$((1000 + i)) ip=$((100 + i)) pct create ${id} local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst \ -hostname ubuntu-${i} \ -cores 1 \ -memory 1024 \ -rootfs local-lvm:2 \ -net0 name=eth0,bridge=vmbr0,ip=192.168.10.${ip}/24,gw=192.168.10.1,tag=${i} \ -password 12345678 \ -onboot 1 pct start ${id} done |
# sh make_lxc.sh
* 참고
VNet 을 설정하면 같은 tag 끼리만 통신할 수 있습니다.
# pct set 1001 -net0 name=eth0,bridge=vmbr0,ip=192.168.10.101/24,gw=192.168.10.1,tag=1
공인 IP 를 추가하려면 아래 명령을 실행합니다.
VM 에 두번째 네트워크 인터페이스를 추가하고 IP 정보를 셋팅합니다.
# pct set 1001 -net1 name=eth1,bridge=vmbr0
# pct set 1001 -net1 name=eth1,bridge=vmbr0,ip=115.68.142.7/27,gw=115.68.142.1
LXC 는 리부팅 없이 바로 네트워크 사용이 가능합니다.
* 결과
- CPU 와 메모리의 합산이 물리적인 사양을 넘어설 경우 공유 형태로 사용이 되어집니다.
- 스크립트로 100개 생성 후, 추가로 50개를 더 생성하여 총 150개의 LXC 를 생성하였지만 모두 잘 생성되고 실행되었습니다. 한개의 LXC 에서 외부 네트워크 연결 후 패키지 설치 테스트 등을 해봐도 느리다는 느낌은 없었습니다.
'리눅스 > DaaS' 카테고리의 다른 글
Proxmox 에서 Ubuntu VM 싱글모드 진입, root 패스워드 초기화 (0) | 2024.08.27 |
---|---|
Proxmox VM IP 설정 방법 (Private, NAT, VXLAN) (0) | 2024.08.06 |
Incus (LXC 리눅스 컨테이너 관리자) 설치 및 설정 (0) | 2024.08.02 |
Kubernetes Namespace 또는 Pod 의 리소스 및 볼륨 백업하기 (Velero) (0) | 2024.07.22 |
Kubernetes 에서 네임스페이스 네트워크 격리 및 특정 포트 허용하기 (Calico) (0) | 2024.07.22 |