7.2 联网知识入门

在深入学习与联网相关的攻略之前,有必要简单了解一下网络设置、相关术语以及用于分配IP地址、添加路由等命令。这则攻略会从头开始介绍GNU/Linux中用于联网的命令及用法。

7.2.1 新手上路

网络上每一个节点都需要分配多个参数才能够与其他主机顺利实现互联。这些参数包括子网掩码、网关、路由、端口、DNS等。

这则攻略将介绍命令ifconfigroutenslookup以及host

7.2.2 实战演练

网络接口用来连接网络。通常在类UNIX操作系统环境中,网络接口遵循eth0、eth1这种命名惯例。还有一些其他的接口,如usb0、wlan0等,分别对应USB网络接口、无线LAN等网络。

ifconfig命令用于显示网络接口、子网掩码等详细信息。

ifconfig位于 /sbin/ifconfig。当输入该命令时,一些GNU/Linux发行版会显示错误“command not found”。这是因为 /sbin没有包含在用户的PATH环境变量中。Bash会在PATH变量指定的目录中查找输入的命令。

在Debian中,ifconfig默认是不可用的,因为 /sbin并不包括在PATH中。

/sbin/ifconfig是一个绝对路径,所以要用这个绝对路径(也就是 /sbin/ifconfig)运行ifconfig。在每个系统中,默认都有一个称之为环回接口的lo,这个接口指向当前主机本身。例如:

  1. $ ifconfig
  2. lo Link encap:Local Loopback
  3. inet addr:127.0.0.1 Mask:255.0.0.0
  4. inet6addr: ::1/128 Scope:Host
  5. UP LOOPBACK RUNNING MTU:16436 Metric:1
  6. RX packets:6078 errors:0 dropped:0 overruns:0 frame:0
  7. TX packets:6078 errors:0 dropped:0 overruns:0 carrier:0
  8. collisions:0 txqueuelen:0
  9. RX bytes:634520 (634.5 KB) TX bytes:634520 (634.5 KB)
  10.  
  11. wlan0 Link encap:EthernetHWaddr 00:1c:bf:87:25:d2
  12. inet addr:192.168.0.82 Bcast:192.168.3.255 Mask:255.255.252.0
  13. inet6addr: fe80::21c:bfff:fe87:25d2/64 Scope:Link
  14. UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
  15. RX packets:420917 errors:0 dropped:0 overruns:0 frame:0
  16. TX packets:86820 errors:0 dropped:0 overruns:0 carrier:0
  17. collisions:0 txqueuelen:1000
  18. RX bytes:98027420 (98.0 MB) TX bytes:22602672 (22.6 MB)

ifconfig输出的最左边一列是网络接口名,右边的若干列显示对应的网络接口的详细信息。

7.2.3 补充内容

还有一些其他的使用频繁的命令,用于查询及配置网络。让我们看看这些重要的命令以及它们的用法。

  • 打印网络接口列表

这个单行命令序列可以打印系统可用的网络接口列表。

  1. $ ifconfig | cut -c-10 | tr -d ' ' | tr -s '\n'
  2. lo
  3. wlan0

ifconfig输出到前10个字符是被保留用于打印网络接口的名称,因此我们用cut命令提取每一行的前10个字符。tr -d ' '删除每一行的所有空格。用tr -s '\n'压缩重复的换行符生成接口名称列表。

  • IP地址的分配与显示

ifconfig会显示系统中所有可用网络接口的详细信息。我们可以限制它只显示某个特定的接口信息:

  1. $ ifconfig iface_name

例如:

  1. $ ifconfig wlan0
  2. wlan0 Link encap:Ethernet HWaddr 00:1c:bf:87:25:d2
  3. inet addr:192.168.0.82 Bcast:192.168.3.255
  4. Mask:255.255.252.0

在上面命令输出中,我们感兴趣的是IP地址、广播地址、硬件地址和子网掩码。它们分别为:

  • HWaddr 00:1c:bf:87:25:d2是硬件地址(MAC地址);

  • inet addr:192.168.0.82是IP地址;

  • Bcast:192.168.3.255是广播地址;

  • Mask:255.255.252.0是子网掩码。

在编写某些脚本时,我们可能需要在脚本中提取某些地址来做进一步的处理。

