KVM 호스트에서 iptables를 사용한 가상 네트워킹

KVM 호스트에서 iptables를 사용한 가상 네트워킹

저는 Linux 기반 어플라이언스의 설계 작업을 진행 중이며 가상화 계층에 KVM을 사용하려고 합니다. 시스템에는 매우 특정한 방식으로 상호 연결된 3개의 VM이 있습니다. 내가 받은 호모 패킷 다이어그램은 다음과 같습니다.

       www
        |
+------ | ------------+
|       |             |
|      |A|            |
|       |             |
|       |             |
|      |B|-----|C|    |
|       |             |
+------ | ------------+
        |
       dbs

이는 기본적으로 데이터 흐름을 반영합니다. 즉, 전면에 웹 서버가 있고 그 뒤에 백엔드 서버가 있고 측면에 보조 서비스가 있는 것입니다. A와 C는 인터넷 근접성 등으로 인해 "별도의" 네트워크에 있어야 합니다. 이는 시스템 대부분에 적합하지만 이는 vm의 A와 C에 대한 모든 관리 트래픽이 외부 syslog에 도달하려면 vm B를 통과해야 함을 의미합니다. 서버라던가. 마찬가지로 ssh 액세스를 위해서는 B에 대한 포트 전달과 같은 것이 필요합니다. 이 트래픽의 양은 애플리케이션 트래픽에 비해 최소이지만 특히 kickstart 등을 사용하여 이러한 VM을 자동으로 구축하는 경우에는 매우 끔찍하다고 느낍니다. 이는 B가 완료될 때까지 A 또는 C 구축을 시작할 수 없다는 의미입니다.

그래서 나는 다음과 같이 모든 것을 훨씬 더 혼란스럽게 만들려고 생각하고 있습니다.

     www
      |
+---- | ----------------------+
|     |                       |
|     |       +-----------+   |
|     |       |           |   |
|    |A|-----|B|-----|C|  |   |
|     |       |       |   |   |
|     |       b       |   |   |
|     +-----a x c-----+   |   |
|             d           |   |
|             |           |   |
+------------ | --------- | --+
              |           |
             mgt         dbs

따라서 앱의 AB와 C 사이의 데이터 흐름은 거의 동일하지만(여기에서는 단순하게 그려짐) 호스트(a, b 및 c)에 인터페이스가 있는 다른 브리지에 연결된 각 VM에 두 번째 관리 NIC를 추가합니다. . 그런 다음 이러한 가상 호스트 인터페이스와 외부 세계(d) 사이에 iptables 및 전달이 사용되어 모든 시스템이 환경의 하위 외부 서비스에 직접 연결할 수 있지만 VM이 손상되는 방식으로 서로 연결할 수 없도록 합니다. A는 보안을 더 이상 저하시키지 않습니다. 아마도 추가 시 ebtables와 단일 브리지를 사용할 수 있지만 A와 C가 여전히 동일한 서브넷에 있으면 너무 미묘해 보일 것 같습니다.

관리를 위한 다이어그램에서 사물이 어떻게 보이는지와 사물의 실제 기술적 신뢰성(따라서 "별도" 대 별도)에 중요한 각도가 있다는 점을 지적하는 것은 공정한 경찰입니다! 단순성 또한 큰 동기 부여 요인이지만 두 번째 VM을 통해 모든 추가 트래픽을 처리하는 비용은 정말 불편할 뿐만 아니라 시간에 민감한 환경에서 빌드하는 데 5~10분을 추가할 수도 있습니다.

그럼 본질적으로, 내가 미쳤나요?

감사해요

크리스

답변1

아니, 미친 게 아니야. 하지만 내 생각엔 당신이 이 소리를 필요 이상으로 어렵게 만들고 있다고 생각합니다. 귀하의 질문을 여러 번 읽었지만 여전히 이해하지 못하는 부분이 몇 가지 있습니다. 기계 C는 실제로 무엇을 하는가? 거기에 왜 필요한가요? 기계 A와 B는 무엇을 하는가?

어쨌든 첫 번째 다이어그램을 따르면 간단한 IP 라우팅을 적용하기만 하면 괜찮습니다. 시스템 C가 B와 별도의 서브넷을 형성하는 경우(나머지 부분과 분리되도록) 해당 서브넷에 도달하려면 라우팅을 다음과 같이 설정해야 합니다.

  • dbs: 모든 트래픽을 B(라우팅 방법을 알고 있는 기본 게이트웨이)를 통해 라우팅합니다.
  • C로의 트래픽은 직접 연결되어 있기 때문입니다).
  • www: C의 모든 트래픽을 A를 통해 라우팅합니다(A가 기본 게이트웨이가 아닌 경우에만 필요함).
  • A에서: C의 모든 트래픽을 B를 통해 라우팅합니다(B가 기본 게이트웨이가 아닌 경우에만 필요함).
  • C에서는 B를 기본 게이트웨이로 설정합니다.

라우팅이 설정되면 방화벽을 추가하여 트래픽이 원하는 방향으로만 흐르도록 할 수 있습니다. 이런 종류의 작업에 경험이 없는 한, 먼저 라우팅을 시작한 다음 방화벽을 추가하는 것이 좋습니다(한 번에 한 단계씩 방화벽을 추가하면 무엇이 문제인지 항상 알 수 있습니다. 방화벽을 깨뜨릴 것이기 때문입니다).

관련 정보