SW/ 개발팁 / 추천프로그램, 꿀팁 공유
  • 돌아가기
  • 아래로
  • 위로
  • 목록
  • 댓글
정보

Proxmox 방화벽으로 VM/CT간 통신 차단하기

klayf 257

5

8

아래 내용은 PVE에서 방화벽으로 VM 또는 LXC간의 통신을 차단하기 위한 방법입니다. 

 

각각 개별 VLAN을 주고 (801.q) 인터라우팅을 차단하면 확실하겠지만, 환경에 따라 PVE의 방화벽을 통한 L3/L4 레벨의 허용/차단 방법도 유용하시리라 생각됩니다.

 

특히 VM간 대부분의 통신은 막으면서도 특정 포트나 프로토콜로는 VM 간 통신이 필요한 경우 등의 상황에서 유연하게 대응할 수 있습니다.

 

*VM 또는 CT의 서브넷은 확실하게 구분되어야 방화벽 적용이 편리합니다.

이미 방화벽 없이 서브네팅으로도 L3 수준에서 통신 범위를 제한할 수 있으며, 그렇지 않더라도 방화벽에서 통신을 차단해야 할 범위를 특정할 수 있도록 서브넷을 구분하여 구축하시기 바랍니다. 예) 내부망 - 192.168.10.0/24, VM/CT - 192.168.20.0/26 등

 

*PVE 방화벽은 Datacenter / Node / VM 또는 CT 단위로 상위 수준에서 상속되어 일괄 적용하거나 특정 VM에만 원하는 정책을 생성하여 적용할 수 있습니다.

 

그러므로 VM/CT 방화벽을 설정하려면 반드시 DC 방화벽을 먼저 활성화 해주셔야 합니다.

VM/CT 방화벽 설정창에 여전히 DC 방화벽이 비활성화 되어있다는 메시지가 함께 표시된다면 DC 방화벽을 켜주셔야 합니다.

 

 *동일한 방화벽 정책을 다수의 VM에 적용해야 할 경우 Security Group을 활용하시면 편리합니다. 여기서 생성한 룰은 특정 VM/CT 방화벽에서 일괄 삽입할 수 있습니다.

 

Screenshot 2024-04-28 223009.png.jpg

 

 

 

1. 방화벽 생성시마다 주요 IP 주소 또는 서브넷을 매번 입력하기 번거로우므로, Alias에서 게이트웨이나 내부망 서브넷, VM/CT 주소 서브넷 등 자주 입력하는 주소 및 서브넷에 대한 별칭을 등록합니다.

 

Screenshot 2024-04-28 223540.png.jpg

 

 

2. 다른 VM/CT 또는 내부망 기기로 Ping(ICMP), UDP, TCP 등의 패킷을 보낼 수 없도록 도착지(Destination)의 주소를 VM/CT 서브넷으로 설정하고, OUT에 대한 패킷 DROP 정책을 생성하며, 여러 프로토콜에 대해 각각 개별 생성 합니다.

 

Screenshot 2024-04-28 224622.png.jpg

 

 

3. 초기 방화벽 정책 생성시에는 반드시 로그 설정을 켜서 방화벽에 의한 허용/차단 발생시 로그에 기록되도록 해야 합니다.

패킷이 허용되어야 하는데 차단되거나 또는 그 반대의 상황이 발생할 때 로그를 확인하여 출발지/도착지/포트번호 등에 따른 추가 정책을 생성하거나 조정할 수 있습니다.

 

Screenshot 2024-04-28 225018.png.jpg

Screenshot 2024-04-28 225649.png.jpg

 

 

 4. 다른 VM/CT와 통신해보거나 ping google.com 및 apt update, nslookup 등의 명령어를 통해 내부 통신 차단 및 외부와의 통신이 정상인지 확인합니다.

 

저의 경우 PVE DNS가 게이트웨이 주소로 설정되어 있는데 현재 CT는 내부망 주소의 기기로 통신할 수 없기 때문에 DNS로 질의가 불가능했습니다.

 

따라서 게이트웨이 주소로 향하거나 오는 TCP/UDP 53번 포트에 대해 IN/OUT 허용 정책을 추가 생성했으며, 추가로 SSH 접속을 위해 내부망 기기에서 CT의 TCP 22번 포트를 허용하는 정책도 추가했습니다.

 

Screenshot 2024-04-28 232057.png.jpg

 

 

방화벽 정책은 순위가 높을수록 우선 적용되므로 반드시 순서에 유의하셔야 합니다.

만약, TCP 22번 포트에 대한 차단 정책이 허용 정책보다 위에 있다면 SSH 접속은 불가능합니다.

 

