练习 24:接口配置,ifconfig
,netstat
,iproute2
,ss
,route
这个练习对于你来说是一个很大的信息量,如果你不熟悉网络,这就是一个伤害。如果你感到非常失落,请立即跳到“这样做”的部分,并完成它。为了正确理解这部分,你至少应该非常熟悉网络的以下基本概念:
- 通信协议 - 通信协议,就是数字消息格式和规则的系统,用于在计算系统或在电子通讯中交换那些消息。
- - 用于局域网(LAN)的计算机网络技术族。
- MAC 地址 - 分配给物理网段上通信的网络接口的唯一标识符。例如:
08:00:2745:68
。 - - 互联网协议套件是一组通信协议,用于互联网和类似网络,通常是广域网最流行的协议栈。它通常被称为 TCP/IP,由于其最重要的协议:传输控制协议(TCP)和互联网协议(IP)
- IP - 互联网协议(IP)是主要通信协议,用于跨互联网络中继转发数据报(也称为网络封包)。
- - 互联网协议地址。示例:
10.0.2.15
- 端口) - 应用特定或流程特定的软件结构,在计算机的主机操作系统中用作通信端点。示例:
22
- - 跨计算机网络的,进程间通信流的端点。今天,大多数计算机之间的通信基于互联网协议;因此大多数网络套接字都是互联网套接字。
- 本地套接字地址 - 本地 IP 地址和端口号,例如:
10.0.2.15:22
。 - 远程套接字地址 - 远程 IP 地址和端口号,仅适用于已建立的 TCP 套接字。示例:
10.0.2.2:52173
。 - 套接字对 - 沟通本地和远程套接字,只有 TCP 协议。示例:
(10.0.2.15:22, 10.0.2.2:52173)
。 - - 逻辑可见的 IP 网络细分。示例:
/24
或另一个记号255.255.255.0
。 - 路由 - 在网络中选择路径,来发送网络流量的过程。
- - 在计算机网络中,网关是一个 TCP/IP 网络上的节点(路由器),作为另一个网络的接入点。默认网关是计算机网络上的节点,当 IP 地址与路由表中的任何其他路由不匹配时,网络软件使用它。示例:
10.0.2.2
。 - 广播地址 - 逻辑地址,其中连接到多重访问的网络的设备能接收数据报。发给广播地址的消息,通常会由所有附加到网络的主机接收,而不是特定主机。示例:
10.0.2.255
。 - - 互联网消息控制协议,示例用法:
ping 10.0.2.2
。 - TCP - 传输控制协议。在数据交换之前建立连接,因此设计上可靠。示例:SSH, HTTP。
- - 用户数据报协议。传输数据而不建立连接,因此设计上不可靠。示例:DNS。
如果你对某些概念不熟悉,不用担心。
- 阅读相应的维基百科文章,直到你至少充分理解(但是深入钻研当然更好)。
- 观看 http://www.visualland.net.cn/ 的视频:
- 展开站点左侧的 IP 地址树节点,并通过它来以你的方式实现。
- 展开 TCP 树节点并执行相同操作。
- 阅读 。这本指南很好,因为它甚至承认 互联网是为情欲而生的。
让我们继续。这是 Linux 网络相关的命令列表:
ifconfig
- 配置和查看网络接口的状态。netstat
- 打印网络连接,路由表,接口统计信息,伪装连接和组播成员资格。ip
- 显示/操做路由,设备,策略和隧道。ss
- 调查套接字的另一个实用程序。
现在让我们来看看每个命令可以告诉我们什么信息。我们将从ifconfig
开始。
让我们看看我们在eth0
上有哪些信息,它是一个 VirtualBox 的伪网络接口:
这确实很多。但是同样,现在的重要字段是:
- (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 *: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 3 [ ] DGRAM 1945 214/udevd
unix 3 [ ] DGRAM 1944 214/udevd
我使用两个参数来修改netstat
输出。-a
参数告诉netstat
来显示所有的连接,包括建立的,例如你当前正在打字的ssh
会话,以及监听的,例如等待新的连接的sshd
守护进程。-p
告诉netstat
来显示哪个程序拥有每个连接。
并非所有字段都是重要的。通常你只需要查看活动的互联网连接(服务器和已建立) 部分,并使用以下字段:
(1)Proto
- 套接字使用的协议(tcp,udp,raw)。
(4)Local Address
- 套接字本端的地址和端口号。
(5)Foreign Address
- 套接字远端的地址和端口号,仅用于套接字对。
(6)State
- 现在你只应该知道两个状态:LISTEN
和ESTABLISHED
。前者意味着你可以连接到这个套接字,第后者的意思是这个套接字已经连接了,在这种情况下,netstat
显示你的套接字对。
ip
是一个类似于ifconfig
的,具有扩展功能的程序。它来自iproute2
套件,用于在某一天替换ifconfig
。示例输出:
你已经知道哪些参数很重要(与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))
这用于处理接口,连接和接口地址。但是网络路由呢?你也可以使用几个命令获取它们的信息:
让我们再一次看看字段:
目前的重要字段:
- (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
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
- 安装使用伪(虚拟)接口的软件包。
- 创建伪接口
tap0
。 - 打印为此接口创建的,虚拟目录的内容,其中包含其设置和统计信息。
- 将 IP 地址
10.1.1.1/24
添加到tap0
。 - 打印当前接口状态。
- 打印当前路由表条目。请注意,Linux 自动为
tap0
添加新路由。 - 通过向其发送 ICMP 回显请求数据包来测试
tap0
。 - 将
tap0
设为DOWN
状态(停用)。 - 通过再次发送 ICMP 回显请求数据包来测试
tap0
。会有额外的附加题来解释为什么这个仍然可以工作,尽管已经停用了。 - 将
tap0
设为UP
状态(启用)。 - 向
tap0
添加额外的IP地址10.2.2.2/24
。ip aa
是ip addr add
的缩写版本。这个+
的含义,你会在附加题中自己发现它。 - 打印当前接口状态。注意
ifconfig
无法列出使用ip
工具添加的新 IP 地址。为什么?留作附加题。 - 打印当前路由表。请注意,Linux 自动为
tap0
添加了一条路由。 - 使用
ip
工具打印当前接口状态。你可以在这里看到新添加的地址。 - 使用
ip
工具打印我们的路由表。 - 通过向其发送 ICMP 回显请求报文,来测试
net tap0
的 IP 地址。 - 将
tap0
设为DOWN
状态。 - 打印当前接口状态。
- 打印当前路由表条目。请注意,
tap0
路由将自动删除。 - 通过向其发送 ICMP 回显请求报文,来测试
net tap0
的 IP 地址。这个有用,为什么? - 删除伪接口
tap0
。 - 打印当前接口状态。
tap0
不存在 - 告诉我们,
tap0
虚拟目录现在也没有了。
- 熟悉
man ifconfig
,man ip
,man netstat
,man ss
。 - 当
tap0
处于关闭状态时,为什么ping
有用? brd +
的意思是什么?