본문 바로가기

기타[etc]

QEMU 네트워크 브릿지 구성

SMALL

[정리]

QEMU에서 네트워크 통신을 위해서 브릿지 모드를 설정하려 한다.

[출처1]에서 가져온 밑의 그림은 브릿지를 직관적으로 이해하기 쉽게 나와있다.

1
2
3
4
5
6
7
8
9
10
11
12
              HOST
        +---------------+
        |               |      KVM GUEST1
        |               |   +--------------+
        |  +------+     |   |              |
 LAN ---+--- eth0 |  +--+---+---- nic0     |      KVM GUEST2
        |  | tap0----+  |   |192.168.1.13  |   +--------------+
        |  | tap1----+  |   +--------------+   |              |
        |  +------+  |  |                      |              |
        |     br0    +--+----------------------+---- nic0     |
        |192.168.1.12   |                      |192.168.1.14  |
        +---------------+                      +--------------+
cs

[출처1]에서 가져온 아스키 [그림_1]

1
2
3
4
5
6
7
8
9
10
11
12
13
              HOST
        +---------------+
        | 192.168.1.12  |      KVM GUEST1
 LAN ---+---- eth0      |   +--------------+
        |      ^        |   |              |
        |      |        |   |              |
        |  +------+  +--+---+---- nic0     |      KVM GUEST2
        |  | tap0----+  |   |192.168.100.1 |   +--------------+
        |  | tap1----+  |   +--------------+   |              |
        |  +------+  |  |                      |              |
        |     br0    +--+----------------------+---- nic0     |
        |192.168.100.254|                      |192.168.100.2 |
        +---------------+                      +--------------+
cs

[출처1]에서 가져온 아스키 [그림_2]

그림_1에서 보면 하나의 브릿지에서 eth0과 가상 머신들의 인터페이스가 모두 합쳐져있다. NAT처럼 사용할 수 있다.

하지만 [그림_2]의 경우 eth0이 br0(브릿지)와 연결되어 있는 모양이다.  이를 통해서 가상 머신을 외부로 부터 숨길수 있다.


브릿지 설정

host  네트워크 상태 확인

1
2
3
4
5
6
7
8
9
10
11
enp0s5    Link encap:Ethernet  HWaddr 00:1c:42:02:97:eb  
          inet addr:10.211.55.21  Bcast:10.211.55.255  Mask:255.255.255.0
          inet6 addr: fdb2:2c26:f4e4:0:880e:3a86:25b0:7afe/64 Scope:Global
          inet6 addr: fdb2:2c26:f4e4:0:2083:eec5:b8e5:6a5/64 Scope:Global
          inet6 addr: fe80::b2b3:c55e:645e:e434/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:5546671 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2573908 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:2793475526 (2.7 GB)  TX bytes:232449268 (232.4 MB)
 
cs

enp0s5 인터페이스를 사용하고 있다.

그리고 라우팅 정보를 확인한다.

1
2
3
4
5
$route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.211.55.1     0.0.0.0         UG    100    0        0 enp0s5
10.211.55.0     0.0.0.0         255.255.255.0   U     100    0        0 enp0s5
cs

10.211.55.0/24 로 들어오고 나가는 패킷이 라우팅 되어 있는것을 확인할 수 있다.


이제 브릿지 네트워크를 구성해본다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#sudo apt-get install bridge-utils //bridge control을 설치함
 
Usage: brctl [commands]
commands:
    addbr         <bridge>        add bridge
    delbr         <bridge>        delete bridge
    addif         <bridge> <device>    add interface to bridge
    delif         <bridge> <device>    delete interface from bridge
    hairpin       <bridge> <port> {on|off}    turn hairpin on/off
    setageing     <bridge> <time>        set ageing time
    setbridgeprio    <bridge> <prio>        set bridge priority
    setfd         <bridge> <time>        set bridge forward delay
    sethello      <bridge> <time>        set hello time
    setmaxage     <bridge> <time>        set max message age
    setpathcost    <bridge> <port> <cost>    set path cost
    setportprio    <bridge> <port> <prio>    set port priority
    show          [ <bridge> ]        show a list of bridges
    showmacs      <bridge>        show a list of mac addrs
    showstp       <bridge>        show bridge stp info
    stp           <bridge> {on|off}    turn stp on/off
 
#brctl addbr br0                      //br0 add
#ifconfig br0 up                      //br0 interface up
 
# cat /etc/network/interfaces
auto lo
iface lo inet loopback
 
