网络系统
摘要:这一章相当有用,我刚买了一台云服务器,相信本章内容将让我学到不少东西。Linux被用来创建各种各样的网络系统和装置,包括防火墙、路由器、服务器等等。
网络系统
本章要研究的命令包括用来监测网络和传输文件的命令,还有用来远程登录的ssh程序。本章会介绍:
- ping - 发送 ICMP ECHO_REQUEST 数据包到网络主机
- tracepath - 打印到一台网络主机的路由数据包
- netstat - 打印网络连接,路由表,接口统计数据,伪装连接,和多路广播成员
- ftp - 因特网文件传输程序
- wget - 非交互式网络下载器
- ssh - OpenSSH SSH 客户端(远程登录程序)
为了充分学习本章内容,假定读者已具备一定网络系统背景知识,熟悉IP地址、主机和域名、URI等术语。
检查和监测网络
即使不是root用户,检查网络性能和运作情况也是必要的。
ping
ping
命令发送一个叫做ICMP ECHO_REQUEST
的特殊的网络数据包到一台指定的主机。大多数接受这个包的网络设备会回复它,来允许网络连接验证。
出于网络安全原因,大多数网络设备可以配置为忽略这种数据包。
比如,我们ping
一下网站linuxcommand.org
:
xuxg@xuxg-ubuntu:~$ ping linuxcommand.org
PING linuxcommand.org (216.105.38.10) 56(84) bytes of data.
64 bytes from vhost.sourceforge.net (216.105.38.10): icmp_seq=1 ttl=48 time=241 ms
64 bytes from vhost.sourceforge.net (216.105.38.10): icmp_seq=2 ttl=48 time=249 ms
64 bytes from vhost.sourceforge.net (216.105.38.10): icmp_seq=3 ttl=48 time=245 ms
64 bytes from vhost.sourceforge.net (216.105.38.10): icmp_seq=4 ttl=48 time=245 ms
...(省略)
一旦启动,ping
命令会持续在特定的时间间隔内(默认是一秒)发送数据包,直到它被中断,按下组合键Ctrl-c
,中断这个命令之后,ping
打印出运行统计信息。一个正常工作的网络会报告零个数据包丢失。一个成功执行的ping
命令会意味着网络的各个部件(网卡,电缆,路由,网关)都处于正常的工作状态。
^C
--- linuxcommand.org ping statistics ---
7 packets transmitted, 7 received, 0% packet loss, time 6009ms
rtt min/avg/max/mdev = 245.887/247.532/250.393/1.602 ms
tracepath
tracepath
程序显示从本地到指定主机要经过的所有“跳数”的网络流量列表。例如,看一下到达slashdot.org
需要经过的路由:
xuxg@xuxg-ubuntu:~$ tracepath slashdot.org
1?: [LOCALHOST] pmtu 1500
1: _gateway 1.604ms
1: _gateway 2.241ms
2: _gateway 2.954ms pmtu 1480
...(省略)
netstat
netstat
程序被用来检查各种各样的网络设置和统计数据。使用-ie
选项,我们能够查看系统中的网络接口:
[root@alicloud ~]# netstat -ie
Kernel Interface table
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.31.187.31 netmask 255.255.240.0 broadcast 172.31.191.255
ether 00:16:3e:06:90:67 txqueuelen 1000 (Ethernet)
RX packets 209627 bytes 204941483 (195.4 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 112174 bytes 33673832 (32.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
这个例子我是在我的阿里云CentOS服务器上运行的,Ubuntu下没有安装这个命令。
在上述实例中,我们看到我们的测试系统有两个网络接口。第一个,叫做 eth0,是以太网接口,和第二个,叫做 lo,是内部回环网络接口,它是一个虚拟接口,系统用它来“自言自语”。
使用-r
选项会显示内核的网络路由表。这展示了系统是如何配置网络之间发送数据包的。
[root@alicloud ~]# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default gateway 0.0.0.0 UG 0 0 0 eth0
link-local 0.0.0.0 255.255.0.0 U 0 0 0 eth0
172.31.176.0 0.0.0.0 255.255.240.0 U 0 0 0 eth0
网络中传输文件
ftp
ftp
命令属于真正的“经典”程序之一,它的名字来源于其所使用的协议,就是文件传输协议。
FTP 被广泛地用来从因特网上下载文件。大多数,并不是所有的,网络浏览器都支持 FTP,你经常可以看到它们的 URI 以协议 ftp://开头。在出现网络浏览器之前,ftp 程序已经存在了。ftp 程序可用来与 FTP 服务器进行通信,FTP 服务器就是存储文件的计算机,这些文件能够通过网络下载和上传。
FTP(它的原始形式)并不是安全的,因为它会以明码形式发送帐号的姓名和密码。这就意味着这些数据没有加密,任何嗅探网络的人都能看到。由于此种原因,几乎因特网中所有 FTP服务器都是匿名的。一个匿名服务器能允许任何人使用注册名“anonymous”和无意义的密码登录系统。
在ftp>
提示符下,输入help
,会显示所支持命令的列表。使用 ftp
登录到一台授予了用户足够权限的服务器中,则可以执行很多普通的文件管理任务。虽然很笨拙,但它真能工作。
lftp - 更好的 ftp
ftp 并不是唯一的命令行形式的 FTP 客户端。实际上,还有很多。其中比较好(也更流行的)是 lftp 程序,由 Alexander Lukyanov 编写完成。虽然 lftp 工作起来与传统的 ftp 程序很相似,但是它带有额外的便捷特性,包括多协议支持(包括 HTTP),若下载失败会自动地重新下载,后台处理,用 tab 按键来补全路径名,还有很多。
wget
另一个流行的用来下载文件的命令行程序是 wget。若想从网络和 FTP 网站两者上都能下载数据,wget 是很有用处的。不只能下载单个文件,多个文件,甚至整个网站都能下载。
与远程主机安全通信
通过网络来远程操控类 Unix 的操作系统已经有很多年了。早些年,在因特网普遍推广之前,有一些受欢迎的程序被用来登录远程主机。它们是 rlogin 和 telnet 程序。然而这些程序,拥有和 ftp 程序一样的致命缺点;它们以明码形式来传输所有的交流信息(包括登录命令和密码)。这使它们完全不适合使用在因特网时代。
ssh
为了解决这个问题,开发了一款新的协议,叫做 SSH(Secure Shell)。SSH 解决了这两个基本的和远端主机安全交流的问题。首先,它要认证远端主机是否为它所知道的那台主机(这样就阻止了所谓的“中间人”的攻击),其次,它加密了本地与远程主机之间所有的通讯信息。
SSH 由两部分组成。SSH 服务端运行在远端主机上,在端口 22 上监听收到的外部连接,而SSH 客户端用在本地系统中,用来和远端服务器通信。
大多数 Linux 发行版自带一个提供 SSH 功能的软件包,叫做 OpenSSH,来自于 BSD 项目。一些发行版默认包含客户端和服务端两个软件包(例如 Red Hat),而另一些(比方说Ubuntu)则只提供客户端。为了能让系统接受远端的连接,它必须安装 OpenSSH-server 软件包,配置,运行它,并且(如果系统正在运行,或者系统在防火墙之后)它必须允许在 TCP 端口 22 上接收网络连接。
用来与远端 SSH 服务器相连接的 SSH 客户端程序,顺理成章,叫做 ssh。想要连接到名叫root@xxx.xxx.xx.xxx
的远端主机,我们可以这样使用 ssh 客户端程序:
xuxg@xuxg-ubuntu:~$ ssh root@xxx.xxx.xx.xxx
第一次尝试连接,提示信息表明远端主机的真实性不能确立。这是因为客户端程序以前从没有看到过这个远端主机。为了接受远端主机的身份验证凭据,输入“yes”。一旦建立了连接,会提示用户输入他或她的密码:
root@xxx.xxx.xx.xxx's password:
成功地输入密码之后,我们会接收到远端系统的 shell 提示符:
Welcome to Alibaba Cloud Elastic Compute Service !
[root@alicloud ~]#
远端 shell 会话一直存在,直到用户输入 exit 命令后,则关闭了远程连接。这时候,本地的shell 会话恢复,本地 shell 提示符重新出现。
我们在远端系统中执行ls
命令,并把命令输出重定向到本地系统中的一个文件里面。
xuxg@xuxg-ubuntu:~$ ssh root@xxx.xxx.xx.xxx 'ls' > dirlist.txt
root@xxx.xxx.xx.xxx's password:
注意,上面的例子中使用了单引号。这样做是因为我们不想路径名展开操作在本地执行,而希望它在远端系统中被执行。同样地,如果我们想要把输出结果重定向到远端主机的文件中,我们可以把重定向操作符和文件名都放到单引号里面。
xuxg@xuxg-ubuntu:~$ ssh root@xxx.xxx.xx.xxx 'ls > dirlist.txt'
scp 和 sftp
OpenSSH 软件包也包含两个程序,它们可以利用 SSH 加密通道在网络间复制文件。第一个,scp(安全复制)被用来复制文件,与熟悉的 cp 程序非常相似。最显著的区别就是源或者目标路径名要以远端主机的名字,后跟一个冒号字符开头。
例如,如果我们想要从远端系统的家目录下复制文档 document.txt
,到我们本地系统的当前工作目录下,可以这样操作:
xuxg@xuxg-ubuntu:~$ scp root@xxx.xxx.xx.xxx:document.txt .
root@xxx.xxx.xx.xxx's password:
document.txt 100% 0 0.0KB/s 00:00
第二个 SSH 文件复制程序是 sftp,顾名思义,它是 ftp 程序的安全替代品。sftp 工作起来与我们之前使用的 ftp 程序很相似;然而,它不用明码形式来传递数据,它使用加密的 SSH 通道。sftp 有一个重要特性强于传统的 ftp 命令,就是 sftp 不需要远端系统中运行 FTP 服务端。它仅仅需要 SSH 服务端。这意味着任何一台能用 SSH 客户端连接的远端机器,也可当作类似于 FTP 的服务器来使用。这里是一个样本会话:
xuxg@xuxg-ubuntu:~$ sftp root@xxx.xxx.xx.xxx
root@xxx.xxx.xx.xxx's password:
Connected to 118.190.25.204.
sftp> ls
GeekPandaBlog document.txt
sftp> lcd Desktop
sftp> lpwd
Local working directory: /home/xuxg/Desktop
sftp> get document.txt
Fetching /root/document.txt to document.txt
sftp> ls
GeekPandaBlog document.txt
sftp> lls
document.txt wps-office-prometheus.desktop
sftp> bye
个人觉得sftp非常好用,它可以在本地和远端间随时切换。比如运行
ls
就是显示远端当前目录下的内容,lls
就是本地当前目录下的内容;pwd
是远端当前工作目录,lpwd
是本地当前工作目录。真是哇塞啊!