常见的是提取IP地址。要从ifconfig输出中提取IP地址,可以使用:

  1. $ ifconfig wlan0 | egrep -o "inet addr:[^ ]*" | grep -o "[0-9.]*"
  2. 192.168.0.82

第一条命令egrep -o "inet addr:[^ ]*" 会打印出inet addr:192.168.0.82

样式以inet addr:作为起始,以非空格字符序列(由 [^ ]* 指定)作为结束。在接下来的管道操作中,打印出数字与点号(.)的组合。

要设置网络接口的IP地址,可以使用:

  1. # ifconfig wlan0 192.168.0.80

你需要以超级用户的身份来运行上面的命令。192.168.0.80是要被设置的IP地址。

设置IP地址的子网掩码:

  1. # ifconfig wlan0 192.168.0.80 netmask 255.255.252.0
  • 硬件地址(MAC地址)欺骗

在某些情况下,需要利用硬件地址对网络上的计算机进行认证或过滤,对此我们可以使用硬件地址欺骗。硬件地址在ifconfig输出中是以HWaddr 00:1c:bf:87:25:d2的形式出现的。

我们能够按照下面的方法在软件层面上进行硬件地址欺骗:

  1. # ifconfig eth0 hw ether 00:1c:bf:87:25:d5

在上面的命令中,00:1c:bf:87:25:d5是分配的新MAC地址。

MAC认证服务提供商为每一台主机提供Internet访问,如果我们需要通过他们才能上网,那么上面这招就很管用。

  • 名字服务器与DNS

Internet最根本的寻址方案是IP地址(点分十进制形式,例如202.11.32.75)。然而,Internet上的资源(比如网站)是通过被称为URL或域名的ASCII字符组合来访问的,例如google.com就是一个域名。它实际上和IP地址是对应关系。在浏览器中输入IP地址同样可以访问www.google.com

这种利用符号名对IP地址进行抽象的技术就被称为DNS(Domain Name Service,域名服务)。当我们输入google.com,我们的网络所配置的DNS服务器会将域名解析为对应的IP地址。在本地网络中,我们可以设置本地DNS使用主机名命名本地网络上的主机。

分配给当前系统的名字服务器可以通过读取 /etc/resolv.conf查看。例如:

  1. $ cat /etc/resolv.conf
  2. nameserver 8.8.8.8

我们可以像下面这样手动添加名字服务器:

  1. # echo nameserver IP_ADDRESS >> /etc/resolv.conf

我们该如何获得域名所对应的IP地址呢?

获取IP地址最简单的方法就是ping给定的域名,然后查看回应信息。例如:

  1. $ ping google.com
  2. PING google.com (64.233.181.106) 56(84) bytes of data.
  3. #64.233.181.106是google.com对应的IP地址。

一个域名可以分配多个IP地址。对于这种情况,DNS服务器只会返回其中一个地址。要想获取分配给域名的所有IP地址,得使用DNS查找工具。

  • DNS查找

有多种的命令行DNS查找工具,这些工具会向DNS服务器请求IP地址解析。而hostnslookup就是两个DNS查找工具。

当执行host时,它会列出某个域名所有的IP地址。nslookup是一个类似于host的命令,它用于查询DNS相关的细节信息以及名字解析。例如:

  1. $ host google.com
  2. google.com has address 64.233.181.105
  3. google.com has address 64.233.181.99
  4. google.com has address 64.233.181.147
  5. google.com has address 64.233.181.106
  6. google.com has address 64.233.181.103
  7. google.com has address 64.233.181.104

host也可以列出DNS资源记录(DNS resource record),比如MX(Mail Exchange):

  1. $ nslookup google.com
  2. Server: 8.8.8.8
  3. Address: 8.8.8.8#53
  4.  
  5. Non-authoritative answer:
  6. Name: google.com
  7. Address: 64.233.181.105
  8. Name: google.com
  9. Address: 64.233.181.99
  10. Name: google.com
  11. Address: 64.233.181.147
  12. Name: google.com
  13. Address: 64.233.181.106
  14. Name: google.com
  15. Address: 64.233.181.103
  16. Name: google.com
  17. Address: 64.233.181.104
  18.  
  19. Server: 8.8.8.8

