23.5.1 ping
检查远程系统的联机状态。ping 指令会送出 ICMP 封包到指定的主机,我们可以藉此来检查网络联机品质。
常用参数如下:
参数 | 说明 |
-c count | 指定要计算 count 次。 |
-s size | 指定每个封包大小为 size。 |
-t timeout | 指定 time out 时间。 |
-I interface | 如果目标主机地址是广播地址,而且我们有多个网接口,可以指定要使用哪一个接口。 |
例如我们要看 www.freebsd.org 的联机品质:
$ ping www.freebsd.org
PING freefall.freebsd.org (216.136.204.21): 56 data bytes
64 bytes from 216.136.204.21: icmp_seq=0 ttl=54 time=458.986 ms
64 bytes from 216.136.204.21: icmp_seq=1 ttl=54 time=502.258 ms
64 bytes from 216.136.204.21: icmp_seq=2 ttl=54 time=491.489 ms
^C
--- freefall.freebsd.org ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 458.986/484.244/502.258/18.393 ms
23.5.2 ifconfig
设定或检查网络接口。我们可以使用 ifconfig 来显示所有的网络接口,如果使用参数 -u 表示显示使用中的网络接口,而 -d 则是非运作中的接口。
我们也可以使用 ifconfig 来让网络接口运作或停用。
用法:
ifconfig [down|up] interface
假设我们要让网络卡 vr0 停用:
# ifconfig vr0 down
我们也可以使用 ifconfig 来设定网络上的 IP 地址。假设要设定 IP 为 192.168.0.1,而子网掩码为 255.255.255.0:
# ifconfig vr0 192.168.0.1 netmask 255.255.255.0
接着再使用 ifconfig 将 vr0 启用:
# ifconfig vr0 up
23.5.3 arp
显示 arp 地址。例如我们要显示 192.168.0.2 这台机器的网络卡号:
$ arp 192.168.0.1
23.5.4 traceroute
追踪由本机到某台主机所使用的路径。当我们使用 ping 来检查网络联机状况时,如果发现无法联机,我们可以使用 traceroute 来检查到底是网络上的哪一台主机有问题。
$ traceroute www.freebsd.org
23.5.5 netstat
显示网络状况。我们可以使用 netstat 来显示目前的联机状况。例如:
$ netstat -a
Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address Foreign Address (state)
tcp4 0 20 www.ssh 198.z27z4z49.1780 ESTABLISHED
tcp4 0 0 *.http *.* LISTEN
tcp4 0 0 *.https *.* LISTEN
tcp4 0 0 *.smtp *.* LISTEN
tcp4 0 0 *.ssh *.* LISTEN
tcp4 0 0 *.pop3 *.* LISTEN
udp4 0 0 *.syslog *.*
udp6 0 0 *.syslog *.*
Active UNIX domain sockets
Address Type Recv-Q Send-Q Inode Conn Refs Nextref Addr
cd864e00 dgram 0 0 0 cd84ef0 0 cd864fc0
cd864fc0 dgram 0 0 0 cd84ef0 0 0
我们可以由上面的结果看到目前有一个使用者正使用 ssh 连到我们的网站。经由上表,我们可以看出我们所提供的服务有哪些,目前的使用情形如何。如果我们希望 Foreign Address 直接显示 IP ,可以使用参数 -n。
我们也可以使用参数 -i 来查看网络接口的使用情形:
$ netstat -ai
Name Mtu Network Address Ipkts Ierrs Opkts Oerrs Coll
dc0 1500 00:80:c8:f6:b2:66 68890922 15997 8370716 1256 60296
33:33:c0:f6:78:e9
dc0 1500 fe80:1::280 fe80:1::281:c8ff: 0 - 0 - -
ff02:1::2:c1f7:78e9(refs: 1)
ff02:1::1 (refs: 1)
ff02:1::1:ffe7:b266(refs: 1)
lp0* 1500 0 0 0 0 0
lo0 16384 34050 0 34050 0 0
我们简单说明一下各字段所代表的意义:
23.5.6 sockstat
列出开启中的 socket。
$ sockstat
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
root telnetd 52897 0 tcp4 192.168.0.1:23 192.168.0.2:1969
root sshd 34063 4 tcp4 *:22 *:*
nobody httpd 11670 16 tcp4 *:443 *:*
nobody httpd 11670 17 tcp4 *:80 *:*
root sendmail 117 4 tcp4 *:25 *:*
root sendmail 117 5 tcp4 *:587 *:*
root inetd 109 4 tcp4 *:21 *:*
USER COMMAND PID FD PROTO ADDRESS
mysql mysqld 170 6 stream /tmp/mysql.sock
root sendmail 117 3 dgram syslogd[100]:3
root syslogd 100 3 dgram /var/run/log
每个字段所代表的意义如下:
23.5.7 mail
邮件处理程序。古老的 UNIX 邮件处理程序,这个程序对于不熟悉的人使用起来可能有点困难。但是这是在每个 UNIX 系统中都会有的程序,有时在没有其它选择的状况下,我们还是要使用它,至少要知道如何用它来收发信件。
假设我们要寄信给本机的 root:
$ mail root
如果我们要寄信给非本机的使用者,可以使用的收件人格式如下:
执行了 mail 之后,程序会先要求我们输入邮件主旨,输入后就可以开始打本文了。当完成本文的编辑之后,可以按 Ctrl+D 来将信件送出,或是按二次 Ctrl+C 取消。
我们也可以在执行 mail 时加上参数 -s "subject" 来指定主旨:
$ mail -s"hi, my friend" [email protected]
如果我们想要将一个文字文件的内容当做本文送出,例如,我们可以先编辑一个文字文件 content.txt,接着使用下列方式:
$ mail -s "hi, my friend" [email protected] < content.txt
说完了寄信,我们来了解一下如何收信。我们可以打 mail 来收信,如果是 root 还可以使用 mail -u user 来收使用者 user 的信件。
$ mail
"/var/mail/root": 12 messages 10 unread
>U 1 jack Fri Feb 22 03:02 42/690 "Hi friend"
U 2 jack Fri Feb 22 03:02 74/2620 "see you tomorrow"
U 3 [email protected] Sat Feb 23 03:06 570/33527 "don't forget"
&
最后面出现的 & 为 mail 程序命令列的提示符号,在第一封信件开头有一个符号 ">" 表示目前作用中的信件。我们可以直接输入邮件编号来读取信件。另外,我们也可以输入下列指令:
指令 | 说明 |
h | 列出所有信件。 |
r | 回复目前作用中的信件。 |
n | 读取下一封信件。 |
p | 读取前一封信件。 |
pre [mail number] | 保留编号为 mail number 的信件在系统的 mailbox中 (/var/mail/)。程序 mail 对于己读取的信件,预设会将它搬到使用者家目录下的 mbox 中。我们如果日后还想要使用 pop3 来收该信件,就必须使用 pre 将该信件保留在系统的邮件目录中。 |
d | 删除作用中的信件。 |
z | 显示下一页信件列表。 |
q | 离开 mail。 |
23.5.8 telnnet
使用终端机远程登入网络上的主机。例如:
$ telnet bbs.mgt.ncu.edu.tw
如果在 telnet 时要能输入中文,必须加上参数 -8:
$ telnet -8 bbs.mgt.ncu.edu.tw
23.5.9 ssh
使用 telnet 并未加数据加密,我们很容易在不知不觉中泄露信息。如果要登入的主机有提供 ssh 登入的话,最好使用 ssh。
用法:
ssh username@hostname
ssh hostname
例如:
$ ssh [email protected]
$ ssh [email protected]
$ ssh mydomain.com
只打 hostname 而没有使用者名称,登入名称会是你目前所用的使用者名称。
如果所联机的主机是第一次联机会出现下列一堆东西,打 "yes" 三个字即可:
The authenticity of host '140.115.77.11' can't be established.
RSA key fingerprint is 13:93:8a:61:31:df:41:3f:7a:0a:77:ad:7e:49:e7:3f.
Are you sure you want to continue connecting (yes/no)? yes
23.5.10 ftp
档案传输程序。如果要登入的主机允许昵名登入,我们使用参数 -a 来自动登入。
$ ftp -a freebsd.csie.nctu.edu.tw
进入 ftp 之后,会出现命令的提示列。我们可以输入以下的指令:
指令 | 说明 |
help 或 ? | 显示可以使用的指令。 |
ls | 列出远程所在目录的档案。 |
pwd | 显示远程所目录位置。 |
cd dir | 进入远程的 dir 目录。 |
get file | 从远程取回 file 档案。 |
put file | 将本地端的 file 档案上传到远程机器。 |
acsii | 使用文字模式传送档案。 |
binary | 使用二进制模式传送档案。 |
bye | 结束 ftp。 |
mget *.tgz | 取回远程所有名称为 *.tgz 的档案。 |
mput *.tgz | 上传本地所有 *.tgz 的档案。 |
!ls | 显示本地所在目录下的档案。 |
lpwd 或 !pwd | 显示本地所在目录。 |
lcd [dir] | 切换本地所在目录。 |
23.5.11 nslookup
网络主机名称查询。如果我们要查询 www.freebsd.org 所对映的 IP,最简单的用法是:
$ nslookup www.freebsd.org
我们也可以在上述指令最后面加上要查询的 DNS 主机:
$ nslookup www.freebsd.org dns.hinet.net
我们也可以使用 IP 来进入反查:
$ nslookup 216.136.204.21
23.5.12 dig
是另一个功能强大的主机名称查询工具。简单的用法如下:
$ dig -x 216.136.204.21
$ dig www.freebsd.org
23.5.13 tcpdump
显示或记录网络封包。如果要使用 tcpdump,在核心中必须要有 Berkeley packet filter,而且有 /dev/bpf*。如果没有请在核心设定中加入下面这一行,并重新编辑核心:
pseudo-device bpf |
执行 tcpdump 后,它会打开指定接口的 promiscuous mode (接口必须支持才有用)。所谓的 promiscuous mode(杂乱模式) 是指不管是否和本机有关的封包都接收进来,要达到这样的效果,必须藉由 bpf 的支持。
我们可以使用 tcpdump 来观察到达某一个网络接口的封包。例如我们要监看接口 vr0 的封包:
# tcpdump -i vr0
如果要结束直接按 Ctrl+C 即可。 如果限制封包数量,可以使用参数 -c。我们也可以使用参数 -w 来将捕捉到的封包存成档案,在这里我们存成 dump 这个档案:
# tcpdump -c 20 -i vr0 -w dump
使用参数 -r 可以读取储存的封包数据:
# tcpdump -r dump
为了控制 tcpdump 能 dump 我们想要的封包,我们还可以在指令最后加上一些 expression 来控制封包的记录。关于 expression 的用法请 man tcpdump。
另外介绍一个好用的分析工具 tcpshow, 我们可以使用 ports 来安装。
# cd /usr/ports/net/tcpshow
# make install clean
接着就可以使用 tcpshow 来分析我们储存的封包内容:
# tcpshow <dump | more
---------------------------------------------------------------
Packet 8
TIME: 04:53:10.938750 (0.011744)
LINK: 00:80:2D:BB:65:38 -> 00:50:AA:00:DC:DD type=IP
IP: tw -> 189 hlen=20 TOS=00 dgramlen=44 id=4353
MF/DF=0/1 frag=0 TTL=52 proto=TCP cksum=C56B
TCP: port http -> 2451 seq=3298970558 ack=2899053999
hlen=24 (data=0) UAPRSF=010010 wnd=65535 cksum=8549 urg=0
DATA:
---------------------------------------------------------------
我们简单的说明一下这个封包的内容。第一部份是时间 TIME。
第二行是 LINK,显示了来源 -> 目的地的网络卡号,另外经由 type=IP,我们知道这是一个 Ethernet_II 的 frame。
第三部份 IP,tw -> 189 是来源及目的地的地址。hlen 是 header length 大小是 20 bytes,而整个 IP 封包 (dgramlen) 的大小是 44 bytes。
第四部份是 TCP,来源是的 port 是 http (内定是 80),而目的地的 port 是 2451。接下来是 TCP 封包的 sequence number 及 acknowledgement 编号。TCP 的 header length 是 24,加上 IP 的 header 20 长度刚好是 44,和 dgramlen 的长度一样,这个封包应该没有破损。
最后,这个封包并没有包含其它的数据。