105 lines
7.7 KiB
Markdown
105 lines
7.7 KiB
Markdown
---
|
|
id: 397c4789-0272-449b-86d6-2c4a3a122401
|
|
kind: QUESTION
|
|
slug: tap-interface-to-vm-mapping
|
|
title: VM1 과 VM2 의 TAP/vnet interface 는 무엇이고 어디에 붙어 있는가
|
|
topic: network-virtualization
|
|
topicName: 네트워크 가상화
|
|
project: virtualization
|
|
status: 초안
|
|
questionStatus: OPEN
|
|
studio: "https://hyeonworks.com/studio/documents/397c4789-0272-449b-86d6-2c4a3a122401/edit"
|
|
sourceRevision: no-commit · 밖에서 반입한 문서 한 편. 고정할 저장소 리비전이 없다
|
|
source:
|
|
- final/document.md#122-open-question-oq-2
|
|
- final/document.md#99-tap의-역할
|
|
- final/document.md#117-이-구조에서-발생할-수-있는-문제-117-1
|
|
- final/document.md#118-실제-linux에서-확인할-명령어
|
|
---
|
|
|
|
# VM1 과 VM2 의 TAP/vnet interface 는 무엇이고 어디에 붙어 있는가
|
|
|
|
§99 는 TAP 을 가상 머신의 이더넷 프레임과 호스트 리눅스 네트워크를 잇는 접점으로 놓았다. 그 접점의 이름은 호스트마다 다르게 붙는데, 이 호스트에서 두 가상 머신에 각각 무엇이 붙었는지는 SSOT 에 없다. 이름을 모르면 §119 가 적은 계층별 tcpdump 도 대상을 채우지 못하고, §117.1 이 든 「특정 VM 만 통신 불가」가 어느 가상 머신을 가리키는지도 가릴 수 없다. 이 물음은 두 가상 머신의 호스트 쪽 인터페이스 이름과 그것이 붙어 있는 곳을 확정한다.
|
|
|
|
## 관계
|
|
|
|
- **Guest 의 packet 이 Host Physical NIC 에 닿기까지 — virtio-net · virtqueue · vhost-net · TAP · Bridge**
|
|
그 경로에서 TAP 이 무엇을 하는지 이미 설명해 두었으므로 이 물음은 거기서 이어진다.
|
|
- **packet 이 어디서 끊겼는지는 계층마다 capture 해서 가른다**
|
|
그 기준이 요구하는 캡처 지점의 이름을 이 물음이 댄다.
|
|
- **이 호스트의 가상 머신 네트워크는 Bridge 인가 NAT 인가 Routing 인가**
|
|
ip link 와 bridge link 를 두 물음이 같이 쓰므로 한 번 찍어 둘을 함께 읽는다.
|
|
- **Host Nginx 에서 Keycloak 까지 packet 은 실제로 어디를 지나는가**
|
|
tcpdump 를 어느 인터페이스에 걸지가 이 물음의 답에서 나온다.
|
|
|
|
## 사실
|
|
|
|
- §99 는 TAP 을 호스트 리눅스 커널이 제공하는 가상 이더넷 네트워크 인터페이스로 적었다. 물리 장치가 아니고, 이름의 예로 tap0 과 vnet0 을 들었다.
|
|
- §99 가 적은 TAP 의 역할은 가상 머신의 이더넷 프레임과 호스트 리눅스 네트워크를 연결하는 접점이다.
|
|
수신 : Linux Bridge → TAP → VM
|
|
송신 : VM → TAP → Linux Bridge
|
|
- §99 는 확인 명령으로 ip link · ip tuntap show · bridge link · virsh domiflist 넷을 들었고, §118 이 같은 명령을 계층별 목록으로 다시 적었다.
|
|
TAP/vnet : ip link · ip tuntap show
|
|
libvirt VM NIC : virsh domiflist 에 domain 이름을 넣는다
|
|
Linux Bridge : ip link show type bridge · bridge link · bridge fdb show
|
|
- §122 OQ-2 는 이 호스트에서 돌릴 명령을 네 줄로 적었다.
|
|
virsh domiflist vm1
|
|
virsh domiflist vm2
|
|
ip link
|
|
bridge link
|
|
- §99 와 §118 이 TAP 확인 명령으로 든 ip tuntap show 는 OQ-2 의 네 줄에 없다.
|
|
- §117.1 은 TAP/Bridge 연결 오류의 증상 셋을 들었다.
|
|
VM 외부 통신 불가
|
|
Host ↔ VM 통신 불가
|
|
특정 VM 만 통신 불가
|
|
- §117.1 이 그 증상에서 확인하라고 든 명령은 ip link · bridge link · bridge fdb show · virsh domiflist 다.
|
|
- §116 은 이 테스트 환경의 경로를 펼치면서 TAP 칸을 TAP(vm1) 과 TAP(vm2) 로 적었다. 호스트에서 읽은 이름은 그 그림에도 없다.
|
|
- 두 가상 머신의 호스트 쪽 인터페이스 이름도, 그 인터페이스가 어느 브리지에 붙어 있는지도 SSOT 에는 없다.
|
|
|
|
## 가정
|
|
|
|
- 호스트에 붙어 virsh 와 ip 계열 명령을 실행할 수 있다고 본다.
|
|
- §122 OQ-2 가 명령에 적은 vm1 과 vm2 가 이 호스트에 실재하는 domain 이름이라고 본다. 실제 이름이 다르면 그 이름으로 바꿔 돌린다. §99 와 §118 은 같은 명령에 넣을 domain 을 비워 두었고, 가상 머신 이름을 그대로 적은 곳은 §90.1 의 virsh domiflist vm1 과 §122 OQ-2 다.
|
|
- virsh domiflist 출력에 인터페이스 이름과 MAC 주소가 함께 나온다고 전제한다. §99 도 §118 도 이 명령의 출력 형식은 적지 않았다.
|
|
- 두 가상 머신이 켜져 있는 동안 읽는다고 전제한다. 꺼진 가상 머신의 TAP 이 호스트에 남아 있는지는 SSOT 에 적혀 있지 않다.
|
|
|
|
## 미지수
|
|
|
|
- VM1 과 VM2 의 호스트 쪽 인터페이스 이름이 각각 무엇인지.
|
|
- 각 인터페이스의 MAC 주소와 NIC model 이 무엇인지.
|
|
- 두 인터페이스가 같은 브리지에 붙어 있는지, 서로 다른 곳에 붙어 있는지.
|
|
- ip tuntap show 에 나오는 TAP 목록과 virsh domiflist 가 대는 이름이 그대로 맞아떨어지는지.
|
|
|
|
## 제약
|
|
|
|
- 이름과 어디에 붙어 있는지를 적는 데서 끊는다. 그 경로로 패킷이 실제로 흘렀는지는 tcpdump 를 쓰는 물음이 받는다.
|
|
- 두 가상 머신을 같은 시점에 읽는다. 한쪽을 재시작한 뒤 다른 쪽을 읽으면 이름이 바뀌어도 알 수 없기 때문이다.
|
|
- 이 호스트에서 읽은 출력이 없어 tap0 이나 vnet0 같은 §99 의 예시 이름을 이 호스트의 값으로 쓰지 않는다.
|
|
|
|
## 선택지
|
|
|
|
### 1. libvirt 가 대는 이름을 먼저 받아 호스트에서 대조한다
|
|
|
|
virsh domiflist 로 가상 머신마다 붙은 인터페이스를 받고, 그 이름이 ip link 목록에 실재하는지 확인한 뒤 bridge link 로 어느 브리지의 port 인지 잡는다. §122 OQ-2 가 적은 네 줄이 이 순서다. 가상 머신과 인터페이스의 짝이 처음부터 정해져 나오므로 두 대의 것을 헷갈리지 않는다.
|
|
|
|
libvirt 가 모르는 인터페이스는 이 순서에서 빠진다.
|
|
|
|
### 2. 호스트의 인터페이스를 전부 세우고 가상 머신으로 되짚는다
|
|
|
|
ip link 와 ip tuntap show 로 호스트에 있는 TAP 을 모두 적고, bridge link 로 어느 브리지에 붙었는지 잡는다. 그다음 virsh domiflist 로 각각이 어느 가상 머신의 것인지 되짚는다. libvirt 밖에서 만들어진 TAP 이 있어도 목록에 남는다.
|
|
|
|
가상 머신이 두 대뿐인데 호스트에 TAP 이 여럿이면 짝짓는 데 MAC 주소를 다시 대조해야 한다.
|
|
|
|
### 3. 통신이 안 될 때 §117.1 의 확인 목록으로 함께 본다 — 제외
|
|
|
|
§117.1 이 증상과 확인 명령을 이미 묶어 두었으니 장애가 났을 때 같이 보자는 방법이다. 지금 필요한 것은 정상일 때의 이름과 붙어 있는 곳이고, 그것이 있어야 장애 때 무엇이 달라졌는지 견줄 수 있다. 증상이 난 뒤에 처음 읽으면 그 값이 원래 그랬는지 그때 바뀐 것인지 가릴 수 없다.
|
|
|
|
## 다음 검증
|
|
|
|
1. virsh domiflist vm1 과 virsh domiflist vm2 로 각 가상 머신에 붙은 인터페이스를 읽는다.
|
|
2. ip link 로 그 이름이 호스트에 실재하는지 대조한다.
|
|
3. bridge link 로 각 인터페이스가 어느 브리지의 port 인지 적는다.
|
|
4. 두 가상 머신의 결과를 인터페이스 이름 · MAC 주소 · 붙어 있는 브리지로 나란히 적고, 실행한 명령과 출력을 함께 증거로 남긴다.
|
|
|
|
닫는 조건 : 가상 머신마다 인터페이스 이름과 MAC 주소와 붙어 있는 브리지를 적어 두 대를 나란히 놓으면 닫는다. 이 목록이 계층별 캡처 기준이 요구하는 지점의 이름이 되고, 이것이 없으면 실제 패킷 경로를 묻는 물음의 tcpdump 를 어느 인터페이스에 걸지 정할 수 없다. 두 가상 머신이 서로 다른 브리지에 붙어 있으면 §117.1 의 「특정 VM 만 통신 불가」를 진단할 때 그 사실을 먼저 본다고 적는다.
|