在深入学习与联网相关的攻略之前,有必要简单了解一下网络设置、相关术语以及用于分配IP地址、添加路由等的命令。这则攻略会回顾GNU/Linux中的一些网络命令。
8.2.1 预备知识
网络接口用于将主机以有线或无线的形式连接到网络。Linux使用eth0、eth1或enp0s25(指代以太网接口)这种方式来命名网络接口。还有一些其他的接口,如usb0、wlan0以及tun0,分别对应USB网络接口、无线LAN和隧道。
在这则攻略中会涉及如下命令:ifconfig、route、nslookup和host。
ifconfig命令用于配置及显示网络接口、子网掩码等细节信息。它通常位于/sbin/ifconfig中。
8.2.2 实战演练
(1) 列出当前的网络接口配置
$ ifconfigeth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 172.26.65.159 netmask 255.255.240.0 broadcast 172.26.79.255inet6 fe80::215:5dff:fe0c:7180 prefixlen 64 scopeid 0x20<link>ether 00:15:5d:0c:71:80 txqueuelen 1000 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 6 bytes 516 (516.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0inet6 ::1 prefixlen 128 scopeid 0x10<host>loop txqueuelen 1000 (Local Loopback)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ifconfig输出的最左边一列是网络接口名,右边的若干列显示对应的网络接口的详细信息。
(2) 设置网络接口的IP地址
# ifconfig wlan0 192.168.0.80
你需要以root身份运行上述命令。192.168.0.80是为无线设备wlan0所设置的IP地址。
使用以下命令设置此IP地址的子网掩码:
# ifconfig wlan0 192.168.0.80 netmask 255.255.252.0
(2) 动态 IP 地址设置
很多网络使用动态主机配置协议(DHCP)自动为连接到网络上的计算机分配IP地址。dhclient命令可以用于完成这项任务。如果通过DHCP分配IP地址,请使用dhclient,不要手动设置地址,以免和网络上的其他主机产生冲突。很多Linux发行版在感知到有网络物理连接的时候会自动调用dhclient。
# dhclient eth0
8.2.3 补充内容
ifconfig命令可以与其他shell工具结合使用,生成特定的报告。
打印网络接口列表
这个单行命令可以打印系统可用的网络接口列表:
$ ifconfig | cut -c-10 | tr -d ' ' | tr -s '\n'lowlan0
ifconfig输出的每行前10个字符被保留用于网络接口名称。因此我们用cut命令提取每一行的前10个字符。tr -d ' '删除每一行的所有空格。用tr -s 'n'压缩多个换行符以生成接口名称列表。
显示 IP 地址
ifconfig会显示系统中所有活动网络接口的详细信息。不过,我们可以限制它只显示某个特定接口的信息:
$ ifconfig iface_name
例如:
$ ifconfig lolo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0inet6 ::1 prefixlen 128 scopeid 0x10<host>loop txqueuelen 1000 (Local Loopback)...
要想控制某台网络设备,我们需要 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 是子网掩码。
要从ifconfig输出中提取IP地址,可以使用:
$ ifconfig wlan0 | egrep -o "inetaddr:[^ ]*" | grep -o "[0-9.]*"192.168.0.82
egrep -o "inetaddr:[^ ]*" 会打印出inet addr:192.168.0.82。其中的模式以inetaddr:作为起始,以非空格字符序列(由[^ ]*指定)作为结束。接下来命令grep -o "[0-9.]*"只输出数字与点号(.)的组合,也就是IP地址。
硬件地址(MAC地址)欺骗
如果采用了基于硬件地址的认证或过滤,那么我们可以使用硬件地址欺骗(hardware address spoofing)。硬件地址在ifconfig输出中是以HWaddr 00:1c:bf:87:25:d2形式出现的。
ifconfig的子命令可以定义设备类别以及MAC地址:
# ifconfig eth0 hw ether 00:1c:bf:87:25:d5
在上面的命令中,00:1c:bf:87:25:d5是分配的新MAC地址。如果我们需要通过部署了MAC认证的服务提供商才能够访问Internet,这招就能发挥作用了。
注意,所分配的 MAC 地址在机器重启之后就失效了。
名字服务器与 DNS(域名服务)
Internet底层的寻址方案是采用点分十进制形式的IP地址(例如83.166.169.231)。相较于数字,人类更喜欢使用文字,因此Internet上的资源是通过被称为URL或域名的字符串来标识的。例如,www.packpub.com就是一个域名,它对应着一个IP地址。在浏览器中输入IP地址或域名都可以访问到该站点。
将IP地址映射为符号名称的这种技术称为域名服务(DNS)。当我们输入www.google.com,计算机使用DNS服务器将域名解析为对应的IP地址。在本地网络中,我们可以设置本地DNS为本地主机命名。
名字服务器是在文件 /etc/resolv.conf中定义的:
$ cat /etc/resolv.conf# Local nameservernameserver 192.168.1.1# External nameservernameserver 8.8.8.8
我们可以编辑该文件来手动添加名字服务器或是使用下面的命令:
# sudo echo nameserver IP_ADDRESS >> /etc/resolv.conf
获取域名所对应IP地址的最简单方法就是用ping命令访问指定的域名。命令的回应信息中就包含了IP地址:
$ ping google.comPING google.com (64.233.181.106) 56(84) bytes of data.
64.233.181.106是google.com对应的IP地址。
一个域名可以对应多个IP地址。对于这种情况,ping只会显示其中的一个地址。要想获取分配给域名的所有IP地址,就得使用DNS查找工具了。
DNS 查找
有多种基于命令行的DNS查找工具都可以实现名字与IP地址的解析。host和nslookup就是其中两个常用工具。
host命令会列出某个域名所有的IP地址:
$ yum install bind-utils$ host google.comgoogle.com has address 142.251.43.14google.com mail is handled by 50 alt4.aspmx.l.google.com.google.com mail is handled by 40 alt3.aspmx.l.google.com.google.com mail is handled by 20 alt1.aspmx.l.google.com.google.com mail is handled by 10 aspmx.l.google.com.google.com mail is handled by 30 alt2.aspmx.l.google.com.
nslookup命令可以完成名字与IP地址之间的相互映射:
$ nslookup google.comServer: 172.26.64.1Address: 172.26.64.1#53Non-authoritative answer:Name: google.comAddress: 142.251.43.14
上面最后一行对应着用于DNS解析的默认名字服务器。
也可以通过向文件/etc/hosts中加入条目来实现名字解析。
/etc/hosts文件格式如下:
IP_ADDRESS name1 name2 ...
用下面的方法更新该文件:
# echo IP_ADDRESS symbolic_name >> /etc/hosts
例如:
# echo 192.168.0.9 backupserver >> /etc/hosts
添加了条目之后,任何时候解析backupserver,都会返回192.168.0.9。如果backupserver有多个名字,将其全部写入同一行中:
# echo 192.168.0.9 backupserver backupserver.example.com >> /etc/hosts
显示路由表信息
多个网络相互连接是很常见的场景。例如,工作场所或学校的不同部门可能处于不同的网络中。如果一个网络中的设备想同另一个网络中的设备通信,就需要借助某个同时连接了两个网络的设备发送分组。这个特殊的设备叫作网关,它的作用是在不同的网络中转发分组。
操作系统维护着一个叫作路由表的表格,它包含了分组如何转发的信息。route命令可以显示路由表:
$ routeKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Ifacedefault MiHome.mshome.n 0.0.0.0 UG 0 0 0 eth0172.26.64.0 0.0.0.0 255.255.240.0 U 0 0 0 eth0
也可以使用
$ route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface0.0.0.0 172.26.64.1 0.0.0.0 UG 0 0 0 eth0172.26.64.0 0.0.0.0 255.255.240.0 U 0 0 0 eth0
-n指定以数字形式显示地址。默认情况下,route命令会将IP地址映射为名字。
如果系统不知道如何分组到目的地的路由,它会将其发送到默认网关。默认网关可以连接到Internet或部门内部的路由器。
route add命令可以添加默认网关:
# route add default gw IP_ADDRESS INTERFACE_NAME
例如:
# route add default gw 192.168.0.1 wlan0
8.2.4 参考
- 1.3 节讲解了 PATH 变量。
- 4.3 节讲解了
grep命令。
