# 練習 24:接口配置,`ifconfig`,`netstat`,`iproute2`,`ss`,`route`
> 原文:[Exercise 24. Networking: interface configuration, ifconfig, netstat, iproute2, ss, route](https://archive.fo/JzBji)
> 譯者:[飛龍](https://github.com/wizardforcel)
> 協議:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 自豪地采用[谷歌翻譯](https://translate.google.cn/)
這個練習對于你來說是一個很大的信息量,如果你不熟悉網絡,這就是一個傷害。如果你感到非常失落,請立即跳到“這樣做”的部分,并完成它。為了正確理解這部分,你至少應該非常熟悉網絡的以下基本概念:
+ [通信協議](http://en.wikipedia.org/wiki/Communications_protocol) - 通信協議,就是數字消息格式和規則的系統,用于在計算系統或在電子通訊中交換那些消息。
+ [以太網](http://en.wikipedia.org/wiki/Ethernet) - 用于局域網(LAN)的計算機網絡技術族。
+ [MAC 地址](http://en.wikipedia.org/wiki/MAC_address) - 分配給物理網段上通信的網絡接口的唯一標識符。例如:` 08:00:27:d4:45:68`。
+ [TCP/IP](http://en.wikipedia.org/wiki/Internet_protocol_suite) - 互聯網協議套件是一組通信協議,用于互聯網和類似網絡,通常是廣域網最流行的協議棧。它通常被稱為 TCP/IP,由于其最重要的協議:傳輸控制協議(TCP)和互聯網協議(IP)
+ [IP](http://en.wikipedia.org/wiki/Internet_Protocol) - 互聯網協議(IP)是主要通信協議,用于跨互聯網絡中繼轉發數據報(也稱為網絡封包)。
+ [IP 地址](http://en.wikipedia.org/wiki/IP_address) - 互聯網協議地址。示例:`10.0.2.15`
+ [端口](http://en.wikipedia.org/wiki/Port_(computer_networking)) - 應用特定或流程特定的軟件結構,在計算機的主機操作系統中用作通信端點。示例:`22`
+ [網絡套接字](http://en.wikipedia.org/wiki/Network_socket) - 跨計算機網絡的,進程間通信流的端點。今天,大多數計算機之間的通信基于互聯網協議;因此大多數網絡套接字都是互聯網套接字。
+ 本地套接字地址 - 本地 IP 地址和端口號,例如:`10.0.2.15:22`。
+ 遠程套接字地址 - 遠程 IP 地址和端口號,僅適用于已建立的 TCP 套接字。示例:`10.0.2.2:52173`。
+ [套接字對](http://en.wikipedia.org/wiki/Network_socket%23Socket_pairs) - 溝通本地和遠程套接字,只有 TCP 協議。示例:`(10.0.2.15:22, 10.0.2.2:52173)`。
+ [子網掩碼](http://en.wikipedia.org/wiki/Subnetwork) - 邏輯可見的 IP 網絡細分。示例:`/24`或另一個記號`255.255.255.0`。
+ [路由](http://en.wikipedia.org/wiki/Routing) - 在網絡中選擇路徑,來發送網絡流量的過程。
+ [默認網關](http://en.wikipedia.org/wiki/Default_gateway) - 在計算機網絡中,網關是一個 TCP/IP 網絡上的節點(路由器),作為另一個網絡的接入點。默認網關是計算機網絡上的節點,當 IP 地址與路由表中的任何其他路由不匹配時,網絡軟件使用它。示例:`10.0.2.2`。
+ [廣播地址](http://en.wikipedia.org/wiki/Broadcast_address) - 邏輯地址,其中連接到多重訪問的網絡的設備能接收數據報。發給廣播地址的消息,通常會由所有附加到網絡的主機接收,而不是特定主機。示例:`10.0.2.255`。
+ [ICMP](http://en.wikipedia.org/wiki/Internet_Control_Message_Protocol) - 互聯網消息控制協議,示例用法:`ping 10.0.2.2`。
+ [TCP](http://en.wikipedia.org/wiki/Transmission_Control_Protocol) - 傳輸控制協議。在數據交換之前建立連接,因此設計上可靠。示例:SSH, HTTP。
+ [UDP](http://en.wikipedia.org/wiki/User_Datagram_Protocol) - 用戶數據報協議。傳輸數據而不建立連接,因此設計上不可靠。示例:DNS。
如果你對某些概念不熟悉,不用擔心。
+ 閱讀相應的維基百科文章,直到你至少充分理解(但是深入鉆研當然更好)。
+ 觀看 <http://www.visualland.net.cn/> 的視頻:
+ 展開站點左側的 IP 地址樹節點,并通過它來以你的方式實現。
+ 展開 TCP 樹節點并執行相同操作。
+ 閱讀 [Linux 網絡概念介紹](http://www.iptables.org/documentation/HOWTO//networking-concepts-HOWTO-3.html%23ss3.1)。這本指南很好,因為它甚至承認 互聯網是為情欲而生的。
讓我們繼續。這是 Linux 網絡相關的命令列表:
+ `ifconfig` - 配置和查看網絡接口的狀態。
+ `netstat` - 打印網絡連接,路由表,接口統計信息,偽裝連接和組播成員資格。
+ `ip` - 顯示/操做路由,設備,策略和隧道。
+ `ss` - 調查套接字的另一個實用程序。
現在讓我們來看看每個命令可以告訴我們什么信息。我們將從`ifconfig`開始。
```
user1@vm1:~$ sudo ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:d4:45:68 # (1), (2), (3)
inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0 # (4), (5), (6), (7)
inet6 addr: fe80::a00:27ff:fed4:4568/64 Scope:Link # (8), (9), (10)
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 # (11), (12), (13), (14), (15), (16)
RX packets:35033 errors:0 dropped:0 overruns:0 frame:0 # (17), (18), (19), (20), (21), (22)
TX packets:28590 errors:0 dropped:0 overruns:0 carrier:0 # (23), (24), (25), (26), (27), (28)
collisions:0 txqueuelen:1000 # (29), (30)
RX bytes:6360747 (6.0 MiB) TX bytes:21721365 (20.7 MiB) # (31), (32)
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:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:560 (560.0 B) TX bytes:560 (560.0 B)
```
我們可以看到`vm1`中有兩個網絡接口,`eth0`和`lo`。`lo`是一個回送 接口,用于連接同一臺機器上的客戶端-服務器程序。
讓我們看看我們在`eth0`上有哪些信息,它是一個 VirtualBox 的偽網絡接口:
| 字段 | 描述 | 字段 | 描述 |
| --- | --- | --- | --- |
| (1) Link | 物理選項 | (17) RX | 接收(縮寫) |
| (2) encap | 封裝類型 | (18) packets | 封包總數 |
| (3) Hwaddr | MAC 地址 | (19) errors | 錯誤的數據包總數 |
| (4) inet | 地址族(IPv4) | (20) dropped | 丟棄的封包(低系統內存?) |
| (5) addr | IPv4 地址 | (21) overruns | 比處理速度快的封包 |
| (6) Bcast | 廣播地址 | (22) frame | 接收的無效的幀 |
| (7) Mask | 網絡掩碼 | (23) TX | 傳輸(縮寫) |
| (8) inet6 | 地址族(IPv6) | (24) packets | 封包總數 |
| (9) addr | IPv6 地址 | (25) errors | 錯誤的數據包總數 |
| (10) Scope | 地址范圍(主機,鏈路,全局) | (26) dropped | 丟棄的封包(低系統內存?) |
| (11) UP | 接口功能正常 | (27) overruns | 比處理速度快的封包(我不確定) |
| (12) BROADCAST | 它可以一次性向所有主機發送流量 | (28) carrier | 鏈路載波丟失 |
| (13) RUNNING | 它準備好接受數據(我不確定) | (29) collisions | 發生了包裝碰撞 |
| (14) MULTICAST | 它可以發送和接收組播封包 | (30) txqueuelen | 傳出數據包的轉發隊列長度 |
| (15) MTU | 其最大傳輸單位 | (31) RX bytes | 收到的字節總數 |
| (16) Metric | 路由開銷(在 Linux 中未使用) | (32) TX bytes | 發送的字節總數 |
這確實很多。但是同樣,現在的重要字段是:
+ (5) `addr` - IPv4地址。
+ (6) `Bcast` - 廣播地址。
+ (7) `Mask ` - 網絡掩碼。
+ (11) `UP` - 接口正常工作。
+ (13) `RUNNING` - 準備好接受數據。
+ (19) `errors` 和 (25) `errors` - 如果在這里有不為零的東西,我們就有問題了。
現在讓我們看看`netstat`能給我們看的東西。
```
user1@vm1:~$ sudo netstat -ap
Active Internet connections (servers and established)
#(1) (2) (3) (4) (5) (6) (7)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 *:sunrpc *:* LISTEN 580/portmap
tcp 0 0 *:ssh *:* LISTEN 900/sshd
tcp 0 0 localhost:smtp *:* LISTEN 1111/exim4
tcp 0 0 *:36286 *:* LISTEN 610/rpc.statd
tcp 0 0 10.0.2.15:ssh 10.0.2.2:52191 ESTABLISHED 12023/sshd: user1 [
tcp 0 0 10.0.2.15:ssh 10.0.2.2:48663 ESTABLISHED 11792/sshd: user1 [
tcp6 0 0 [::]:ssh [::]:* LISTEN 900/sshd
tcp6 0 0 ip6-localhost:smtp [::]:* LISTEN 1111/exim4
udp 0 0 *:bootpc *:* 843/dhclient
udp 0 0 *:sunrpc *:* 580/portmap
udp 0 0 *:52104 *:* 610/rpc.statd
udp 0 0 *:786 *:* 610/rpc.statd
#(8) (9) (10) (11) (12) (13) (14) (15)
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 3452 786/acpid /var/run/acpid.socket
unix 6 [ ] DGRAM 3407 751/rsyslogd /dev/log
unix 2 [ ] DGRAM 1940 214/udevd @/org/kernel/udev/udevd
unix 2 [ ] DGRAM 88528 30939/sudo
unix 3 [ ] STREAM CONNECTED 68565 12023/sshd: user1 [
unix 3 [ ] STREAM CONNECTED 68564 12026/1
unix 2 [ ] DGRAM 68563 12023/sshd: user1 [
unix 3 [ ] STREAM CONNECTED 66682 11792/sshd: user1 [
unix 3 [ ] STREAM CONNECTED 66681 11794/0
unix 2 [ ] DGRAM 66680 11792/sshd: user1 [
unix 2 [ ] DGRAM 3465 843/dhclient
unix 2 [ ] DGRAM 3448 786/acpid
unix 3 [ ] DGRAM 1945 214/udevd
unix 3 [ ] DGRAM 1944 214/udevd
```
我使用兩個參數來修改`netstat`輸出。`-a`參數告訴`netstat`來顯示所有的連接,包括建立的,例如你當前正在打字的`ssh`會話,以及監聽的,例如等待新的連接的`sshd`守護進程。`-p`告訴`netstat`來顯示哪個程序擁有每個連接。
| 活動互聯網連接(服務器和已建立) | |
| --- | --- |
| 字段 | 描述 |
| (1) Proto | 套接字使用的協議(tcp,udp,raw) |
| (2) Recv-Q | 連接到此套接字的用戶程序的未復制的字節數 |
| (3) Send-Q | 遠程主機未確認的字節數 |
| (4) Local Address | 套接字的本端的地址和端口號。 |
| (5) Foreign Address | 套接字遠端的地址和端口號。 |
| (6) State | `ESTABLISHED`, `SYN_SENT`, `SYN_RECV`, `FIN_WAIT1`, `FIN_WAIT2`, `TIME_WAIT`, `CLOSE`, `CLOSE_WAIT`, `LAST_ACK`, `LISTEN`, `CLOSING`, `UNKNOWN` |
| (7) PID | 擁有套接字的進程的進程 ID(PID)和進程名稱的斜杠對。 |
| 活動 UNIX 域套接字(服務器和已建立) |
| 字段 | 描述 |
| (8) Proto | 套接字使用的協議(通常為 unix)。 |
| (9) RefCnt | 引用計數(即附加到此套接字的進程)。 |
| (10) Flags | 顯示的標志是`SO_ACCEPTON`(顯示為`ACC`),`SO_WAITDATA`(`W`)或`SO_NOSPACE`(`N`)。 |
| (11) Type | `SOCK_DGRAM`, `SOCK_STREAM`, `SOCK_RAW`, `SOCK_RDM`, `SOCK_SEQPACKET`, `SOCK_PACKET`, `UNKNOWN`. |
| (12) State | `FREE`, `LISTENING`, `CONNECTING`, `CONNECTED`, `DISCONNECTING`, `(empty)`, `UNKNOWN`. |
| (13) I-Node | 套接字文件的索引節點。 |
| (14) PID | 打開套接字的進程的進程 ID(PID)和進程名稱。 |
| (15) Path | 這是連接到套接字的對應進程的路徑名。 |
并非所有字段都是重要的。通常你只需要查看活動的互聯網連接(服務器和已建立) 部分,并使用以下字段:
(1)`Proto` - 套接字使用的協議(tcp,udp,raw)。
(4)`Local Address` - 套接字本端的地址和端口號。
(5)`Foreign Address` - 套接字遠端的地址和端口號,僅用于套接字對。
(6)`State` - 現在你只應該知道兩個狀態:`LISTEN`和`ESTABLISHED`。前者意味著你可以連接到這個套接字,第后者的意思是這個套接字已經連接了,在這種情況下,`netstat`顯示你的套接字對。
`ip`是一個類似于`ifconfig`的,具有擴展功能的程序。它來自`iproute2`套件,用于在某一天替換`ifconfig`。示例輸出:
```
user1@vm1:~$ sudo ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
# (1) (2) (3) (4) (5) (6) (8) (9)
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:d4:45:68 brd ff:ff:ff:ff:ff:ff # (9), (10), (11)
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0 # (12), (13), (14)
inet6 fe80::a00:27ff:fed4:4568/64 scope link # (15), (16)
valid_lft forever preferred_lft forever # (17), (18), (19)
```
同樣,我們來看看我們在`eth0`上有什么信息:
| 字段 | 描述 |
| --- | --- |
| (1) BROADCAST | 它可以一次性向所有主機發送流量 |
| (2) MULTICAST | 它可以發送和接收組播數據包 |
| (3) UP | 它是生效的,邏輯狀態 |
| (4) LOWER_UP | 驅動器信號 L1 已開啟(自 Linux 2.6.17 起) |
| (5) MTU | 最大傳輸單位 |
| (6) qdisc | 排隊規則,基本上是流量調度策略 |
| (8) State | 物理狀態(載體感覺?) |
| (9) qlen | 傳出數據包的轉發隊列長度 |
| (10) link | 物理選項 |
| (11) ether | 封裝類型,MAC 地址 |
| (12) brd | 數據鏈路層(物理)廣播地址 |
| (13) inet | IPv4 地址族地址 |
| (14) brd | IPv4 廣播 |
| (15) scope | IPv4地址范圍(主機,鏈路,全局) |
| (16) inet6 | IPv6 地址族地址 |
| (17) scope | IPv6地址范圍(主機,鏈路,全局) |
| (18) valid_lft | IPv6 源地址選擇策略 |
| (19) preffered_lft | IPv6 源地址選擇策略 |
你已經知道哪些參數很重要(與`ifconfig`相同)。
`ss`基本上是具有擴展功能的當代`netstat`。這是它的示例輸出,其解釋為留作練習:
```
user1@vm1:~$ sudo ss -ap | cut -c1-200
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:sunrpc *:* users:(("portmap",580,5))
LISTEN 0 128 :::ssh :::* users:(("sshd",900,4))
LISTEN 0 128 *:ssh *:* users:(("sshd",900,3))
LISTEN 0 20 ::1:smtp :::* users:(("exim4",1111,4))
LISTEN 0 20 127.0.0.1:smtp *:* users:(("exim4",1111,3))
LISTEN 0 128 *:36286 *:* users:(("rpc.statd",610,7))
ESTAB 0 0 10.0.2.15:ssh 10.0.2.2:52191 users:(("sshd",12023,3),("sshd",12026,3))
ESTAB 0 0 10.0.2.15:ssh 10.0.2.2:48663 users:(("sshd",11792,3),("sshd",11794,3))
```
這用于處理接口,連接和接口地址。但是網絡路由呢?你也可以使用幾個命令獲取它們的信息:
```
user1@vm1:~$ sudo route -n
Kernel IP routing table
# (1) (2) (3) (4) (5) (6) (7) (8)
Destination Gateway Genmask Flags Metric Ref Use Iface
10.0.2.0 * 255.255.255.0 U 0 0 0 eth0
default 10.0.2.2 0.0.0.0 UG 0 0 0 eth0
user1@vm1:~$ sudo netstat -nr
Kernel IP routing table # (9)
Destination Gateway Genmask Flags MSS Window irtt Iface
10.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 10.0.2.2 0.0.0.0 UG 0 0 0 eth0
user1@vm1:~$ sudo ip route show
# (10) (11) (12) (13) (14)
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15
#(15) (16)
default via 10.0.2.2 dev eth0
```
讓我們再一次看看字段:
| 字段 | 描述 |
| --- | --- |
| (1) Destination | 目標網絡或目標主機。 |
| (2) Gateway | 網關地址或`*`,如果沒有設置的話。 |
| (3) Genmask | 目標網絡的掩碼;`255.255.255.255`為主機目標,`0.0.0.0`為默認路由。 |
| (4) Flags | Up, Host, Gateway, Reinstate, Dynamically installed, Modified, Addrconf, Cache entry, ! reject. |
| (5) Metric | 目標的“距離”(通常以跳數計算)。最近的內核不使用它,但路由守護進程可能需要它。 |
| (6) Ref | 這個路由的引用次數(在 Linux 內核中未使用)。 |
| (7) Use | 路由查詢次數。 |
| (8) Iface | 用于這個路由的,發送封包的接口 |
| (9) irtt | 初始 RTT(往返時間)。內核使用它來猜測最佳的 TCP 協議參數,而無需等待(可能很慢)的答案。 |
| (10) Net/Mask | 目標網絡或目標主機。 |
| (11) dev | 用于這個路由的,發送封包的接口 |
| (12) proto | `man ip /RTPROTO`: redirect, kernel, boot, static, ra |
| (13) scope | `man ip /SCOPE_WALUE`: global, site, link, host |
| (14) src | 發送到路由前綴覆蓋的目標時,優先選擇的源地址。 |
| (15) default | 默認網關地址 |
| (15) dev | 用于這個路由的,發送封包的接口 |
目前的重要字段:
+ (1)`Destination` - 目標網絡或目標主機。
+ (2)`Gateway` - 網關地址或`*`,如果沒有設置的話。默認值意味著,如果沒有明確指定的目標地址的網關,則將通過該網關發送數據包。
+ (3)`Genmask` - 目標網絡的網絡掩碼;`255.255.255.255`為主機目標,`0.0.0.0`為默認路由。
+ (8)`Iface` - 用于這個路由的,發送封包的接口。
`netstat`和`route`的哪個字段對應于`ip route show ·的哪個字段 ,再次留作一個練習。這真是太多了!深吸一口氣,讓我們轉到實踐。
現在你將學習如何創建偽接口,為其分配地址并更改其狀態。
## 這樣做
```
1: sudo aptitude install uml-utilities
2: sudo tunctl -t tap0 -u user1
3: ls -al /sys/devices/virtual/net/tap0
4: sudo ifconfig tap0 10.1.1.1 netmask 255.255.255.0
5: sudo ifconfig
6: sudo route
7: ping 10.1.1.1 -c 2
8: sudo ifconfig tap0 down
9: ping 10.1.1.1 -c 2
10: sudo ifconfig tap0 up
11: sudo ip a a 10.2.2.2/24 brd + dev tap0
12: sudo ifconfig
13: sudo route
14: ip a s
15: ip r s
16: ping 10.2.2.2 -c 2
17: sudo ip link set dev tap0 down
18: ip a s
19: ip r s
20: ping 10.2.2.2 -c 2
21: sudo tunctl -d tap0
22: ip a s
23: ls -al /sys/devices/virtual/net/tap0
```
## 你會看到什么
```
user1@vm1:~$ sudo aptitude install uml-utilities
The following NEW packages will be installed:
libfuse2{a} uml-utilities
0 packages upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/205 kB of archives. After unpacking 737 kB will be used.
Do you want to continue? [Y/n/?]
Selecting previously deselected package libfuse2.
(Reading database ... 39616 files and directories currently installed.)
Unpacking libfuse2 (from .../libfuse2_2.8.4-1.1_amd64.deb) ...
Selecting previously deselected package uml-utilities.
Unpacking uml-utilities (from .../uml-utilities_20070815-1.1_amd64.deb) ...
Processing triggers for man-db ...
Setting up libfuse2 (2.8.4-1.1) ...
Setting up uml-utilities (20070815-1.1) ...
Starting User-mode networking switch: uml_switch.
user1@vm1:~$ sudo tunctl -t tap0 -u user1
Set 'tap0' persistent and owned by uid 1000
user1@vm1:~$ ls -al /sys/devices/virtual/net/tap0
total 0
drwxr-xr-x 4 root root 0 Jul 11 05:33 .
drwxr-xr-x 4 root root 0 Jul 11 05:33 ..
-r--r--r-- 1 root root 4096 Jul 11 05:33 address
-r--r--r-- 1 root root 4096 Jul 11 05:33 addr_len
-r--r--r-- 1 root root 4096 Jul 11 05:33 broadcast
-r--r--r-- 1 root root 4096 Jul 11 05:33 carrier
-r--r--r-- 1 root root 4096 Jul 11 05:33 dev_id
-r--r--r-- 1 root root 4096 Jul 11 05:33 dormant
-r--r--r-- 1 root root 4096 Jul 11 05:33 duplex
-r--r--r-- 1 root root 4096 Jul 11 05:33 features
-rw-r--r-- 1 root root 4096 Jul 11 05:33 flags
-r--r--r-- 1 root root 4096 Jul 11 05:33 group
-rw-r--r-- 1 root root 4096 Jul 11 05:33 ifalias
-r--r--r-- 1 root root 4096 Jul 11 05:33 ifindex
-r--r--r-- 1 root root 4096 Jul 11 05:33 iflink
-r--r--r-- 1 root root 4096 Jul 11 05:33 link_mode
-rw-r--r-- 1 root root 4096 Jul 11 05:33 mtu
-r--r--r-- 1 root root 4096 Jul 11 05:33 operstate
-r--r--r-- 1 root root 4096 Jul 11 05:33 owner
drwxr-xr-x 2 root root 0 Jul 11 05:33 power
-r--r--r-- 1 root root 4096 Jul 11 05:33 speed
drwxr-xr-x 2 root root 0 Jul 11 05:33 statistics
lrwxrwxrwx 1 root root 0 Jul 11 05:33 subsystem -> ../../../../class/net
-r--r--r-- 1 root root 4096 Jul 11 05:33 tun_flags
-rw-r--r-- 1 root root 4096 Jul 11 05:33 tx_queue_len
-r--r--r-- 1 root root 4096 Jul 11 05:33 type
-rw-r--r-- 1 root root 4096 Jul 11 05:33 uevent
user1@vm1:~$ sudo ifconfig tap0 10.1.1.1 netmask 255.255.255.0
user1@vm1:~$ sudo ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:d4:45:68
inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fed4:4568/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:64040 errors:0 dropped:0 overruns:0 frame:0
TX packets:44578 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:19663646 (18.7 MiB) TX bytes:25043918 (23.8 MiB)
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:76 errors:0 dropped:0 overruns:0 frame:0
TX packets:76 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:6272 (6.1 KiB) TX bytes:6272 (6.1 KiB)
tap0 Link encap:Ethernet HWaddr ee:d8:2e:f6:bc:f1
inet addr:10.1.1.1 Bcast:10.1.1.255 Mask:255.255.255.0
inet6 addr: fe80::ecd8:2eff:fef6:bcf1/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:1 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
user1@vm1:~$ sudo route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.0.2.0 * 255.255.255.0 U 0 0 0 eth0
10.1.1.0 * 255.255.255.0 U 0 0 0 tap0
default 10.0.2.2 0.0.0.0 UG 0 0 0 eth0
user1@vm1:~$ ping 10.1.1.1 -c 2
PING 10.1.1.1 (10.1.1.1) 56(84) bytes of data.
64 bytes from 10.1.1.1: icmp_req=1 ttl=64 time=0.070 ms
64 bytes from 10.1.1.1: icmp_req=2 ttl=64 time=0.027 ms
--- 10.1.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.027/0.048/0.070/0.022 ms
user1@vm1:~$ sudo ifconfig tap0 down
user1@vm1:~$ ping 10.1.1.1 -c 2
PING 10.1.1.1 (10.1.1.1) 56(84) bytes of data.
64 bytes from 10.1.1.1: icmp_req=1 ttl=64 time=0.030 ms
64 bytes from 10.1.1.1: icmp_req=2 ttl=64 time=0.024 ms
--- 10.1.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.024/0.027/0.030/0.003 ms
user1@vm1:~$ sudo ifconfig tap0 up
user1@vm1:~$ sudo ip a a 10.2.2.2/24 brd + dev tap0
user1@vm1:~$ sudo ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:d4:45:68
inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fed4:4568/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:64088 errors:0 dropped:0 overruns:0 frame:0
TX packets:44609 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:19667480 (18.7 MiB) TX bytes:25049771 (23.8 MiB)
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:84 errors:0 dropped:0 overruns:0 frame:0
TX packets:84 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:6944 (6.7 KiB) TX bytes:6944 (6.7 KiB)
tap0 Link encap:Ethernet HWaddr ee:d8:2e:f6:bc:f1
inet addr:10.1.1.1 Bcast:10.1.1.255 Mask:255.255.255.0
inet6 addr: fe80::ecd8:2eff:fef6:bcf1/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:9 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
user1@vm1:~$ sudo route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.2.2.0 * 255.255.255.0 U 0 0 0 tap0
10.0.2.0 * 255.255.255.0 U 0 0 0 eth0
10.1.1.0 * 255.255.255.0 U 0 0 0 tap0
default 10.0.2.2 0.0.0.0 UG 0 0 0 eth0
user1@vm1:~$ ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:d4:45:68 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
inet6 fe80::a00:27ff:fed4:4568/64 scope link
valid_lft forever preferred_lft forever
12: tap0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 500
link/ether ee:d8:2e:f6:bc:f1 brd ff:ff:ff:ff:ff:ff
inet 10.1.1.1/24 brd 10.1.1.255 scope global tap0
inet 10.2.2.2/24 brd 10.2.2.255 scope global tap0
inet6 fe80::ecd8:2eff:fef6:bcf1/64 scope link
valid_lft forever preferred_lft forever
user1@vm1:~$ ip r s
10.2.2.0/24 dev tap0 proto kernel scope link src 10.2.2.2
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15
10.1.1.0/24 dev tap0 proto kernel scope link src 10.1.1.1
default via 10.0.2.2 dev eth0
user1@vm1:~$ ping 10.2.2.2 -c 2
PING 10.2.2.2 (10.2.2.2) 56(84) bytes of data.
64 bytes from 10.2.2.2: icmp_req=1 ttl=64 time=0.081 ms
64 bytes from 10.2.2.2: icmp_req=2 ttl=64 time=0.025 ms
--- 10.2.2.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.025/0.053/0.081/0.028 ms
user1@vm1:~$ sudo ip link set dev tap0 down
user1@vm1:~$ ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:d4:45:68 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
inet6 fe80::a00:27ff:fed4:4568/64 scope link
valid_lft forever preferred_lft forever
12: tap0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 500
link/ether ee:d8:2e:f6:bc:f1 brd ff:ff:ff:ff:ff:ff
inet 10.1.1.1/24 brd 10.1.1.255 scope global tap0
inet 10.2.2.2/24 brd 10.2.2.255 scope global tap0
user1@vm1:~$ ip r s
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15
default via 10.0.2.2 dev eth0
user1@vm1:~$ ping 10.2.2.2 -c 2
PING 10.2.2.2 (10.2.2.2) 56(84) bytes of data.
64 bytes from 10.2.2.2: icmp_req=1 ttl=64 time=0.037 ms
64 bytes from 10.2.2.2: icmp_req=2 ttl=64 time=0.024 ms
--- 10.2.2.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.024/0.030/0.037/0.008 ms
user1@vm1:~$ sudo tunctl -d tap0
Set 'tap0' nonpersistent
user1@vm1:~$ ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:d4:45:68 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
inet6 fe80::a00:27ff:fed4:4568/64 scope link
valid_lft forever preferred_lft forever
user1@vm1:~$ ls -al /sys/devices/virtual/net/tap0
ls: cannot access /sys/devices/virtual/net/tap0: No such file or directory
user1@vm1:~$
```
## 解釋
1. 安裝使用偽(虛擬)接口的軟件包。
1. 創建偽接口`tap0`。
1. 打印為此接口創建的,虛擬目錄的內容,其中包含其設置和統計信息。
1. 將 IP 地址`10.1.1.1/24`添加到`tap0`。
1. 打印當前接口狀態。
1. 打印當前路由表條目。請注意,Linux 自動為`tap0`添加新路由。
1. 通過向其發送 ICMP 回顯請求數據包來測試`tap0`。
1. 將`tap0`設為`DOWN`狀態(停用)。
1. 通過再次發送 ICMP 回顯請求數據包來測試`tap0`。會有額外的附加題來解釋為什么這個仍然可以工作,盡管已經停用了。
1. 將`tap0`設為`UP`狀態(啟用)。
1. 向`tap0`添加額外的IP地址`10.2.2.2/24`。`ip aa`是`ip addr add`的縮寫版本。這個`+`的含義,你會在附加題中自己發現它。
1. 打印當前接口狀態。注意`ifconfig`無法列出使用`ip`工具添加的新 IP 地址。為什么?留作附加題。
1. 打印當前路由表。請注意,Linux 自動為`tap0`添加了一條路由。
1. 使用`ip`工具打印當前接口狀態。你可以在這里看到新添加的地址。
1. 使用`ip`工具打印我們的路由表。
1. 通過向其發送 ICMP 回顯請求報文,來測試`net tap0`的 IP 地址。
1. 將`tap0`設為`DOWN`狀態。
1. 打印當前接口狀態。
1. 打印當前路由表條目。請注意,`tap0`路由將自動刪除。
1. 通過向其發送 ICMP 回顯請求報文,來測試`net tap0`的 IP 地址。這個有用,為什么?
1. 刪除偽接口`tap0`。
1. 打印當前接口狀態。`tap0`不存在
1. 告訴我們,`tap0`虛擬目錄現在也沒有了。
## 附加題
+ 熟悉`man ifconfig`,`man ip`,`man netstat`,`man ss`。
+ 當`tap0`處于關閉狀態時,為什么`ping`有用?
+ `brd +`的意思是什么?
+ 為什么`ifconfig`無法列出使用`ip`添加的新地址?
- 笨辦法學 Linux 中文版
- 練習 0:起步
- 練習 1:文本編輯器,vim
- 練習 2:文本瀏覽器,少即是多
- 練習 3:Bash:Shell、.profile、.bashrc、.bash_history
- 練習 4:Bash:處理文件,pwd,ls,cp,mv,rm,touch
- 練習 5:Bash:環境變量,env,set,export
- 練習 6:Bash:語言設置,LANG,locale,dpkg-reconfigure locales
- 練習 7:Bash:重定向,stdin,stdout,stderr,<,>,>>,|,tee,pv
- 練習 8:更多的重定向和過濾:head,tail,awk,grep,sed
- 練習 9:Bash:任務控制,jobs,fg
- 練習 10:Bash:程序退出代碼(返回狀態)
- 練習 11:總結
- 練習 12:文檔:man,info
- 練習 13:文檔:Google
- 練習 14:包管理:Debian 包管理工具aptitude
- 練習 15:系統啟動:運行級別,/etc/init.d,rcconf,update-rc.d
- 練習 16:處理進程,ps,kill
- 練習 17:任務調度:cron,at
- 練習 18:日志:/var/log,rsyslog,logger
- 練習 19:文件系統:掛載,mount,/etc/fstab
- 練習 20:文件系統:修改和創建文件系統,tune2fs,mkfs
- 練習 21:文件系統:修改根目錄,chroot
- 練習 22:文件系統:移動數據,tar,dd
- 練習 23:文件系統:權限,chown,chmod,umask
- 練習 24:接口配置,ifconfig,netstat,iproute2,ss,route
- 練習 25:網絡:配置文件,/etc/network/interfaces
- 練習 26:網絡:封包過濾配置,iptables
- 練習 27:安全 Shell,ssh,sshd,scp
- 練習 28:性能:獲取性能情況,uptime,free,top
- 練習 29:內核:內核消息,dmesg
- 練習 30:打磨、洗練、重復:總復習
- 下一步做什么
- Debian 手動安裝