歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux 內核調試3-UML網絡配置

UML支持多種方式的網絡,一般使用tap/tun模擬UML虛擬機中的eth0驅動,僅僅這種方式也能分為橋接和NAT等等,手工配置網絡也有助於理解網絡的運行方式。

根據官方文檔 Simple UML Networking 下載 uml_utilities ,其實也就使用了一個工具 tunctl,這個工具很簡單,就是啟動 tun 驅動,首先得先查看是否加載 tun 驅動,當然首先需要有root權限:

# 查看用戶 ID (tunctl 使用)
[cpp@dark tunctl]$ id
uid=500(cpp) gid=500(cpp) groups=500(cpp) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

# 切換管理員權限
[cpp@dark tunctl]$ su
Password:

# 查看tun驅動是否加載
[root@dark tunctl]# lsmod | grep tun

# 沒有則加載tun驅動
[root@dark tunctl]# modprobe tun

# 再次查看
[root@dark tunctl]# lsmod | grep tun
tun                    13014  0

# 查看普通用戶是否有讀寫tun設備權限
[root@dark tunctl]# ls /dev/net/tun -l
crw-rw-rw-. 1 root root 10, 200 Dec  8 11:19 /dev/net/tun

# 啟動tun,設置用戶ID
# 隨後驅動以tap模式啟動,設備為 tap0
[root@dark tunctl]# ./tunctl -u 500
Set 'tap0' persistent and owned by uid 500

# 查看所有網卡狀態,可以看到已經有tap0接口
[root@dark tunctl]#ifconfig -a
eth1      Link encap:Ethernet  HWaddr 08:00:27:54:D1:F5
          inet addr:10.33.33.34  Bcast:10.255.255.255  Mask:255.0.0.0
          inet6 addr: fe80::a00:27ff:fe54:d1f5/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:555523 errors:13 dropped:0 overruns:0 frame:0
          TX packets:70630 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:424000963 (404.3 MiB)  TX bytes:4827144 (4.6 MiB)
          Interrupt:19 Base address:0xd020

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:102 errors:0 dropped:0 overruns:0 frame:0
          TX packets:102 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:13444 (13.1 KiB)  TX bytes:13444 (13.1 KiB)

tap0      Link encap:Ethernet  HWaddr DA:47:96:23:59:AA
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

# 激活tap網卡並設置IP地址
[root@dark cpp]# ifconfig tap0 192.168.33.33 up

# 完畢後刪除網卡可使用命令
[root@dark tunctl]# ./tunctl -d tap0

到這裡已經設置好tun/tap網卡,接下來啟動UML虛擬機並且配置網絡:

# 啟動UML虛擬機,設置網卡為tap
[cpp@dark linux-2.6.36]$ ./linux eth0=tuntap,tap0 ubda=Gentoo-10.0-AMD64-root_fs

# 啟動過程中出現
eth0: broadcasting for a lease
eth0: timed out
# 說明並沒有連通網絡

# 啟動虛擬機後檢測網卡配置
eth0: broadcasting for a lease
eth0: timed out
eth0: trying to use old lease in `/var/lib/dhcpcd/dhcpcd-eth0.lease'
localhost ~ # ifconfig
eth0      Link encap:Ethernet  HWaddr b2:9d:a5:12:b9:45
          inet addr:169.254.186.160  Bcast:169.254.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:1578 (1.5 KiB)
          Interrupt:5

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

可以看到UML虛擬機已經有網卡配置,但是並無法連通網絡。連通網絡有幾種方式,像virtualbox等虛擬機的NAT和橋接等等,按照UML這種設計方式,應該可以配置出來任意類型,這裡嘗試配置橋接模式:

# 設置IP路由轉發
[root@dark linux-2.6.36]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@dark linux-2.6.36]# echo 1 > /proc/sys/net/ipv4/conf/tap0/proxy_arp

# 創建網橋 (brctl 位於 bridge-utils 軟件包)
[root@dark linux-2.6.36]# brctl addbr br0
# 把 eth1 和 tap0 加入網橋
[root@dark linux-2.6.36]# brctl addif br0 eth1
[root@dark linux-2.6.36]# brctl addif br0 tap0

# 修改br0網橋的網絡配置並激活
[root@dark linux-2.6.36]# ifconfig eth1 10.33.33.35 up
[root@dark linux-2.6.36]# ifconfig tap0 10.33.33.36 up
[root@dark linux-2.6.36]# ifconfig br0 10.33.33.34 up

# 啟動UML虛擬機,設置網卡為tap
[cpp@dark linux-2.6.36]$ ./linux eth0=tuntap,tap0 ubda=Gentoo-10.0-AMD64-root_fs

# 設置UML虛擬機網絡配置
localhost ~ # ifconfig eth0 10.33.33.36 netmask 255.255.255.0

經過設置網橋後發現仍然無法連通本地10.33.33.35,卻可以ping通遠程機器地址,真是抓狂,抓包發現tap0網卡arp解 析有問題,進一步查看發現tap0網卡的mac地址與虛擬機內eth0網卡mac地址不同,也就是UML內部重新創建一個網卡而並沒有直接使用tap0, 只是通過tap0收發數據,但為什麼遠程機器可以接受但是本地地址無法接受呢?本地網卡把10.33.33.36當成了本機tap0,而外網地址把 10.33.33.36當成了UML虛擬機,故能連通,也就是UML虛擬機跟主機tap0並不相同,是兩個獨立的機器,把UML虛擬機設置為 10.33.33.37,發現所有機器都可以連通。這樣就把UML虛擬機橋接到網絡上了。

現在設置NAT網絡,把系統網絡狀態恢復到開始, 重新設置tap驅動,地址為192.168.33.33,啟動虛擬機,設置ip地址為 192.168.33.34,這樣 192.168.33.* 就相當於一個小局域網,192.168.33.34 通過 192.168.33.33 轉發,設置完畢以後二者便可通信,也省去了橋接的麻煩,只是需要操縱 iptables。

# 在 UML 虛擬機內設置默認路由
localhost ~ # route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.33.33
# 查看路由表,看到已經添加了 default 網關為 192.168.33.33
localhost ~ # route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.33.0    *               255.255.255.0   U     0      0        0 eth0
loopback        *               255.0.0.0       U     0      0        0 lo
default         192.168.33.33   0.0.0.0         UG    0      0        0 eth0

# 設置IP路由轉發
[root@dark linux-2.6.36]# echo 1 > /proc/sys/net/ipv4/ip_forward

# 設置SNAT源地址轉換 10.33.33.34 為eth1地址
[root@dark linux-2.6.36]# iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 10.33.33.34

# 如果此時不通,可檢查iptables的其他規則和UML與主機的路由表配置

這樣便可做成NAT的效果,比橋接方式簡單的多,只是需要知道iptables的用法。當然以上配置每次重啟將會消失,可以寫到配置開機自動設置。

相關系列文章:
Linux 內核調試1-UML http://www.linuxidc.com/Linux/2012-07/66410.htm
Linux 內核調試2-UML調試內核 http://www.linuxidc.com/Linux/2012-07/66411.htm
Linux 內核調試3-UML網絡配置 http://www.linuxidc.com/Linux/2012-07/66412.htm
Linux 內核調試4-Qemu調試Linux內核 http://www.linuxidc.com/Linux/2012-07/66413.htm
Linux 內核調試5-UML和Qemu調試模塊 http://www.linuxidc.com/Linux/2012-07/66414.htm
Linux 內核調試6-使用KGDB雙機調試 http://www.linuxidc.com/Linux/2012-07/66415.htm

Copyright © Linux教程網 All Rights Reserved