第十六章 联网
Linux可用于构建包括防火墙、路由器、域名服务器、网络附加存储(Network-Attached Storage, NAS)在内的各种联网系统和设备、网络检测、文件传输还有远程登陆等。
相关命令如下:
- ping:向网络主机发送ICMP ECHO_REQUEST分组。
- traceroute:输出分组抵达网络主机所经历的路线。
- ip:显示/操作路由、设备、策略路由、隧道。
- netstat:输出网络连接、路由表、接口统计、伪装连接、多播成员关系。
- ftp:互联网文件传输协议。
- wget:非交互式网络下载。
- ssh:OpenSSH客户端(远程登陆程序)。
- scp和sftp:在网络上复制文件。
常见术语:
- IP地址
- 主机名和域名
- 统一资源标识符(Uniform Resource Identifier, URI)
注意 后文涉及的一些命令可能需要从Linux发行版仓库中额外的软件包(取决于你使用的Linux发行版),部分命令可能需要超级用户权限才能执行。
网络检查和监控
即使不是超级管理员,检查网络性能和状态通常也是有益无害的。
ping
基本网络命令
ping domain #向域名为domain的主机发送ICMP ECHO_REQUEST的特殊网络分组
用途:测试网络的连通性,可以用于测试是否能够访问某个网站。
注意 多数网络设备(包括Linux主机)能够配置为ICMP ECHO_REQUEST。这么做往往是出于安全的考虑,以此在一定程度上迷惑在的攻击者。防火墙通常也会阻塞ICMP流量。
例如:查看是否能够抵达www.baidu.com
[me@linuxbox ~]$ ping www.baidu.com
PING www.baidu.com(153.3.238.127) 56(84) byte of data.
64 bytes from 153.3.238.127 (153.3.238.127): icmp_seq=1 ttl=51 time=61.0ms
64 bytes from 153.3.238.127 (153.3.238.127): icmp_seq=2 ttl=51 time=64.9ms
64 bytes from 153.3.238.127 (153.3.238.127): icmp_seq=3 ttl=51 time=57.6ms
64 bytes from 153.3.238.127 (153.3.238.127): icmp_seq=4 ttl=51 time=47.7ms
^C
--- www.baidu.com ping statistics ---
4 packets transmitted 4 received 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 47.671/57.766/64.851/6.371ms
ping命令启动后,会按照特定间隔(默认为1s)持续发送分组,直至被截断(Ctrl-C组合键进行截断)。ping命令会输出性能统计信息。正常的网络会显示0%的分组丢失率。一次成功执行的ping命令表明网络的各个组成部分(接口卡、布线、路由、网卡)工作情况整体良好。
traceroute
列出网络流量从本地主机到域名为domian的主机经过的所有跳(hop)数。
命令如下:
traceroute domain #列出网络流量从本地主机到域名为domian的主机经过的所有跳(hop)数。
例如: 要查看到达www.baidu.com的路由
traceroute www.baidu.com
输出结果如下:
traceroute to www.baidu.com(155.3.238.127) 30 hops max, 60 byte packets
1 bogon (172.17.16.1) 1.670ms 0.978ms 0.755ms
2 * * *
3 * * *
4 * * *
5 * * *
6 58.240.53.109 (58.240.53.109) 47.234ms 47.361ms 47.124ms
7 221.6.5.97 (221.6.5.97) 50.139ms 49.827ms 47.404ms
8 155.3.228.194 (153.3.228.194) 44.374ms 41.392ms 41.244ms
9 153.37.96.250 (153.37.96.250) 45.587ms 45.561ms 45.500ms
在输出结果中,我们可以看到从本地系统到www.baidu.com需要经历9个路由器。对于提供了标识信息的路由器,能够得知其主机名、IP地址以及性能数据(从本地系统到该路由器的3个往返时间采样)。对于没有提供标识信息的路由器(路由器配置、网络拥塞、防火墙等原因),会像第2跳那样用星号表示。如果路由信息被阻塞,有时可以使用traceroute命令的-T或-I选项来解决。
ip
IP是一款多用途的网络配置工具。它取代了早期ifconfig程序(现已过时)可以使用ip命令检查系统的网络接口和路由表:
ip a
ip addr
输出结果如下:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.01/8 scope host lo
valid_lft forever preferred_lft forever
inet 10.255.255.254/32 brd 10.255.255.254 scope global lo
inet 6 ::1/128 scope host
valid_lft forever preferred_lft forever
2:eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:15:5d:9f:1c:33 brd 172.17.31.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80 :: 215 :5dff:fe9f:1c33/64 scope link
valid_lft forever preferred_lft forever
可以看到有两个网络端口。第一个接口时回环接口(loopback interface),名为lo,是一个虚拟接口,系统用它来和"和自己对话"(talk to itself);第二个接口是以太网接口,名为eth0。
在进行网络诊断时,重要的是在每个网络接口信息的第一行中寻找UP字样(表示该接口已启用)并查看第3行的inet字段中是否存在有效IP地址。如果系统采用了动态主机配置协议(Dynnamic Host Configuration Protocol, DHCP),该字段中的有效IP地址则能证明DHCP工作正常。
netstat
用于检查各种网络设置和统计信息。-ie选项能够检查系统的网络接口:
netstat -ie
输出结果如下:
Kernel Interface table
eth0: flags=4163<UP, BROADCAST, RUNNING, MULTICAST> mtu 1500
inet 172.17.18.221 netmask 255.255.240.0 broadcast 172.17.31.255
inet6 fe80::215:5dff:fe9f:1c33 prefixlen 64 scopeid 0x20
ether 00:15:5d:9f:1c:33 txqueuelen 1000 (Ethernet)
RX packets 1313 bytes 4454183 (4.4 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1379 bytes 122380(122.3 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo:flag=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 : : 1 prefixlen 128 scopeid 0x10
loop txqueuelen 1000 (Local Loopback)
RX packets 74 bytes 7490(7.4 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 74 bytes 7490(7.4 KB)
TX errors 0 dropped overruns 0 carrier 0 collisions 0
-r 选项能够显示内核的网络路由表,从中能够看出分组是如何在网络之间传送的:
netstat -r
输出结果如下:
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default bogon 0.0.0.0 UG 0 0 0 eth0
172.17.16.0 0.0.0.0 255.255.240.0 U 0 0 0 eth0
位于防火墙/路由器之后的局域网中一台客户端的典型路由表。第一行表明目的地为192.168.1.0。以0结尾的IP地址指代网络,而非单独主机,因此其代表的是此网络中的任意主机。下一个字段Gateway是用于将分组从当前主机发送到目标网络的网关(路由器)名称或IP地址。begon表示虚假的IP地址。星号表示不需要设置网关。
目的字段若为default。如果流量的目的地未在路由表中表明,测该行指明了此类流量的去处。
通过网络传输文件
要是不能在网络上传输文件,那么网络还有可用?
ftp
ftp其得名于使用的文件传输协议(File Transfer Protocol, FTP)。FTP曾经是互联网上广泛使用的文件下载方式。大多数Web浏览器都支持它。
ftp先于Web浏览器出现。ftp程序用于同FTP服务器通信,后者包含着可通过网络上传和下载的文件。
ftp是以明文像是发送用户名和密码的所以并不安全。这意味着,只要嗅探网络就能知道是什么内容。因此几乎所有ftp服务器都是匿名的,允许任何人使用用户名anonymous和无意义的密码登录。
例如:使用ftp程序匿名下载FTP服务器flieserver的/pub/cd_images/Ubuntu-18.04目录下载Ubuntu ISO映像文件:
交互式ftp命令
命令 | 含义 |
---|---|
ftp filserver | 启动ftp服务器,连接到ftp服务器fileserver |
anonymous | 用户名。登录提示要求输入密码。有些服务器可以接受空密码;有些要求输入电子邮箱地址形式的密码。在多种情况下,不妨尝试user@example.com这种密码 |
cd pub/cd_images/ubuntu-18.04 | 更改远程系统目录。注意在多数匿名FTP服务器中,可供公开下载的文件位于pub目录下的某个位置 |
ls | 列出远程目录中的内容 |
lcd Desktop | 将本地系统的目录更改为/Desktop。在本例中,ftp程序是在工作目录中调用的。该命令将工作目录更改为~/Desktop |
get ubuntu-18.04-desktop-amd64.iso | 告诉远程系统将文件ubuntu-18.04-desktop-amd64.iso传至本地系统。因为本地系统的工作目录已经更改为~/Desktop,所以该文件会被下载到此目录 |
bye | 登出服务器,结束ftp会话,也可以使用quite和exit命令 |
在提示符ftp>处输入help,会显示所支持的命令列表。在已被授予足够权限的服务器上使用ftp命令,可以执行许多日常的文件管理任务。
lftp-更好的ftp
ftp并不是唯一的命令行的FTP客户端。事实上,可供选择的还有不少。lftp就是另一种更好(也更流行)的替代品。其工作方式与ftp非常相似,同时加入了许多协议支持(包括HTTP)、下载故障重试、后台进程、路径名补全等便利性。
wget
wget是一款流行的命令行下载程序,它可用于Web和FTP网站下载文件,无论是单个文件、多个文件,还是整个网站都没问题。
命令如下:
wget address #下载address到当前工作目录
wget address destination #下载address到destination
下面演示如何下载linuxcommands.org的首页:
wget http://linuxcommands.org/index.php
输出结果如下:
通过wget命令提供的多种选项,能够实现递归下载,后台下载(允许注销后下载)、断点续传等功能。这些特征都写在了其质量最优的手册页中。
与远程主机的安全通信
类UNIX系统一直能够通过网络进行远程管理。在互联网普及之前有两个流行的远程登陆程序: rlogin和telnet。但是这两者与ftp有着相同致命的缺点:多有信息都是明文形式传输的,不适用于互联网时代。
ssh
一个名为安全外壳(Secure Shell, SSH)的全新协议诞生了。SSH解决了与远程主机通信的两个基本问题。
- 认证远程主机的身份是否属实(避免了“中间人”攻击)。
- 加密本地主机与远程主机之间的所有通信。
SSH由两部分组成:SSH服务器和SSH客户端。前者运行在远程主机,负责端口22(默认)上监听接入的连接;后者在本地主机中运行,用于同远程SSH服务器通信。
多数Linux自带OpenSSH。有些Linux发行版(如Red Hat)默认包含客户端和服务端安装包,有些Linux发行版(如 Ubuntu)仅提供客户端软件。要想让系统接受远程连接,就必须安装OpenSSH-server软件包,并进行配置运行,还必须允许TCP端口22接受接入的网络连接(如果系统运行了防火墙或在防火墙保护下)。
如果没有可供连接的远程主机,但是想要尝试一下安全通信,则可以在确保系统已安装了OpenSSH-server软件包的前提下,使用localhost作为远程主机名。如此一来,主机便会与自身建立连接。
连接远程SSH服务器的SSH客户端程序被称为ssh。其命令如下:
ssh remote-sys #通过SSH连接remote-sys
ssh remote-sys command #通过SSH连接remote-sys在remote-sys下执行command然后断开与remote-sys的连接。
ssh登陆后其操作是通过终端进行的对于windows是powershell,对于Ubuntu是bash shell,在其远程主机上有自己的目录,可以进行操作。
scp
在通过SSH与远程主机建立连接的过程中,涉及在本地主机与远程主机之间创建一条加密隧道。通常,该隧道用于将本地命令安全地传送到远程主机,并将结果安全地传送回来。
OpenSSH软件包中有两个程序,能够利用SSH加密隧道在网络上复制文件。其中一个是scp(secure copy),用法和我们熟悉的cp差不多。两者之间主要的差别在于scp命令的源路径或目的路径之前可以加上远程主机名和冒号。
scp命令如下:
scp remote-sys:filename #将remote-sys上的主目录文件filename复制到本地主机的当前工作目录
例如:如果远程主机账号与本地主机账号不一致,则需要在远程主机名之前加上用户名:
scp bob@remote-sys:document.tx
sfp
另一个SSH文件复制程序是sftp。顾名思义,它是ftp程序的安全版本。sftp与ftp大同小异,只是在传输信息时不是采用明文形式,而是使用了SSH加密隧道。相较于ftp而言,sftp的一个重要优势是不需要远程主机运行FTP服务器,只要SSH服务器就够了。
交互命令同ftp一样。
Linux发行版中的许多图形文件管理器都支持SSH文件传输协议(SSH File Transfer Protocol, SFTP)协议。无论是GNOME还是KDE,都可以在地址栏中输入以sftp://开头的URI,对存储在运行着SSH服务器的远程主机上的文件进行操作。