auto br0                       # 자동으로 br0 인터페이스 up
iface br0 inet dhcp            # Defines a static IP address for br0
        bridge_ports enp0s5    # 호스트서버의 물리적인 enp0s5 포트와 br0 포트를 연결
        bridge_stp off         # Spanning Tree Protocol (STP) is used to allow multiple bridges
        bridge_fd 0            # This is the forwarding delay for interfaces joining the bridge
        bridge_maxwait 0       # 브릿지 네트워크 최대 대기 갯수
 

#ifconfig enp0s5 0.0.0.0 # 기존의 인터페이스는 any로 변경
cs

 이렇게 하면 이제 호스트에서의 내용은 끝이났다.

위와 같이 설정하고 다시 호스트의 네트워크 상태를 확인해본다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
br0       Link encap:Ethernet  HWaddr 00:1c:42:02:97:eb  
          inet addr:10.211.55.21  Bcast:10.211.55.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1428 errors:0 dropped:0 overruns:0 frame:0
          TX packets:51 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:349375 (349.3 KB)  TX bytes:5444 (5.4 KB)
 
enp0s5    Link encap:Ethernet  HWaddr 00:1c:42:02:97:eb  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:5559104 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2574148 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:2796761841 (2.7 GB)  TX bytes:232473487 (232.4 MB)
 
 
 
$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.211.55.1     0.0.0.0         UG    0      0        0 br0
10.211.55.0     0.0.0.0         255.255.255.0   U     0      0        0 br0
 
cs


보기와 같이 br0 브릿지 네트워크 인터페이스가 옳바르게 ip를 할당받고 동작하고 있다.

라우팅 테이블도 br0로 옳바르게 변경된 것을 확인할 수 있다.

이제 QEMU와 관련된 작업을 진행한다


 QEMU가 사용할 인터페이스 추가


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
> QEMU의 nic과 연결해줄 tap interface를 만들어 줘야 한다.
> 여기서 직관적으로 인자에 대해서는 알수 있다. 
> user파라 미터의 경우 현재의 유저가 해당 interface에 접근할 수 있음을 나타낸다.
 
#sudo ip tuntap add dev tap0 mode tap user $(whoami)
 
 
 
> 브릿지 네트워크에 tap0 인터페이스를 추가시키는 것을 말한다.
#sudo brctl addif br0 tap0
#sudo ifconfig tap0 up
 
그리고 이제 QEMU를 동작 시킨다.
 
 
> go.sh 파일을 이용해서 QEMU를 동작시킨다.
> The - net nic command defines a network adapter in the guest operating system. 
> Both network devices are para-virtualized devices which is indicated by the model=virtio value.
> The -net tap command defines how QEMU configures the host.
> Each network device is added to and removed from a different bridge by using scripts.
#./go.sh
---------
#!/bin/sh
 
qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda debian_squeeze_mips_standard.qcow2\
     -net nic -net tap,ifname=tap0 \
     -append "root=/dev/sda1 console=tty0" -nographic
----------
> QEMU안에서 ifconfig 했을 때의 내용
 
root@debian-mips:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 52:54:00:12:34:56  
          inet addr:10.211.55.34  Bcast:10.211.55.255  Mask:255.255.255.0
          inet6 addr: fdb2:2c26:f4e4:0:5054:ff:fe12:3456/64 Scope:Global
          inet6 addr: fe80::5054:ff:fe12:3456/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:14 errors:0 dropped:0 overruns:0 frame:0
          TX packets:19 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1940 (1.8 KiB)  TX bytes:1990 (1.9 KiB)
          Interrupt:10 Base address:0x1020 
 
> 그리고 host에서 tap0의 인터페이스를 QEMU 내부의 interface 주소로 설정
#sudo ifconfig tap0 10.211.55.34 
 
cs


[출처1] http://mapoo.net/os/oslinux/%ED%98%B8%EC%8A%A4%ED%8A%B8%EC%99%80-kvmqemu-%EA%B0%80%EC%83%81%EB%A8%B8%EC%8B%A0-%EC%82%AC%EC%9D%B4%EC%9D%98-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%ED%86%B5%EC%8B%A0/

참고차료 : https://www.ibm.com/support/knowledgecenter/en/linuxonibm/liaat/liaatbptap.htm

http://blog.elastocloud.org/2015/07/qemukvm-bridged-network-with-tap.html

LIST

'기타[etc]' 카테고리의 다른 글

python thread 병렬처리  (0) 2018.04.12
[퍼옴] gdb 분석 보조 - python  (0) 2018.03.24
파이썬 타이핑  (0) 2017.08.20
[Volatility] Profile 만들기  (0) 2017.07.22
[PYTHON] bruteforce  (0) 2017.07.09