Proxmox VM IP 설정 방법 (Private, NAT, VXLAN)

리눅스/DaaS|2024. 8. 6. 09:26
반응형

한 스위치 내의 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

 

반응형

댓글()