上面最后一行对应着用于DNS解析的默认名字服务器。

如果不使用DNS服务器,也可以为IP地址解析添加符号名,这只需要向文件 /etc/hosts中添加条目即可。

用下面的语法添加条目:

  1. # echo IP_ADDRESS symbolic_name >> /etc/hosts

例如:

  1. # echo 192.168.0.9 backupserver.com >> /etc/hosts

添加了条目之后,任何时候解析backupserver.com,都会返回192.168.0.9。

  • 设置默认网关,显示路由表信息

如果一个本地网络连接到了另一个网络,需要安排一些主机或网络节点,通过它们实现网络间的互联。目的地为外部网络的IP分组应该转发给这些连接外部网络的节点主机。这些能够向外部网络转发分组的特殊节点主机被成为网关。我们要为每个节点设置网关,使之能够连接到外部网络。

操作系统维护着一个被称为路由表(routing table)的表格,它包含了关于分组如何转发以及通过网络中的哪些节点转发的信息。可以用下面的方法显示路由表:

  1. $ route
  2. Kernel IP routing table
  3. Destination Gateway Genmask Flags Metric Ref UseIface
  4. 192.168.0.0 * 255.255.252.0 U 2 0 0wlan0
  5. link-local * 255.255.0.0 U 1000 0 0wlan0
  6. default p4.local 0.0.0.0 UG 0 0 0wlan0

也可以使用:

  1. $ route -n
  2. Kernel IP routing table
  3. Destination Gateway Genmask Flags Metric Ref Use Iface
  4. 192.168.0.0 0.0.0.0 255.255.252.0 U 2 0 0 wlan0
  5. 169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 wlan0
  6. 0.0.0.0 192.168.0.4 0.0.0.0 UG 0 0 0 wlan0

-n指定以数字形式显示地址。如果使用-n,route会以数字形式的IP地址显示每一个条目;否则,在IP地址对应的DNS条目可用的情况下,它会显示符号形式的主机名。

设置默认网关:

  1. # route add default gw IP_ADDRESS INTERFACE_NAME

例如:

  1. # route add default gw 192.168.0.1 wlan0
  • Traceroute

当应用程序通过Internet请求服务时,服务器可能位于远端,两者之间可能通过多个网关或设备节点相连。分组要穿过这些网关才能到达目的地。有一个很有意思的命令traceroute,它可以显示分组途径的所有网关的地址。traceroute信息可以帮助我们搞明白分组到达目的地需要经过多少跳(hop)。中途的网关或路由器的数量给出了一个测量网络上两个节点直接距离的度量(metric)。traceroute的输出如下:

  1. $ traceroute google.com
  2. traceroute to google.com (74.125.77.104), 30 hops max, 60 byte packets
  3. 1 gw-c6509.lxb.as5577.net (195.26.4.1) 0.313 ms 0.371 ms 0.457 ms
  4. 2 40g.lxb-fra.as5577.net (83.243.12.2) 4.684 ms 4.754 ms 4.823 ms
  5. 3 de-cix10.net.google.com (80.81.192.108) 5.312 ms 5.348 ms 5.327 ms
  6. 4 209.85.255.170 (209.85.255.170) 5.816 ms 5.791 ms 209.85.255.172
  7. (209.85.255.172) 5.678 ms
  8. 5 209.85.250.140 (209.85.250.140) 10.126 ms 9.867 ms 10.754 ms
  9. 6 64.233.175.246 (64.233.175.246) 12.940 ms 72.14.233.114
  10. (72.14.233.114) 13.736 ms 13.803 ms
  11. 7 72.14.239.199 (72.14.239.199) 14.618 ms 209.85.255.166
  12. (209.85.255.166) 12.755 ms 209.85.255.143 (209.85.255.143) 13.803 ms
  13. 8 209.85.255.98 (209.85.255.98) 22.625 ms 209.85.255.110
  14. (209.85.255.110) 14.122 ms
  15. *
  16. 9 ew-in-f104.1e100.net (74.125.77.104) 13.061 ms 13.256 ms 13.484 ms

7.2.4 参考

  • 1.3节讲解了PATH变量。

  • 4.3节讲解了grep命令。