Stein 오픈스택 클라우드 분석(7) - 가상머신의 이더넷 인터페이스, mac & ip 주소 할당 과정
blog post
안녕하세요. 이번 포스트에서는 이전 포스트까지 생성하고 분석했던 인스턴스가 어떻게 맥 주소나 ip를 할당받는지 확인해보겠습니다. 지난번 가상머신 분석 포스트에서 가상머신 "Windows10_2"를 추가로 만들었습니다. 저는 이 인스턴스를 기준으로 분석해 보겠습니다.
당시 인스턴스 생성 과정에서 우리는 openvswitch 포트를 생성하고 가상 인터페이스를 인스턴스에 할당하는 로그를 확인할 수 있었습니다. (분석 포스트 보러가기) 로그 중에 맥주소도 보이네요.
2020-02-14 18:34:38.592 23339 INFO os_vif ...생략... Successfully plugged vif VIFOpenVSwitch(active=False,address=fa:16:3e:7b:71:0b,bridge_name='br-int',has_traffic_filtering=True,id=9102106c-dad0-4644-ba6c-f449b5d4131f,network=Network(585040c0-8dea-43f0-ba73-001955f59ce1),plugin='ovs',port_profile=VIFPortProfileOpenVSwitch,preserve_on_delete=False,vif_name='tap9102106c-da')
인스턴스 내부에서도 확인해 보면 맥주소가 동일하게 할당된 것을 확인할 수 있습니다.
이를 통해 인스턴스와 호스트간에 네트워킹을 위한 연결고리가 있다는 것을 예상해볼 수 있습니다. 컴퓨트 노드의 호스트 시스템을 살펴보면 아래와 같이 앞서 본 맥주소가 할당된 인터페이스가 올라와 있는 것을 확인할 수 있습니다. 이것이 호스트와 게스트OS 간 연결고리입니다.
[root@Compute0 ~]# ifconfig
...생략...
taped2e156a-f9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450
inet6 fe80::fc16:3eff:fe7b:710b prefixlen 64 scopeid 0x20<link>
ether fe:16:3e:7b:71:0b txqueuelen 1000 (Ethernet)
RX packets 7151 bytes 851843 (831.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 7662 bytes 8082967 (7.7 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
이 인터페이스는 openvswitch를 통해 "br-int"의 포트로 바인딩된 것도 확인할 수 있습니다. 다른 포트와 달리 타입은 따로 명시가 되어있지 않네요.
[root@Compute0 ~]# ovs-vsctl show
7d7c87c8-560d-4138-8742-8f745aea968b
Manager "ptcp:6640:127.0.0.1"
is_connected: true
Bridge br-int
Controller "tcp:127.0.0.1:6633"
is_connected: true
fail_mode: secure
Port br-int
Interface br-int
type: internal
Port patch-tun
Interface patch-tun
type: patch
options: {peer=patch-int}
Port "taped2e156a-f9"
tag: 1
Interface "taped2e156a-f9"
...이하생략...
그러면 실제로 이 인터페이스 타입이 뭔지 한번 살펴보겠습니다. 아래와 같이 ip -d link 명령을 사용하면 인터페이스에 대한 세부 내용을 볼 수 있습니다.
13: taped2e156a-f9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast master ovs-system state UNKNOWN mode DEFAULT group default qlen 1000
link/ether fe:16:3e:7b:71:0b brd ff:ff:ff:ff:ff:ff promiscuity 1
tun
openvswitch_slave addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
이 가운데 "tun"이 보입니다. 이 인터페이스는 리눅스에서 지원하는 가상 인터페이스 중 하나인 TUN TAP 입니다.
리눅스는 여러가지 타입의 가상 인터페이스를 생성할 수 있습니다. 대표적으로 bridge, vxlan, gre, macvtap 등의 인터페이스 타입을 지원하고 있는데요, TUN TAP 역시 리눅스가 지원하는 가상 인터페이스 중 하나입니다. TUN 인터페이스는 L3, 즉 ip 레벨의 네트워크 스택에서 point-to-point (점대점) 연결에 사용되는 인터페이스입니다.
이 tun 타입의 인터페이스를 openvswitch에서 "br-int"브릿지의 포트로 바인딩한 것입니다. 실제 인스턴스의 인터페이스로 할당하는 작업은 아래 스펙파일에 명시된 것 같이 libvirt에 의해 진행됩니다.
[root@Compute0 ~]# vi /etc/libvirt/qemu/instance-0000000e.xml
...생략...
<interface type='bridge'>
<mac address='fa:16:3e:7b:71:0b'/>
<source bridge='br-int'/>
<virtualport type='openvswitch'>
<parameters interfaceid='ed2e156a-f97b-4a1f-8a29-2da8864bf88b'/>
</virtualport>
<target dev='taped2e156a-f9'/>
<model type='virtio'/>
<mtu size='1450'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
...생략...
위와 같이 libvirt가 tun 인터페이스를 인스턴스에 할당하면, 이후에는 하이퍼바이저를 통해서 인스턴스가 이 인터페이스를 네트워킹 과정에서 사용할 수 있게 됩니다.
인터페이스와 맥주소 할당까지 알아보았고 이번엔 ip를 어떻게 받아오는지 알아보겠습니다. 앞서 libvirt의 스펙 파일에서 보시는 것과 같이 ip 주소는 이 스펙 파일을 통해서 할당되지 않는다는 것을 알 수 있습니다. 고정 ip로 사용하지 않는 이상, 인스턴스 내에서 dhcp를 통해 받아옵니다.
dhcp를 사용하여 어떻게 ip를 받아오는지 보기 위해 인스턴스의 이더넷 인터페이스를 잠시 "사용안함"으로 변경해 보겠습니다.
그 다음 Compute노드에서 현재 인스턴스에 매핑된 TUN 인터페이스 패킷을 캡쳐 한 상태에서 다시 인터페이스를 "사용"으로 바꿔보면 bootp 트래픽을 볼 수 있습니다.
[root@Compute0 ~]# tcpdump -i taped2e156a-f9 port 67 and 68
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on taped2e156a-f9, link-type EN10MB (Ethernet), capture size 262144 bytes
19:54:33.842902 IP 0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from fa:16:3e:7b:71:0b (oui Unknown), length 322
19:54:33.842902 IP 0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from fa:16:3e:7b:71:0b (oui Unknown), length 322
19:54:33.852711 IP 10.10.0.2.bootps > 10.10.0.121.bootpc: BOOTP/DHCP, Reply, length 380
19:54:33.852711 IP 10.10.0.2.bootps > 10.10.0.121.bootpc: BOOTP/DHCP, Reply, length 380
현재 pc에서 bootp 서버 (dhcp 서버)로 브로드캐스트를 보내고 서버로부터 응답을 받는 것을 볼 수 있습니다. 10.10.0.2 인터페이스가 dhcp 서버의 ip네요. 이 ip는 네트워크 노드에서 볼 수 있습니다.
[root@Network ~]# ip netns
qdhcp-585040c0-8dea-43f0-ba73-001955f59ce1 (id: 2)
qrouter-700c5054-6612-477a-970c-f3f7eebbaea6 (id: 1)
qdhcp-b7fc4869-1e35-4d34-9f84-2a66b6d3c984 (id: 0)
[root@Network ~]# ip netns exec qdhcp-585040c0-8dea-43f0-ba73-001955f59ce1 ip addr show tapacc1dec2-5c
29: tapacc1dec2-5c: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
inet 169.254.169.254/16 brd 169.254.255.255 scope global tapacc1dec2-5c
valid_lft forever preferred_lft forever
inet 10.10.0.2/24 brd 10.10.0.255 scope global tapacc1dec2-5c
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fefa:ea58/64 scope link
valid_lft forever preferred_lft forever
dhcp 전용 네트워크 네임스페이스에 인터페이스가 올라가 있는 것을 볼 수 있습니다.
또한 네트워크 노드에서 /var/log/neutron/dhcp-agent.log 로그를 통해 dhcp agent에 의해 ip가 10.10.0.121로 할당되었음을 확인할 수 있습니다.
2020-02-16 02:18:52.160 1275 INFO neutron.agent.dhcp.agent [-] Trigger reload_allocations for port admin_state_up=True, allowed_address_pairs=[], binding:host_id=, binding:profile=, binding:vif_details=, binding:vif_type=unbound, binding:vnic_type=normal, created_at=2020-02-15T17:18:24Z, description=, device_id=98c1920c-1de6-4aac-bca3-0c2a2f6bad2e, device_owner=, extra_dhcp_opts=[], fixed_ips=[{u'subnet_id': u'f00e8075-5b9e-4430-93b6-788aac1e65eb', u'ip_address': u'10.10.0.121'}], id=ed2e156a-f97b-4a1f-8a29-2da8864bf88b, mac_address=fa:16:3e:7b:71:0b, name=, network_id=585040c0-8dea-43f0-ba73-001955f59ce1, port_security_enabled=True, project_id=e725a918191b4b649023644c006376b1, revision_number=1, security_groups=[u'41155af0-828f-44c0-8cac-5f3287533e4d'], status=DOWN, tags=[], tenant_id=e725a918191b4b649023644c006376b1, updated_at=2020-02-15T17:18:24Z
2020-02-16 02:18:52.408 1275 INFO neutron.agent.dhcp.agent [req-5cf20d7b-f189-49f1-accc-ff4aac648e32 - - - - -] DHCP configuration for ports set([u'ed2e156a-f97b-4a1f-8a29-2da8864bf88b']) is completed
이더넷 인터페이스 및 맥, ip 주소 할당 관련 분석 내용은 여기까지 입니다. 생각보다 간단하지만 기본 네트워크 공부한다는 생각으로 정리해 보았습니다. 다음으로는 VM의 트래픽이 실제로 어떻게 물리망을 거쳐 인터넷에 접근하는지, 전체 가상 네트워크와 함께 분석하도록 하겠습니다.
'Cloud > Private Cloud Analysis' 카테고리의 다른 글
[Kubernetes] minikube 대시보드 활성화 과정 (0) | 2020.05.17 |
---|---|
[Kubernetes] 첫 시작. Minikube 설치 삽질 과정 (feat. docker) (0) | 2020.05.17 |
Stein 오픈스택 클라우드 분석(9) - 외부에서 가상머신에 SSH접속을 위한 유동 IP (Floating IP) 설정하기 (0) | 2020.04.20 |
기업에서는 오픈스택을 왜 사용할까? 처음 시작은 어떻게 해야 할까? (1) | 2020.04.14 |
Stein 오픈스택 클라우드 분석(6) - 오픈스택 시스템 내부에서 이미지와 가상머신을 생성하고 관리하는 방법 (0) | 2020.02.14 |
Stein 오픈스택 클라우드 분석(5) - 가상머신 이미지 업로드부터 인스턴스 생성까지 (0) | 2020.02.14 |
Stein 오픈스택 클라우드 분석(4) - 호스트 시스템에서의 가상 네트워크 구조 분석 (0) | 2020.02.13 |
Stein 오픈스택 클라우드 분석(3) - 외부&내부 네트워크, 서브넷, 라우터 생성 (0) | 2020.02.12 |
Stein 오픈스택 클라우드 분석(2) - 호스트 네트워크 인터페이스 아키텍처 (0) | 2020.02.12 |
Stein 오픈스택 클라우드 분석(1) - 대시보드 구성 및 사용자, 프로젝트 생성 (0) | 2020.02.11 |