Screenshot 2024-04-28 232603.png.jpg

 

 

5. LXC1은 10.53.209.101에 방화벽이 설정된 상태이며, LXC2는 10.53.209.102에 방화벽 미적용 상태입니다. 

 

Screenshot 2024-04-28 233506.png.jpg

 

LXC1은 google.com과는 통신할 수 있지만 방화벽으로 OUT 패킷이 차단된 내부망의 PVE(10.53.209.61)에는 통신할 수 없으며, 또 다른 CT인 LXC2와도 통신할 수 없습니다.

 

LXC2는 google.com은 물론, PVE와도 통신할 수 있지만, (들어오는 ICMP 패킷을 차단하는) 방화벽이 설정된 LXC1과는 통신할 수 없습니다.

 

 

방화벽 정책은 기본적으로 iptables와 동일하므로 이를 응용하시면 프로토콜 및 포트 구분을 통해 다양한 설정이 가능합니다.

 

제가 사용하는 정책을 그대로 올리기에는 검열할 부분들이 있어서 급하게 컨테이너 생성 후 정책을 급조하여 설명이 불친절한 점 양해 부탁드립니다.

신고공유스크랩
8
2등
무백 2024.04.29. 07:53

정성스레 글까지 작성해주신 점 진심으로 감사드립니다. :)

 

현재 알려주신 방법대로 테스트해보며 방화벽 구성중인데, 현재까지는 성공적으로 차단되는 것 같습니다. :)

(데이터센터 보안 그룹. 우선 TCP만 테스트로 막아보았습니다.)

image.png.jpg

 

사실 위 부분은 제가 직접 굴러보며 구성하면 되는 것인데 한 가지 의문점이 드는 부분이 있습니다.

 

 

 

데이터센터에서 다음과 같이 방화벽을 활성화 하였을 때 정책 입력(Input Policy) 부분을 ACCEPT로 하지 않으면

내부 vm에서는 pve에 접속이 가능하지만 WireGuard를 통해 외부에서 pve에 접속하는 것은 불가능하더군요..

 

image.png.jpg

 

 

OPNsense에 VPN 서버를 설치했기 때문에 가능할 것으로 생각되는데 왜 불가능한 것인지 이해가 가질 않습니다..

저 옵션을 활성화 해서 무언가 불이익이 생기거나 허점이 생기지는 않을까요? 그냥 ACCEPT로 두고 사용해도 될까요?

klayf 글쓴이 2024.04.29. 09:32
무백

별도 설정 없이, DC 방화벽 활성, Input 허용일 경우 방화벽 비활성 상태와 동일하다고 보시면 됩니다.

DC 방화벽 활성화시 기본 Input 정책은 Drop인데 이렇게 되면 localhost 등의 내부 통신이나 이미 Established된 연결을 제외하면 외부의 PVE 접속이 불가능합니다.

이는 방화벽에서 Accept 정책으로 허용된 통신만 가능하므로 그 외에는 들어오는 통신을 거부하기 때문입니다.

따라서 처음에는 Input 정책을 허용으로 두신 후, DC 방화벽에서 허용하실 서브넷 및 프로토콜(SSH, TCP 8006번 등)에 대한 정책을 생성하신 후 다시 Input을 Drop으로 변경하시면 됩니다!!

 

방화벽 미설정 상태로 사용시 보안 문제가 없었거나 Proxmox가 인터넷에 바로 연결되지 않고, OPNsense나 게이트웨이, 방화벽 등의 아래에 있다면 Input에 대해 Accept으로 두더라도 내부 해킹 등에 대한 문제가 아니라면 특별한 문제는 없을 것이라 생각합니다.

무백 2024.04.29. 09:36
klayf
아 그렇군요..! 덕분에 원하는 바를 다 이룬 것 같습니다.
진심으로 감사드립니다!!
klayf 글쓴이 2024.04.29. 15:19
수라

아무래도 최악을 대비하려면... 꼭 필요한 작업 같습니다.

외부에서 접근 가능한 VM/CT를 해킹 등으로 제어권을 잃었을 때, PVE는 물론 다른 VM, 내부망의 기기까지 공격당할 수 있기 때문에 PVE 주소에 대한 모든 포트, SSH, 라우터의 특정 포트를 제외한 모든 통신 등은 가급적 차단하고 있습니다.

댓글 쓰기 권한이 없습니다. 로그인

취소 댓글 등록

cmt alert

신고

"님의 댓글"

이 댓글을 신고하시겠습니까?

댓글 삭제

"님의 댓글"

삭제하시겠습니까?


목록

공유

facebooktwitterpinterestbandkakao story