Stein 오픈스택 클라우드 분석(7) - 가상머신의 이더넷 인터페이스, mac & ip 주소 할당 과정

blog post 

 

 

안녕하세요. 이번 포스트에서는 이전 포스트까지 생성하고 분석했던 인스턴스가 어떻게 맥 주소나 ip를 할당받는지 확인해보겠습니다. 지난번 가상머신 분석 포스트에서 가상머신 "Windows10_2"를 추가로 만들었습니다. 저는 이 인스턴스를 기준으로 분석해 보겠습니다.

 

 

 

1. 네트워크 인터페이스 및 맥 주소 할당

 

당시 인스턴스 생성 과정에서 우리는 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 인터페이스를 인스턴스에 할당하면, 이후에는 하이퍼바이저를 통해서 인스턴스가 이 인터페이스를 네트워킹 과정에서 사용할 수 있게 됩니다.

 

 

 

2. DHCP를 통한 ip 할당

 

 

인터페이스와 맥주소 할당까지 알아보았고 이번엔 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의 트래픽이 실제로 어떻게 물리망을 거쳐 인터넷에 접근하는지, 전체 가상 네트워크와 함께 분석하도록 하겠습니다.

 

 

TAGS.

Comments