练习 24:接口配置,ifconfignetstatiproute2ssroute

    这个练习对于你来说是一个很大的信息量,如果你不熟悉网络,这就是一个伤害。如果你感到非常失落,请立即跳到“这样做”的部分,并完成它。为了正确理解这部分,你至少应该非常熟悉网络的以下基本概念:

    • - 通信协议,就是数字消息格式和规则的系统,用于在计算系统或在电子通讯中交换那些消息。
    • 以太网 - 用于局域网(LAN)的计算机网络技术族。
    • - 分配给物理网段上通信的网络接口的唯一标识符。例如:08:00:2745:68
    • TCP/IP - 互联网协议套件是一组通信协议,用于互联网和类似网络,通常是广域网最流行的协议栈。它通常被称为 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
    • ICMP - 互联网消息控制协议,示例用法:ping 10.0.2.2
    • - 传输控制协议。在数据交换之前建立连接,因此设计上可靠。示例:SSH, HTTP。
    • UDP - 用户数据报协议。传输数据而不建立连接,因此设计上不可靠。示例:DNS。

    如果你对某些概念不熟悉,不用担心。

    • 阅读相应的维基百科文章,直到你至少充分理解(但是深入钻研当然更好)。
    • 观看 的视频:
      • 展开站点左侧的 IP 地址树节点,并通过它来以你的方式实现。
      • 展开 TCP 树节点并执行相同操作。
    • 阅读 Linux 网络概念介绍。这本指南很好,因为它甚至承认 互联网是为情欲而生的。

    让我们继续。这是 Linux 网络相关的命令列表:

    • ifconfig - 配置和查看网络接口的状态。
    • netstat - 打印网络连接,路由表,接口统计信息,伪装连接和组播成员资格。
    • ip - 显示/操做路由,设备,策略和隧道。
    • ss - 调查套接字的另一个实用程序。

    现在让我们来看看每个命令可以告诉我们什么信息。我们将从ifconfig开始。

    让我们看看我们在eth0上有哪些信息,它是一个 VirtualBox 的伪网络接口:

    这确实很多。但是同样,现在的重要字段是:

    • (5) addr - IPv4地址。
    • (6) Bcast - 广播地址。
    • (7) Mask - 网络掩码。
    • (11) UP - 接口正常工作。
    • (13) RUNNING - 准备好接受数据。
    • (19) errors 和 (25) errors - 如果在这里有不为零的东西,我们就有问题了。

    现在让我们看看netstat能给我们看的东西。

    1. user1@vm1:~$ sudo netstat -ap
    2. Active Internet connections (servers and established)
    3. #(1) (2) (3) (4) (5) (6) (7)
    4. Active Internet connections (servers and established)
    5. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
    6. tcp 0 0 *:sunrpc *:* LISTEN 580/portmap
    7. tcp 0 0 *:ssh *:* LISTEN 900/sshd
    8. tcp 0 0 *:36286 *:* LISTEN 610/rpc.statd
    9. tcp 0 0 10.0.2.15:ssh 10.0.2.2:52191 ESTABLISHED 12023/sshd: user1 [
    10. tcp 0 0 10.0.2.15:ssh 10.0.2.2:48663 ESTABLISHED 11792/sshd: user1 [
    11. tcp6 0 0 [::]:ssh [::]:* LISTEN 900/sshd
    12. tcp6 0 0 ip6-localhost:smtp [::]:* LISTEN 1111/exim4
    13. udp 0 0 *:bootpc *:* 843/dhclient
    14. udp 0 0 *:sunrpc *:* 580/portmap
    15. udp 0 0 *:52104 *:* 610/rpc.statd
    16. udp 0 0 *:786 *:* 610/rpc.statd
    17. #(8) (9) (10) (11) (12) (13) (14) (15)
    18. Active UNIX domain sockets (servers and established)
    19. Proto RefCnt Flags Type State I-Node PID/Program name Path
    20. unix 2 [ ACC ] STREAM LISTENING 3452 786/acpid /var/run/acpid.socket
    21. unix 6 [ ] DGRAM 3407 751/rsyslogd /dev/log
    22. unix 2 [ ] DGRAM 1940 214/udevd @/org/kernel/udev/udevd
    23. unix 2 [ ] DGRAM 88528 30939/sudo
    24. unix 3 [ ] STREAM CONNECTED 68565 12023/sshd: user1 [
    25. unix 3 [ ] STREAM CONNECTED 68564 12026/1
    26. unix 2 [ ] DGRAM 68563 12023/sshd: user1 [
    27. unix 3 [ ] STREAM CONNECTED 66682 11792/sshd: user1 [
    28. unix 3 [ ] STREAM CONNECTED 66681 11794/0
    29. unix 2 [ ] DGRAM 66680 11792/sshd: user1 [
    30. unix 2 [ ] DGRAM 3465 843/dhclient
    31. unix 3 [ ] DGRAM 1945 214/udevd
    32. 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 - 现在你只应该知道两个状态:LISTENESTABLISHED。前者意味着你可以连接到这个套接字,第后者的意思是这个套接字已经连接了,在这种情况下,netstat显示你的套接字对。

    ip是一个类似于ifconfig的,具有扩展功能的程序。它来自iproute2套件,用于在某一天替换ifconfig。示例输出:

    你已经知道哪些参数很重要(与ifconfig相同)。

    ss基本上是具有扩展功能的当代netstat。这是它的示例输出,其解释为留作练习:

    1. user1@vm1:~$ sudo ss -ap | cut -c1-200
    2. State Recv-Q Send-Q Local Address:Port Peer Address:Port
    3. LISTEN 0 128 *:sunrpc *:* users:(("portmap",580,5))
    4. LISTEN 0 128 :::ssh :::* users:(("sshd",900,4))
    5. LISTEN 0 128 *:ssh *:* users:(("sshd",900,3))
    6. LISTEN 0 20 ::1:smtp :::* users:(("exim4",1111,4))
    7. LISTEN 0 20 127.0.0.1:smtp *:* users:(("exim4",1111,3))
    8. LISTEN 0 128 *:36286 *:* users:(("rpc.statd",610,7))
    9. ESTAB 0 0 10.0.2.15:ssh 10.0.2.2:52191 users:(("sshd",12023,3),("sshd",12026,3))
    10. 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 - 用于这个路由的,发送封包的接口。

    netstatroute的哪个字段对应于`ip route show ·的哪个字段 ,再次留作一个练习。这真是太多了!深吸一口气,让我们转到实践。

    现在你将学习如何创建伪接口,为其分配地址并更改其状态。

    1. 1: sudo aptitude install uml-utilities
    2. 2: sudo tunctl -t tap0 -u user1
    3. 3: ls -al /sys/devices/virtual/net/tap0
    4. 4: sudo ifconfig tap0 10.1.1.1 netmask 255.255.255.0
    5. 6: sudo route
    6. 7: ping 10.1.1.1 -c 2
    7. 8: sudo ifconfig tap0 down
    8. 9: ping 10.1.1.1 -c 2
    9. 10: sudo ifconfig tap0 up
    10. 11: sudo ip a a 10.2.2.2/24 brd + dev tap0
    11. 12: sudo ifconfig
    12. 13: sudo route
    13. 14: ip a s
    14. 15: ip r s
    15. 16: ping 10.2.2.2 -c 2
    16. 17: sudo ip link set dev tap0 down
    17. 18: ip a s
    18. 19: ip r s
    19. 20: ping 10.2.2.2 -c 2
    20. 21: sudo tunctl -d tap0
    21. 22: ip a s
    22. 23: ls -al /sys/devices/virtual/net/tap0
    1. 安装使用伪(虚拟)接口的软件包。
    2. 创建伪接口tap0
    3. 打印为此接口创建的,虚拟目录的内容,其中包含其设置和统计信息。
    4. 将 IP 地址10.1.1.1/24添加到tap0
    5. 打印当前接口状态。
    6. 打印当前路由表条目。请注意,Linux 自动为tap0添加新路由。
    7. 通过向其发送 ICMP 回显请求数据包来测试tap0
    8. tap0设为DOWN状态(停用)。
    9. 通过再次发送 ICMP 回显请求数据包来测试tap0。会有额外的附加题来解释为什么这个仍然可以工作,尽管已经停用了。
    10. tap0设为UP状态(启用)。
    11. tap0添加额外的IP地址10.2.2.2/24ip aaip addr add的缩写版本。这个+的含义,你会在附加题中自己发现它。
    12. 打印当前接口状态。注意ifconfig无法列出使用ip工具添加的新 IP 地址。为什么?留作附加题。
    13. 打印当前路由表。请注意,Linux 自动为tap0添加了一条路由。
    14. 使用ip工具打印当前接口状态。你可以在这里看到新添加的地址。
    15. 使用ip工具打印我们的路由表。
    16. 通过向其发送 ICMP 回显请求报文,来测试net tap0的 IP 地址。
    17. tap0设为DOWN状态。
    18. 打印当前接口状态。
    19. 打印当前路由表条目。请注意,tap0路由将自动删除。
    20. 通过向其发送 ICMP 回显请求报文,来测试net tap0的 IP 地址。这个有用,为什么?
    21. 删除伪接口tap0
    22. 打印当前接口状态。tap0不存在
    23. 告诉我们,tap0虚拟目录现在也没有了。
    • 熟悉man ifconfigman ipman netstatman ss
    • tap0处于关闭状态时,为什么ping有用?
    • brd +的意思是什么?