Proxmox VM IP 설정 방법 (Private, NAT, VXLAN)
한 스위치 내의 PVE1 서버에 VM 이 있고, PVE2 서버는 사설IP 만 있다고 가정할때, VM 과 PVE2 이 사설 통신을 할 수 있는지 테스트를 하였습니다.
1. Private IP (호스트에 사설 대역을 설정하여 사용)
이 방법은 같은 대역의 사설IP 를 가진 호스트 (같은 스위치 내) 또는 VM 끼리 통신은 가능하나 VM 의 외부 통신은 불가합니다.
PVE1 서버에서 아래와 같이 사설 네트워크를 추가합니다.
# vi /etc/network/interfaces
auto lo iface lo inet loopback iface eno1 inet manual auto vmbr0 iface vmbr0 inet static address 115.68.142.5/27 gateway 115.68.142.1 bridge-ports eno2 bridge-stp off bridge-fd 0 post-up ip addr add 192.168.10.2/24 dev vmbr0 # 같은 네트워크 장치에 사설 IP 를 추가할 수 있습니다. iface eno2 inet manual source /etc/network/interfaces.d/* |
적용합니다.
# systemctl restart networking
PVE1 서버와 PVE2 서버가 통신 되는점 확인하였습니다.
# ping 192.168.10.3 -c 1
PING 192.168.10.3 (192.168.10.3) 56(84) bytes of data.
64 bytes from 192.168.10.3: icmp_seq=1 ttl=64 time=0.546 ms
--- 192.168.10.3 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.546/0.546/0.546/0.000 ms
VM 에서도 같은 대역의 사설 IP 를 설정하면 호스트와 통신이 가능해 집니다.
데이터센터 > pve1 > 1001 (VM ID) > 하드웨어 > 네트워크 디바이스 (net0) 에서 bridge 를 vmbr0 으로 설정
데이터센터 > pve1 > 1001 (VM ID) > Cloud-init 에서 IP 구성 (net0) 을 ip=192.168.10.101/24 로만 셋팅 (게이트웨이 없음)
VM 내부에서 PVE2 로 통신되는 점 확인했습니다.
# ping 192.168.10.3 -c 1
PING 192.168.10.3 (192.168.10.3) 56(84) bytes of data.
64 bytes from 192.168.10.3: icmp_seq=1 ttl=64 time=0.525 ms
--- 192.168.10.3 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.525/0.525/0.525/0.000 ms
2. NAT 구성 (VM 외부 네트워크 연결)
이 방법은 한 호스트 내의 VM 에만 적용되며, 외부 네트워크 연결이 가능하지만, 다른 노드의 VM 끼리는 통신이 되지 않습니다.
외부 네트워크 연결을 위해 공인 IP 를 셋팅하는 손쉬운 방법도 있지만 호스트의 공인 IP 를 통해서 외부 네트워크 통신을 하려면, PVE 호스트에 마스커레이드와 NAT 설정이 되어 있어야 합니다.
시각적으로 잘 보여지기 위해 아래와 같이 구성하면 좋습니다.
# vi /etc/network/interfaces
auto lo iface lo inet loopback iface eno2 inet manual auto vmbr0 iface vmbr0 inet static address 115.68.142.5/27 gateway 115.68.142.1 bridge-ports eno2 bridge-stp off bridge-fd 0 auto vmbr1 iface vmbr1 inet static address 192.168.10.1/24 bridge-ports none bridge-stp off bridge-fd 0 # NAT 설정 post-up echo 1 > /proc/sys/net/ipv4/ip_forward post-up iptables -t nat -A POSTROUTING -s '192.168.10.0/24' -o vmbr0 -j MASQUERADE post-down iptables -t nat -D POSTROUTING -s '192.168.10.0/24' -o vmbr0 -j MASQUERADE # Port Forwarding post-up iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 3389 -j DNAT --to 192.168.10.100:3389 post-down iptables -t nat -D PREROUTING -i vmbr0 -p tcp --dport 3389 -j DNAT --to 192.168.10.100:3389 iface eno1 inet manual source /etc/network/interfaces.d/* |
적용합니다.
# systemctl restart networking
중요한 것은, iptables 방화벽 사용중이라면 FORWARD 룰이 ACCEPT 되어 있어야 NAT 가 원활히 동작한다는 것입니다.
# iptables -nL |grep -i forward
Chain FORWARD (policy ACCEPT)
VM 이나 LXC 에서 사설IP 만 사용할 경우 Gateway 는 셋팅하지 않았었지만, NAT 를 이용한 외부망 통신을 위해서는 Gateway 까지 셋팅해 주어야 합니다.
아래는 셋팅 예시 입니다.
네트워크 셋팅 후 리부팅을 해야 적용이 되는 경우가 있으니 참고하세요.
- 브릿지 : vmbr1
- IPv4/CIDR : 192.168.10.100/24
- 게이트웨이(IPv4) : 192.168.10.1
* 관리방법 개선하기
위와 같이 사용할 경우 VM 을 추가하고 포트 포워딩 할때마다 networking 을 재시작 해주어야 하며, 이때 Proxmox 에서 브릿지를 사용하는 모든 VM 의 네트워크가 끊어져, 네트워크 설정을 다시 적용 (간단한 값을 변경) 하여 네트워크가 활성화 되도록 해야 합니다.
VM 연결이 끊어지는 것도 문제지만, VM 의 개수가 많을 경우 더욱 문제가 되므로 네트워크 재시작 없이 iptables 룰 설정만으로 적용하도록 하면 됩니다.
아래는 interfaces 와 rules.v4 (iptables) 파일의 실제 사용 사례입니다.
# vi /etc/sysctl.conf
net.ipv4.ip_forward=1
# sysctl -p
# vi /etc/network/interfaces
auto lo iface lo inet loopback iface enp4s0 inet manual auto vmbr0 iface vmbr0 inet static address 192.168.20.12/24 gateway 192.168.20.1 bridge-ports enp4s0 bridge-stp off bridge-fd 0 auto vmbr1 iface vmbr1 inet static address 10.0.0.1/24 bridge-ports none bridge-stp off bridge-fd 0 source /etc/network/interfaces.d/* |
# vi /etc/iptables/rules.v4
*filter :INPUT DROP [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] # 루프백, ICMP, 기존 연결 허용 -A INPUT -i lo -j ACCEPT -A OUTPUT -o lo -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 접근 허용 -A INPUT -p tcp -s 115.68.87.200 --dport 22 -j ACCEPT -m comment --comment "가산 사무실 IP : 관리자" -A INPUT -p tcp -s 115.68.87.200 --dport 8006 -j ACCEPT -m comment --comment "가산 사무실 IP : 관리자" -A INPUT -p tcp -s 115.68.87.200 --dport 3401:3420 -j ACCEPT -m comment --comment "가산 사무실 IP : 이용자 RDP" -A INPUT -p tcp -s 211.55.113.180 --dport 3401:3420 -j ACCEPT -m comment --comment "판교 사무실 IP : 이용자 RDP" # 나머지 차단 -A INPUT -j DROP COMMIT *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] # Port Forwarding -A PREROUTING -i vmbr0 -p tcp --dport 3401 -j DNAT --to 10.0.0.101:3389 # NAT 설정 -A POSTROUTING -s 10.0.0.0/24 -o vmbr0 -j MASQUERADE COMMIT |
이제 VM 생성시 포워딩 룰을 추가해야 한다면, iptables 설정 파일에 적용하고 iptables 만 재시작 해주어도 VM 에 영향을 주지 않습니다.
그리고 PREROUTING 과 POSTROUTING 의 순서가 중요합니다.
위와 같이 사용하지 않고 순서를 바꿀 경우, 없는 VM IP 룰이 셋팅되었을때 모든 포트 포워딩이 동작하지 않는것이 확인되었습니다.
꼭 위와 같이 순서를 지켜주세요.
3. VXLAN (다른 노드의 VM 을 같은 대역으로 구성하여 통신)
이 방법은 NAT 구성된 여러 노드의 VM 에 또다른 디바이스 장치를 추가하여 서로 통신할 수 있게 합니다.
이 방법을 사용하면 같은 네트워크 대역을 사용하므로, 노드간 VM 을 마이그레이션 해도 IP 변경없이 사용이 가능해 집니다.
[ 작업 요약 ]
VM 에 네트워크 장치를 두개 추가하여 사용합니다.
- 한개는 '2번' 과 동일한 NAT 구성된 네트워크 (외부 통신용)
- 한개는 VXLAN 로 구성된 네트워크 (Private 네트워크 / 다른 노드의 VM 간 통신용)
1) VXLAN 생성
웹 UI 에서 아래 절차를 따라 VXLAN 을 생성합니다.
- 메뉴 : 데이터 센터 > SDN > 영역 > '추가' 버튼 클릭 > VXLAN 을 선택 합니다.
아래는 입력 내용 입니다.
- ID : LAN (적절한 이름 사용)
- 피어 주소 목록 : 192.168.20.12,192.168.20.13 (구성을 원하는 노드를 선택하여 입력 가능)
2) VNets 생성
웹 UI 에서 아래 절차를 따라 VNets 를 생성합니다.
- 메뉴 : 데이터 센터 > SDN > VNets > '생성' 버튼을 클릭합니다.
아래는 입력 내용 입니다.
- 이름 : LANvnet1 (적절한 이름 사용)
- 영역 : LAN (위에서 생성한 영역 이름)
- 태그 : 2000 (새로운 값 입력)
생성된 VNets 를 클릭하면 분할된 오른쪽 창에서 '서브넷' 추가 설정이 가능합니다.
'생성' 버튼을 눌러 서브넷을 생성합니다.
- 서브넷 : 10.0.10.0/24
3) VM 네트워크 추가
웹 UI 에서 아래 절차를 따라 VM 에 네트워크 장치를 추가합니다.
- 메뉴 : 데이터센터 > PVE 노드 > VM 선택 > 하드웨어 > '추가' 버튼을 눌러 '네트워크 디바이스' 를 추가합니다.
추가할때 브릿지는 위에서 생성한 'LANvnet1' 로 합니다.
VM 에 로그인하여 추가된 네트워크 장치에 VNets 대역의 한 IP 로 셋팅합니다.
아래는 셋팅 예시입니다.
- IP : 10.0.10.101/24
- 게이트웨이 : (없음)
이렇게 셋팅하면, VM 에서는 각각 외부 통신이 가능하며, VXLAN 을 사용하는 다른 노드의 VM 끼리도 통신이 가능합니다.
※ 참고 : VM 방화벽 사용
VM 레벨의 방화벽을 설정할 경우, 기본 룰이 inbound > DROP , outbound > ALLOW 입니다. 하지만 VM 네트워크 디바이스에 방화벽 사용 체크를 하는 순간 외부 네트워크가 단절되는 현상이 발생합니다. 이때 호스트 노드에서 아래 명령으로 해결이 가능합니다.
(CLI 에서 사용시)
# iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1
이 명령은 인터페이스를 통해 들어오는 패킷에 대해, 커넥션 트래킹 (Connection Tracking) 을 활성화하고, 해당 패킷을 zone 1 로 구분하여 처리하는 규칙을 raw 테이블의 PREROUTING 체인에 추가합니다. 주로 Proxmox 와 같은 가상화 플랫폼에서 가상 네트워크 인터페이스에 대해 커넥션 트래킹을 설정하고, 방화벽 규칙을 적용할 때 사용됩니다.
(iptables 룰셋 파일 사용시)
# vi /etc/iptables/rules.v4
... *raw :PREROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A PREROUTING -i fwbr+ -j CT --zone 1 COMMIT |
기존 방화벽 룰 *filter 또는 *nat 와 같이 하단에 *raw 를 추가하고 해당 룰을 입력해 줍니다.
설명을 하자면,
*raw : raw 테이블 사용
:PREROUTING ACCEPT [0:0] : PREROUTING 체인이 기본 ACCEPT 상태로 시작
-A PREROUTING -i fwbr+ -j CT --zone 1 : 실제 명령어를 변환한 부분으로, fwbr+ 인터페이스에서 들어오는 패킷을 zone 1 로 설정하는 커넥션 트래킹 규칙
COMMIT : 변경 사항을 적용
설정한 규칙을 적용합니다.
# systemctl restart iptables
적용된 룰을 확인합니다.
# iptables -t raw -L
'리눅스 > DaaS' 카테고리의 다른 글
Proxmox 에서 Ubuntu VM 싱글모드 진입, root 패스워드 초기화 (0) | 2024.08.27 |
---|---|
Incus (LXC 리눅스 컨테이너 관리자) 설치 및 설정 (0) | 2024.08.02 |
Proxmox 에서 SDN (영역 및 VNets) 설정하여 네트워크 분리하기 (0) | 2024.07.31 |
Kubernetes Namespace 또는 Pod 의 리소스 및 볼륨 백업하기 (Velero) (0) | 2024.07.22 |
Kubernetes 에서 네임스페이스 네트워크 격리 및 특정 포트 허용하기 (Calico) (0) | 2024.07.22 |