分类: LINUX
2016-08-25 20:02:33
原文地址:Linux常用的网络命令 作者:prince520
任何时刻如果你想要做好自己的网络参数设置,包括IP参数、路由参数与无线网络等,就得要了解下面这些相关的命令才行。其中Route及ip这两条命令是比较重要的。当然,比较早期的用法,我们都是使用ifconfig的。
· ifconfig:查询、设置网卡与IP网段等相关参数。
· ifup、ifdown:这两个文件是Script,通过更简单的方式来启动网络接口。
· Route:查询、设置路由表(Route table)。
· ip:复合式的命令,可以直接修改上述命令提到的功能。
ifconfig、ifup、ifdown
这3个命令的用途都是启动网络接口,不过,ifup与ifdown仅就 /etc/sysconfig/network- scripts内的ifcfg-ethx(x为数字)进行启动或关闭的操作,并不能直接修改网络参数,除非手动调整ifcfg-ethx文件才行。至于ifconfig则可以直接手动给予某个接口IP或调整其网络参数。下面我们就分别来谈一谈。
1. ifconfig
ifconfig主要是可以手动启动、观察与修改网络接口的相关参数,可以修改的参数很多,包括IP参数以及MTU等都可以修改,它的语法如下:
[root@linux ~]# ifconfig {interface} {up|down} <== 观察与启动接口 [root@linux ~]# ifconfig interface {options} <== 设置与修改接口 参数: Interface,网卡接口代号,包括 eth0、eth1、ppp0 等 Options,可以接的参数,包括如下: Up或down,启动 (up) 或关闭 (down) 该网络接口(不涉及任何参数) mtu,可以设置不同的 MTU 数值,例如MTU 1500 (单位为 byte) netmask,就是子屏蔽网络 broadcast,就是广播地址 范例: 范例一:观察所有的网络接口(直接输入 ifconfig) [root@linux ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0F:EA:A3:06:A2 inet addr:192.168.10.100 Bcast:192.168.10.255 Mask:255.255.255.0 inet6 addr: fe80::20f:eaff:fe73:682/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:3439 errors:0 dropped:0 overruns:0 frame:0 TX packets:2735 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:646935 (631.7 KiB) TX bytes:562313 (549.1 KiB) Interrupt:209 Memory:fb000000-0 |
一般来说,直接输入ifconfig就会列出目前已经被启动的卡,不论这个卡是否有设置IP,都会被显示出来。而如果是输入ifconfig eth0,则会显示出这个接口的相关数据,而不管该接口是否启动。所以,如果你想要知道某个网卡的Hardware Address,直接输入“ifconfig"网络接口代号"”即可。至于上述代码中出现的各项数据是这样的(数据排列由上而下、由左而右)。
· eth0:网卡的代号,也有lo这个loopback。
· HWaddr:网卡的硬件地址,习惯称为MAC。
· inet addr:IPv4的IP地址,后续的Bcase、Mask分别代表的是Broadcast与Netmask。
· inet6 addr:是IPv6的版本的IP,我们没有使用,所以略过。
· RX:那一行代表的是网络由启动到目前为止的数据包接收情况,packets代表数据包数、errors代表数据包发生错误的数量、dropped代表数据包由于有问题而遭丢弃的数量等。
· TX:与RX相反,为网络由启动到目前为止的传送情况。
· collisions:代表数据包碰撞的情况,如果发生太多次,表示你的网络状况不太好。
· txqueuelen:代表用来传输数据的缓冲区的储存长度。
· RX Bytes、TX Bytes:总传送、接收的字节总量。
· Interrupt、Memory:网卡硬件的数据,IRQ岔断与内存地址。
通过观察上述的资料,大致上可以了解到你的网络情况,尤其是RX、TX内的error数量,以及是否发生严重的collision情况,都是需要注意的。
范例二:暂时修改网络接口 [root@linux ~]# ifconfig eth0 192.168.100.100 # 如果不加任何其他参数,则系统会依照该 IP 所在的 class 范围, # 自动地计算出 netmask 以及 network, broadcast 等 IP 参数 [root@linux ~]# ifconfig eth0 192.168.100.100 netmask 255.255.255.128 \ > mtu 8000 # 设置网络接口,同时设置 MTU 的数值 [root@linux ~]# ifconfig eth0 MTU 9000 # 仅修改该接口的 MTU 数值,其他的保持不动 [root@linux ~]# ifconfig eth0:0 192.168.50.50 # 仔细看那个接口, eth0:0 。那就是在该网络接口上,再仿真一个网络接口, # 亦即是在一个网卡上面设置多个 IP 的意思啦 [root@linux ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0F:EA:A3:06:A2 inet addr:192.168.10.100 Bcast:192.168.10.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:3669 errors:0 dropped:0 overruns:0 frame:0 TX packets:2892 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:667547 (651.9 KiB) TX bytes:584799 (571.0 KiB) Interrupt:209 Memory:fb000000-0 eth0:0 Link encap:Ethernet HWaddr 00:0F:EA:A3:06:A2 inet addr:192.168.200.2 Bcast:192.168.200.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:209 Memory:fb000000-0 # 仔细看,是否与硬件有关的信息都相同。没错。因为是同一个网卡。 [root@linux ~]# ifconfig eth0:0 down # 关掉 eth0:0 这个接口。如果想要启动 eth1 ,并且不设置任何网络参数 # ifconfig eth1 up 就可以实现 [root@linux ~]# /etc/init.d/network restart # 刚刚设置的数据全部失效,会以 ifcfg-ethx 的设置为主 |
使用ifconfig可以暂时用手动来设置或修改某个适配卡的相关功能,并且也可以通过eth0:0这种虚拟的网络接口来设置一张网卡上面的多个IP。手动的方式是比较简单。而且设置错误也没有关系,因为我们可以利用 /etc/init.d/network restart来重新启动整个网络接口,那么之前手动的设置数据会全部失效。另外,要启动某个网络接口,但又不让它具有IP参数时,直接给它ifconfig eth0 up即可。这个操作经常在无线网卡当中进行,因为我们需要启动无线网卡让它去检测AP存在与否。
2. ifup、ifdown
实时地手动修改一些网络接口参数,可以利用ifconfig来实现,如果是要直接以配置文件,亦即是在 /etc/sysconfig/network-scripts里面的ifcfg-ethx等文件的设置参数来启动的话,那就得要通过ifdown或ifup来实现了。
[root@linux ~]# ifup {interface} [root@linux ~]# ifdown {interface} [root@linux ~]# ifup eth0 |
ifup与ifdown真是太简单了。这两个程序其实是script而已,它会直接到 /etc/ sysconfig/network-scripts目录下搜索对应的配置文件,例如ifup eth0,它会找出ifcfg-eth0这个文件的内容,然后加以设置。关于ifcfg-eth0的设置请参考前一章连上Internet的说明。
不过,由于这两个程序主要是搜索设置文件(ifcfg-ethx)来进行启动与关闭的,所以在使用前请确定ifcfg-ethx是否真的存在于正确的目录内,否则会启动失败。另外,如果以ifconfig eth0来设置或者是修改了网络接口后,就无法再以ifdown eth0的方式来关闭了。因为ifdown会分析比较目前的网络参数与ifcfg-eth0是否相符,不符的话,就会放弃这次操作。因此,使用ifconfig修改完毕后,应该要以ifconfig eth0 down才能够关闭该接口。
路由修改route
我们在网络基础的时候谈过关于路由的问题,两台主机之间一定要有路由才能够互通TCP/IP的协议,否则就无法进行联机。一般来说,只要有网络接口,该接口就会产生一个路由,例如,在鸟哥实验室内部的主机有一个eth0及lo,所以:
[root@linux ~]# route [-nee] [root@linux ~]# route add [-net|-host] [网段或主机] netmask [mask] [gw|dev] [root@linux ~]# route del [-net|-host] [网段或主机] netmask [mask] [gw|dev] 观察的参数: -n,不要使用通信协议或主机名称,直接使用 IP 或 Port Number; -ee,使用更详细的信息来显示; 增加 (add) 与删除 (del) 路由的相关参数; -net,表示后面接的路由为一个网段; -host,表示后面接的为连接到单台主机的路由; Netmask,与网段有关,可以设置 netmask 决定网段的大小; Gw,gateway 的简写,后续接的是 IP 的数值,与 dev 不同; Dev,如果只是要指定由哪一块网卡联机出去,则使用这个设置,后面接 eth0 等。 范例一:单纯的观察路由状态 [root@linux ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0 0.0.0.0 192.168.10.30 0.0.0.0 UG 0 0 0 eth0 [root@linux ~]# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.10.0 * 255.255.255.0 U 0 0 0 eth0 169.254.0.0 * 255.255.0.0 U 0 0 0 eth0 default Server.cluster 0.0.0.0 UG 0 0 0 eth0 |
在上面的例子中仔细观察route与route -n的输出结果,你可以发现有加-n参数的主要是显示出IP,至于使用route,显示的则是“主机名称”。也就是说,在默认的情况下,route会去找出该IP的主机名称,如果找不到呢?就会显示得迟钝(有点慢),所以说,鸟哥通常都直接使用route-n了。由上面看起来,我们也知道default = 0.0.0.0/0.0.0.0,而上面的信息有哪些你需要知道的呢?
· Destination、Genmask:这两个术语就分别是Network与Netmask了。所以这两个东西就组合成为一个完整的网段了。
· Gateway:该网段是通过哪个Gateway连接出去的?如果显示0.0.0.0表示该路由是直接由本机传送,亦即可以通过局域网的MAC直接传输;如果有显示IP的话,表示该路由需要经过路由器(网关)的帮忙才能够传送出去。
· Flags:总共有多个标记,代表的意义如下。
Ø U(route is up):该路由是启动的。
Ø H(target is a host):目标是一台主机(IP)而非网段。
Ø G(use gateway):需要通过外部的主机来传递数据包。
Ø R(reinstate route for dynamic routing):使用动态路由时,恢复路由信息的标记。
Ø D(dynamically installed by daemon or redirect):已经由服务器或转port功能设置为动态路由。
Ø M(modified from routing daemon or redirect):路由已经被修改了。
Ø!(reject route):这个路由将不会被接受(用来阻止不安全的网段)。
· Iface:这个路由传递数据包的接口。
此外,观察一下上面的路由排列顺序,依序是由小网段(192.168.10.0/24是Class C),逐渐到大网段(169.254.0.0/16 是Class B),最后则是默认路由(0.0.0.0/0.0.0.0)。然后当我们要判断某个网络数据包应该如何传送的时候,该数据包会经由这个路由的过程来判断。例如,我上头仅有三个路由,若我有一个传往192.168.10.20的数据包要传递,那首先会找192.168.10.0/24这个网段的路由,找到了,就直接由eth0传送出去。
如果是传送到Yahoo的主机呢?Yahoo的主机IP是202.43.195.52,我通过判断不是192.168.10.0/24,也不是169.254.0.0/16,结果到达0/0时,传出去了,通过eth0将数据包传给192.168.10.30那台Gateway主机。所以说,路由是有顺序的。
因此当你重复设置多个同样的路由时,例如,在你的主机上的两张网卡设置为相同网段的IP时,会出现什么情况?会出现如下的情况:
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 192.168.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 |
也就是说,由于路由是依照顺序来排列与传送的,所以不论数据包是由哪个接口(eth0、eth1)所接收,都会由上述的eth0传送出去,所以,在一台主机上面设置两个相同网段的IP本身没有什么意义。多此一举。除非是类似虚拟主机(Xen、VMware等软件)所架设的多主机,才会有这个必要。
范例二:路由的增加与删除 [root@linux ~]# route del -net 169.254.0.0 netmask 255.255.0.0 dev eth0 # 上面这个操作可以删除掉 169.254.0.0/16 这个网段 # 请注意,在删除的时候,需要将路由表上面出现的信息都写入 # 包括netmask、dev 等参数 [root@linux ~]# route add -net 192.168.100.0 \ > netmask 255.255.255.0 dev eth0 # 通过 route add 来增加一个路由。请注意,这个路由必须能够与你互通 # 例如,如果我下达下面的命令就会显示错误: # route add -net 192.168.200.0 netmask 255.255.255.0 gw 192.168.200.254 # 因为我的环境内仅有 192.168.10.100 这个 IP ,所以不能与 192.168.200.254 # 这个网段直接使用 MAC 互通 [root@linux ~]# route add default gw 192.168.10.30 # 增加默认路由的方法。请注意,只要有一个默认路由就够了 # 在这个地方如果你随便设置后,记得使用下面的命令重新设置你的网络 # /etc/init.d/network restart |
这里的ip是个命令,不是那个TCP/IP的IP。这个ip命令的功能可多了。基本上,它就是集合了ifconfig与route这两个命令了,不过ip可以实现的功能却又多得多,真是个相当厉害的命令。如果你有兴趣的话,请自行vi /sbin/ifup,就知道整个ifup就是利用ip这个命令来实现的。好了,如何使用呢?让我们来看看。
[root@linux ~]# ip [option] [操作] [命令] 参数: Option,设置的参数,主要有: -s,显示出该设备的统计数据(statistics),例如总接受数据包数等; 操作,亦即是可以针对哪些网络参数进行操作,包括有: Link,关于设备(device) 的相关设置,包括MTU、MAC 地址等等 addr/address,关于额外的 IP 协议,例如多 IP 的实现等等; route,与路由有关的相关设置 |
由上面的语法我们可以知道,ip除了可以设置一些基本的网络参数之外,还能够进行额外的IP协议,包括多IP的实现,真是太完美了。下面我们就分3个部分(link、addr、route)来介绍这个ip命令吧。
1. 关于设备接口(device)的相关设置:ip link
ip link可以设置与设备(device)有关的相关设置,包括MTU以及该网络接口的MAC等,当然也可以启动(up)或关闭(down)某个网络接口了。整个语法是这样的:
[root@linux ~]# ip [-s] link show <== 单纯的查阅该设备相关的信息 [root@linux ~]# ip link set [device] [操作与参数] 参数: Show,仅显示出这个设备的相关内容,如果加上 -s 会显示更多统计数据 Set,可以开始设置项目, device 指的是 eth0、eth1 等等接口代号 操作与参数,包括有下面的这些操作 up|down,启动 (up) 或关闭 (down) 某个接口,其他参数使用默认的以太网 Address,如果这个设备可以更改 MAC 的话,用这个参数修改 Name,给予这个设备一个特殊的名字 Mtu,就是最大传输单元 范例一:显示出所有的接口信息 [root@linux ~]# ip link show 1: lo: |
使用ip link show可以显示出整个设备接口的硬件相关信息,如上所示,包括网卡地址(MAC)、MTU等,比较有趣的应该是那个sit0的接口了,那个sit0的接口是用在IPv4及IPv6的数据包转换上的,对于我们仅使用IPv4的网络是没有作用的。lo及sit0都是主机内部所自行设置的。而如果加上 -s的参数后,则这个网卡的相关统计信息就会被列出来,包括接收(RX)及传送(TX)的数据包数量等,详细的内容与ifconfig输出的结果是相同的。
范例二:启动、关闭与设置设备的相关信息 [root@linux ~]# ip link set eth0 up # 启动 eth0 这个设备接口。 [root@linux ~]# ip link set eth0 down # 就关闭啊。简单得要命 [root@linux ~]# ip link set eth0 mtu 1000 # 更改 MTU 的值,实现 1000 bytes,单位就是 bytes |
使用ifconfig也可以更新网卡的MTU,没什么不一样的地方,不过,如果是要更改网卡代号、MAC地址的信息的话,那可就得使用ip了。不过,设置前得要先关闭该网卡,否则会不成功。如下所示:
范例三:修改网卡代号、MAC 等参数 [root@linux ~]# ip link set eth0 name vbird SIOCSIFNAME: Device or resource busy # 因为该设备目前是启动的,所以不能这样设置。你应该这样做: [root@linux ~]# ip link set eth0 down <==关闭接口 [root@linux ~]# ip link set eth0 name vbird <==重新设置 [root@linux ~]# ip link show <==观察一下 2. vbird: |
在这个设备的硬件相关信息设置上面,包括MTU、MAC以及传输的模式等,都可以在这里设置。有趣的是那个address的项目后面接的可是硬件地址(MAC)而不是IP。很容易搞错。切记切记。更多的硬件参数可以使用man ip查阅一下与ip link有关的设置。
2. 关于额外的IP相关设置:ip address
如果说ip link是与OSI七层协议的第二层数据链路层有关的话,那么IP address(IP addr)就是与第三层网络层有关的参数了。主要是在设置与IP有关的各项参数,包括netmask、broadcast等。
[root@linux ~]# ip address show <==就是查阅 IP 参数 [root@linux ~]# ip address [add|del] [IP参数] [dev 设备名] [相关参数] 参数: Show,单纯的显示出接口的 IP 信息 add|del,进行相关参数的增加 (add) 或删除 (del) 设置,主要有: IP 参数,主要就是网段的设置,例如 192.168.100.100/24 之类的设置 dev,这个 IP 参数所要设置的接口,例如 eth0、eth1 等 相关参数,主要有下面这些: broadcast,设置广播地址,如果设置值是 + 表示「让系统自动计算」 Label,亦即是这个设备的别名,例如 eth0:0 就是了 scope,这个接口的领域,通常是这几个大类 global,允许来自所有来源的联机 site,仅支持 IPv6 ,仅允许本主机的联机 link,仅允许本设备自我联机 host,仅允许本主机内部的联机 所以当然是使用 global 了。默认也是 global 范例一:显示出所有的接口之 IP 参数: [root@linux ~]# ip address show 1: lo: |
看到上面那个特殊的字体吗?没错,那就是IP参数,也是ip address最主要的功能。下面我们进一步来新增虚拟的网络接口看看:
范例二:新增一个接口,名称假设为 eth0:vbird [root@linux ~]# ip address add 192.168.50.50/24 broadcast + \ > dev eth0 label eth0:vbird [root@linux ~]# ip address show eth0 2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:40:d0:13:c3:46 brd ff:ff:ff:ff:ff:ff inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0 inet 192.168.50.50/24 brd 192.168.50.255 scope global eth0:vbird inet6 fe80::240:d0ff:fe13:c346/64 scope link valid_lft forever preferred_lft forever # 看到上面的特殊字体了吧?多出了一行新的接口,且名称是 eth0:vbird # 至于那个 broadcast + 也可以写成 broadcast 192.168.50.255 [root@linux ~]# ifconfig eth0:vbir Link encap:Ethernet HWaddr 00:40:D0:13:C3:46 inet addr:192.168.50.50 Bcast:192.168.50.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:5 Base address:0x3e00 # 如果使用 ifconfig 就能够看到这个怪东西 范例三:将刚才的接口删除 [root@linux ~]# ip address del 192.168.50.50/24 dev eth0 # 删除就比较简单 |
3. 关于路由的相关设置:ip route
这个项目当然就是路由的观察与设置了。事实上,ip route的功能几乎与route命令差不多,但是,它还可以进行额外的参数设计,例如MTU的规划等,功能相当强大。
[root@linux ~]# ip route show <==简单的显示出路由的设置 [root@linux ~]# ip route [add|del] [IP或网段] [via gateway] [dev 设备] 参数: Show,简单的显示出路由表,也可以使用 list add|del,增加 (add) 或删除 (del) 路由的意思 IP或网段,可使用 192.168.50.0/24 之类的网段或者是单纯的 IP Via,从那个 gateway 出去,不一定需要 Dev,由那个设备连出去,这就需要了 Mtu,可以额外的设置 MTU 的数值 范例一:显示出目前的路由资料 [root@linux ~]# ip route show 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.2 169.254.0.0/16 dev eth1 scope link default via 192.168.1.254 dev eth1 |
如上述代码所示,最简单的功能就是显示出目前的路由信息,其实跟route命令相同,只是需要注意几个小细节:
· proto:此路由的路由协议,主要有Redirect、Kernel、Boot、Static、Ra等,其中Kernel指的是直接由核心判断自动设置。
· scope:路由的范围,主要是link,即是与本设备有关的直接联机。
再来看一下如何进行路由的增加与删除吧。
范例二:增加路由,主要是本机直接可沟通的网段 [root@linux ~]# ip route add 192.168.5.0/24 dev eth0 # 针对本机直接沟通的网段设置好路由,不需要通过外部的路由器 [root@linux ~]# ip route show 192.168.5.0/24 dev eth0 scope link ……以下省略…… 范例三:增加可以通往外部的路由,需通过 router [root@linux ~]# ip route add 192.168.10.0/24 via 192.168.5.100 dev eth0 [root@linux ~]# ip route show 192.168.5.0/24 dev eth0 scope link ……其他省略…… 192.168.10.0/24 via 192.168.5.100 dev eth0 # 仔细看,因为我有 192.168.5.0/24 的路由存在 (我的网卡直接联系), # 所以才可以将 192.168.10.0/24 的路由丢给 192.168.5.100 # 那台主机来帮忙传递。与之前提到的 route 命令是一样的限制。 范例四:增加默认路由 [root@linux ~]# ip route add default via 192.168.1.2 dev eth0 # 那个 192.168.1.2 就是我的默认路由器 (gateway) 的意思 # 真的记得,只要一个默认路由就 OK 。 范例五:删除路由 [root@linux ~]# ip route del 192.168.10.0/24 [root@linux ~]# ip route del 192.168.5.0/24 |
事实上,这个ip的命令实在是太博大精深了。刚接触Linux网络的朋友,可能会有点晕,没有关系。你先会使用ifconfig、ifup、ifdown与route即可,等以后有了经验之后,再继续回来用ip吧。有兴趣的话,也可以自行参考ethtool命令(man ethtool)。
iwlist、iwconfig
这两个命令需要你有无线网卡才能够进行使用。其用法如下:
· iwlist:利用无线网卡进行无线AP的检测与取得相关的数据。
· iwconfig:设置无线网卡的相关参数。
5.1.5 dhClient
如果你是使用DHCP协议在局域网内取得IP的话,那么是否一定要去编辑ifcfg-eth0内的BOOTPROTO呢?有个更快速的做法,就是利用dhClient这个命令。因为这个命令才是真正发送DHCP请求的。如果不考虑其他的参数,它的用法很简单,使用下面的方法即可:
[root@linux ~]# dhClient eth0 |
很简单吧。这样就可以立刻让我们的网卡以DHCP协议去尝试取得IP。不过在SuSE Distribution里面,它仅有dhcpcd这个程序,它与dhClient是相同的东西。
ping
这个ping是很重要的命令,ping主要通过ICMP数据包来进行整个网络的状况报告,当然,最重要的就是ICMP type 0、8这两个类型,分别是要求回报与主动回报网络状态是否存在的特性。要特别注意的是,ping需要通过IP数据包来传送ICMP数据包,而IP数据包里有个相当重要的TTL(Time To Live)属性,这是一个很重要的路由特性,详细的IP与ICMP表头数据请参考网络基础的详细介绍。
[root@linux ~]# ping [-bcstnM] IP 参数: -b,后面接的是 broadcast 的 IP,用在你“需要对整个网段的主机进行 ping ”时; -c,后面接的是执行 ping 的次数,例如 -c 5 ; -n,不进行 IP 与主机名称的反查,直接使用 IP ; -s,发送出去的 ICMP 数据包大小,默认为 56(bytes),再加 8 bytes 的 ICMP 表头资料。 -t,TTL 的数值,默认是 255,每经过一个节点就会少 -M [do|dont] :主要在检测网络的 MTU 数值大小,两个常见的项目是: do,代表传送一个 DF (Don't Fragment) 旗标,让数据包不能重新拆包与打包; dont,代表不要传送 DF 标记,表示数据包可以在其他主机上拆包与打包。 范例一:检测一下 168.95.1.1 这部 DNS 主机是否存在? [root@linux ~]# ping -c 3 168.95.1.1 PING 168.95.1.1 (168.95.1.1) 56(84) bytes of data. 64 bytes from 168.95.1.1: icmp_seq=0 ttl=243 time=9.16 ms 64 bytes from 168.95.1.1: icmp_seq=1 ttl=243 time=8.98 ms 64 bytes from 168.95.1.1: icmp_seq=2 ttl=243 time=8.80 ms --- 168.95.1.1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2002ms rtt min/avg/max/mdev = 8.807/8.986/9.163/0.164 ms, pipe 2 |
ping最简单的功能就是传送ICMP数据包去要求对方主机响应是否存在于网络环境中。上面的响应信息当中,几个重要的项目如下。
· 64 Bytes:表示这次传送的ICMP数据包大小为64 Bytes,这是默认值。在某些特殊场合中,例如,要搜索整个网络内最大的MTU时,可以使用-s 2000之类的数值来取代。
· icmp_seq=0:ICMP所检测进行的次数,第一次编号为0。
· ttl=243:TTL与IP数据包内的TTL是相同的,每经过一个带有MAC的节点(node)时,例如router、bridge时,TTL就会减少1,默认的TTL为255,你可以通过 -t 150之类的方法来重新设置默认TTL数值。
· time=9.16 ms:响应时间,单位有ms(0.001秒)及µs(0.000001秒),一般来说,响应时间越小,表示两台主机之间的网络联机越良好。
如果你忘记加上 -c 3这样的规定检测次数,那就得要使用 [ctrl]-c将它结束掉了。
范例二:针对整个网段进行 ping 的追查 [root@linux ~]# ping -c 3 -b 192.168.10.255 WARNING: pinging broadcast address <==会告知危险。 PING 192.168.10.255 (192.168.10.255) 56(84) bytes of data. 64 bytes from 192.168.10.100: icmp_seq=1 ttl=64 time=0.177 ms 64 bytes from 192.168.10.20: icmp_seq=1 ttl=64 time=0.179 ms (DUP!) 64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.302 ms (DUP!) 64 bytes from 192.168.10.40: icmp_seq=1 ttl=64 time=0.304 ms (DUP!) # 当针对整台主机作 ping 的检测时,可以利用 -b 这个参数。 # 请特别注意,当使用 ping -b 时,会对整个网段进行检测。没事别乱用。 # 例如上面的范例中,区网内的 192.168.10.20... 等主机会被检测到。 |
如果想要了解网内有多少台主机存活着,那么使用ping -b broadcast就能够知道了。而不必一台一台主机来检测。另外要特别注意一下,如果你的主机与待检测主机并不在同一个网段内,那么TTL默认使用255,如果是同一个网段内,那么TTL默认则使用64。看看上面的输出即可明白。
我们在前几章的网络基础里面谈到加大帧(frame)时,对于网络性能是有帮助的,因为数据包打包的次数会减少,加上如果整个传输的媒介都能够接受这个frame而不需要重新进行数据包的拆解与重组的话,那么性能当然会更好,修改frame大小的参数就是MTU。好了,现在我们知道网卡的MTU可以通过ifconfig或者是ip等来实现,那么追踪整个网络传输的最大MTU时,又该如何查询?最简单的方法当然是通过ping传送一个大数据包,并且不许中继的路由器或Switch将该数据包重组,这就能够处理了:
范例三:找出最大的 MTU 数值 [root@linux ~]# ping -c 2 -s 1000 -M do 192.168.10.10 PING 192.168.10.10 (192.168.10.10) 1000(1028) bytes of data. 1008 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.424 ms # 如果有响应,那就是可以接受这个数据包,如果无响应,那就表示这个 MTU 太大了 [root@linux ~]# ping -c 2 -s 8000 -M do 192.168.10.10 PING 192.168.10.10 (192.168.10.10) 8000(8028) bytes of data. ping: local error: Message too long, mtu=1500 # 这个错误信息是说,本地端的 MTU 才到 1500 而已,你要检测 8000 的 MTU # 根本就是无法实现的。那如何是好?用前一小节介绍的 ip link 来进行 MTU 设置吧 |
不过,你需要知道的是,由于IP数据包表头(不含options)已经占用了20Bytes,再加上ICMP的表头有8Bytes,所以当然你在使用 -s size的时候,那个数据包就得要先扣除 (20+8=28)的大小了。因此如果要使用MTU为1500时,就得要下达“ping -s 1472 -M do xx.yy.zz.ip”才行。另外,由于本地端的网卡MTU也会影响到检测,所以如果想要检测整个传输媒介的MTU数值,那么每个可以调整的主机就得要先使用ifcofig或ip将MTU调大,然后再去进行检测,否则就会像上面提供的案例一样,可能会出现“Message too long,mtu=1500”之类的字样。如果检测完毕后,想要调整最佳化的MTU,那么请参考前一章节的内容来调整。
不过不要随便调整MTU,除非真的有问题。通常是在如下情况调整MTU。
· 因为全部的主机群都是在内部的网段,例如群集架构(Cluster)的环境下,由于内部的网络节点都是我们可以控制的,因此可以通过修改MTU来改进网络性能。
· 因为操作系统默认的MTU与你的网段不符,导致某些网站可以顺利联机,某些网站则无法联机。以Windows操作系统作为联机分享的主机时,在Client端挺容易发生这个问题。
如果是要连上Internet的主机,注意不要随便调整MTU,因为我们无法知道Internet上面的每台机器能够支持的MTU到多大,因为这些也不是我们能够管得到的。
另外,其实每种联机方式都有不同的MTU值,常见的各种接口的MTU值如表5-1所示。
表5-1 常见的各种接口的MTU值
网络接口 |
MTU |
Ethernet |
1500 |
PPPoE |
1492 |
Dial-up(Modem) |
576 |
网络上也有免费帮忙查询MTU与传输相关数据的网站,例如下面这个网站:
连接上这个网站之前,请先取消你浏览器上的代理服务器(Proxy)的设置,才能显示出正确的信息。如果在Windows的系统上想要修改MTU值的话,那就得要修改Windows的日志文件,在Windows上面对于MTU的检测与修改的详细做法可以参考微软的官方网站:
/tip1to3/tip1to3_2.htm |
traceroute
我们前面谈到的命令大多数都是针对主机的网络参数设置所需要的,而ping是两台主机之间的回应与否的判断,那么有没有命令可以追踪两台主机之间通过的各个节点(Node)通信状况的好坏呢?如果我们联机到yahoo的速度比平常慢,你觉得是自己的网络环境有问题,还是外部的Internet有问题?如果是前者的话,我们当然需要检查自己的网络环境,看看究竟是谁中毒了?但如果是Internet的问题呢?那只有“等等等”了。判断是这个问题就得要使用traceroute这个命令。
[root@linux ~]# traceroute [-nwig] IP 参数: -n,可以不必进行主机的名称解析,只用 IP ,速度较快。 -w,若对方主机在几秒钟内没有回声就宣告不治...默认是 5 秒。 -i,用在比较复杂的环境,如果你的网络接口很多很复杂时,才会用到这个参数。 例如,你有两条 ADSL 可以连接到外部,那你的主机会有两个 ppp。 你可以使用 -i 来选择是 ppp0 还是 ppp1 啦。 -g,与 -i 的参数相仿,只是 -g 后面接的是 gateway 的 IP 。 范例一: [root@linux ~]# traceroute -n tw.yahoo.com traceroute to tw.yahoo-ap1.akadns.net (203.84.202.164), 30 hops max, 38 byte packets 1 61.59.121.1 42.174 ms 41.690 ms 41.058 ms 2 139.175.172.2 40.962 ms 41.978 ms 40.973 ms 3 192.72.122.130 40.983 ms 41.930 ms 41.003 ms 4 139.175.58.210 42.956 ms 41.997 ms 42.337 ms 5 139.175.58.153 47.591 ms 47.972 ms 48.748 ms 6 139.175.56.30 48.193 ms 47.970 ms 47.986 ms 7 139.175.57.94 47.959 ms 47.951 ms 47.985 ms 8 139.175.56.138 48.363 ms 47.586 ms 47.995 ms 9 139.175.58.42 49.256 ms 50.668 ms 47.490 ms 10 61.58.33.133 201.882 ms 201.565 ms 200.973 ms 11 61.58.33.50 199.910 ms 199.019 ms 198.961 ms 12 203.84.200.226 202.391 ms 202.567 ms 209.283 ms |
这个traceroute挺有意思的,这个命令会针对你想要连接的目的地的所有Router进行ICMP的超时等待,例如上面的例子当中,由鸟哥的主机连接到Yahoo时,它会经过12个节点,traceroute会主动对这12个节点做ICMP的回应等待,并检测回复的时间,每个节点会检测三次。所以像上面显示的结果,发现每个节点其实回复的时间大约在200 ms以内,算是Internet的环境还可以了。而且由上面的信息来看,在61.58.33.133这个节点后的传输延迟较久,至于之前的9个节点则有不错的表现。通过这种分析,可以让你了解到这条联线是哪个环节出了问题。
另外,如果在默认的5秒钟之内traceroute听不到节点的回应,那么屏幕上就会出现一个“*”的符号,告知该节点无法有顺利的响应。由于我们的traceroute用的是ICMP数据包,有些防火墙或者主机可能会将ICMP数据包扔掉,因此就会造成等不到回应的状况。另外,有些Gateway本来就不支持traceroute的功能,因此也会产生“*”的状况,所以分析时要注意一下。
nslookup
这条命令的用途与host基本上是一样的,就是用来作为IP与主机名称对应的检查,同样是使用 /etc/resolv.conf这个文件作为DNS服务器的来源选择。
[root@linux ~]# nslookup [-query=[type]] [hostname|IP] 参数: -query=type:查询的类型,除了传统的 IP 与主机名称对应外,DNS 还有很多信息 所以我们可以查询很多不同的信息,包括mx、cname 等 例如: -query=mx 的查询方法。 范例一:找出 的 IP [root@linux ~]# nslookup Server: 168.95.1.1 Address: 168.95.1.1#53 Non-authoritative answer: canonical name = canonical name = Name: Address: 64.233.189.104 范例二:找出 168.95.1.1 的主机名称 [root@linux ~]# nslookup 168.95.1.1 Server: 168.95.1.1 Address: 168.95.1.1#53 1.1.95.168.in-addr.arpa name = dns.hinet.net. |
如何,看起来与host差不多吧。不过,这个nslookup还可以通过IP找出主机名称。例如,那个范例二,它的主机名称是:dns.hinet.net。目前大家都建议使用dig这个命令来取代nslookup
Telnet
Telnet是早期个人计算机连接到服务器主机上工作时最重要的一个软件了。它不但可以直接连接到服务器上,还可以用来连接BBS呢。非常棒!不过,Telnet本身的数据在传送的时候是使用明文(原始的数据,没有加密),所以数据在Internet上面跑的时候,会比较危险一点(就怕被别人监听)。更详细的内容我们会在“远程联机服务器”章节里做介绍的。
[root@linux ~]# Telnet [host|IP] [port] 范例一:连接到成大梦之大地这个 BBS 站 [root@linux ~]# Telnet bbs.dorm.ncku.edu.tw bbs.ccns.ncku.edu.tw ⊙ ⊙ 140.116.250.3 [DreamBBS Ver.040223] 欢迎光临。系统负载:0.16 0.16 0.16 [负载正常] ╭─┼────┼─╮ ╭╮ ┌┤梦之大地├────────────┐ ╭──┬──┬──╮╭───┴┴───┬╮ │ │ ╰──┴──┴──╯ │ │ 梦之大地由 │ ╭────────╮ ╭─╯ │ 【计算机网络爱好社‧CCNS】 │ ╭───┬───╮ ╭──╯ │ 维护管理 │ │ │ ╭─╯ │ │ ╰───┴───╯ ╰┴───────╯ └───────────┤By BenHe├┘ ┌┤本站站长群├────────┐ ╭ ╭ ╭ ╮ │站长: billcho │ ╭────┼────╮╭─┼─╭┼──┼╮ │系统: cat │ │ │ │ ││ │站务: muwell ianwolf │ ╭╯╮ │ │ ││ │ renn999 GG │ ╭╯ ╰╮ │ │ │╯ │ │ ╭╯ ╰╮ │╭ │ └───────────────┘ ╰╯ ╰─╯╰─┴╯ ╰───╯ 参观用账号:guest,申请新账号:new。目前在线人数 [2183/5000] 人。 请输入代号: |
如上所示,我们可以通过Telnet轻易地连接到BBS上面,而如果你的主机有开启Telnet服务的话,同样地利用Telnet IP并且输入账号与密码之后,就能够登录主机了。另外,在Linux上的Telnet软件还提供了Kerberos的认证方式,有兴趣的话请自行参阅man Telnet的说明。
除了连接到服务器以及连接到BBS站之外,Telnet还可以用来连接到某个port(服务)上。例如,我们可以用Telnet连接到port 110,看看这个port是否正确启动了。
范例二:检测本机端的port 110 是否正确启动? [root@linux ~]# Telnet localhost 110 Trying 127.0.0.1... Telnet: connect to address 127.0.0.1: Connection refused # 如果出现这样的信息,代表这个 port 没有启动或者是这个联机有问题 # 因为你看到那个 refused [root@linux ~]# Telnet localhost 25 Trying 127.0.0.1... Connected to localhost. Escape character is '_]'. 220 vbird.vbird.idv.tw ESMTP Postfix ehlo localhost 250-linux.dm.tsai 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250 8BITMIME quit 221 Bye Connection closed by foreign host. |
根据输出的结果,我们就能够知道这个通信协议(Port Number提供的通信协议功能)是否已经成功地启动了。而每个port所监听的服务都有其特殊的命令,例如,上述的port 25就是本机接口提供的电子邮件服务,那个服务所支持的命令就如同上面使用的数据一样,但是其他的port就不见得支持这个ehlo命令,因为不同的port有不同的程序嘛,当然支持的命令就不同了
FTP
常常会听到FTP这个服务。如果你想要下载Linux的光盘烧录映象文件时,可以到FTP网站,它们都是FTP提供者啊。那我们要如何去下载呢?当然就是通过FTP的客户端软件了。在Linux下面,我们可以通过FTP这个软件,也可以通过下一小节会提到的LFTP软件。
[root@linux ~]# FTP [-p] [host|IP] [port] 参数: -p :启动被动式模式 (passive、PASV); 范例一:联机看看 [root@linux ~]# FTP FTP.isu.edu.tw Connected to FTP.isu.edu.tw (140.127.177.17). 220-欢迎光临义守大学文件服务器 220- 220-本站提供以下软件可供下载: 220-******************************************************************** 220-/pub/BeOS/ BeOS 操作系统 220-/pub/Linux/ Linux 操作系统 ....(其他省略).... 220-******************************************************************** Name (FTP.isu.edu.tw:dmtsai): anonymous 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. FTP> FTP> help <==提供更多的可用命令,可以常参考。 FTP> cd /pub <==变换目录到 /pub 当中 FTP> dir <==显示远程主机的目录内容 FTP> get file <==下载 file 这个文件 FTP> mget file <==下载 file 这个目录或文件 FTP> put file <==上传 file 这个文件到服务器上 FTP> delete file <==删除主机上的 file 这个文件 FTP> mkdir dir <==建立 dir 这个目录 FTP> lcd /home <==切换“本地端主机”的工作目录 FTP> passive <==启动或关闭 passive 模式 FTP> binary <==数据传输模式设置为 binary 格式 |
FTP其实是一个很麻烦的协议,因为它使用两个port分别进行命令与数据的通信,详细的内容我们会在后续的FTP服务器内详谈,这里我们先简单介绍一下如何使用FTP这个软件。首先当然需要登录了,所以在上面的代码中填入账号与密码。由于提供匿名登录,而匿名登录者的账号就是anonymous,所以直接填写那个账号即可。如果是私人的FTP,可能需要提供一组完整的账号与密码。
登录FTP主机后,就能够使用FTP软件的功能进行上传与下载的操作,几个常用的FTP内命令如上述代码所示,不过,鸟哥建议你可以连到大学的FTP网站后,使用help(或问号 ?)来查询可用的命令,然后尝试下载以测试使用一下这个命令吧。这样以后没有浏览器的时候,你也可以直接连接下载FTP了。
另外,如果由于某些原因,让你的FTP主机的port开在非正规的端口,那你就可以利用下面的方式来连接到该台主机。
[root@linux ~]# FTP hostname 318 # 假设对方主机的 FTP 服务开启在 318 这个 port 。 |
LFTP
早期当我们要登录提供匿名登录的主机时,很多时候都是使用ncFTP这个软件,不过,现在有更棒的选择,那就是LFTP。这个软件甚至可以在FTP里面使用类似Bash的指令功能,实在是非常的完美。而且整个使用的方法与上面提到的FTP又非常类似。
[root@linux ~]# LFTP [-p port] [-u user[,pass]] [host|IP] 参数: -p,后面可以直接接上远程 FTP 主机提供的 port -u,后面则是接上 账号与密码 ,就能够连接上远程主机了 如果没有加账号密码, lFTP 默认会使用 anonymous 尝试匿名登录 范例一:利用 LFTP 登录义守大学 [root@linux ~]# LFTP FTP.isu.edu.tw lFTP FTP.isu.edu.tw:~> # 瞧。一下子就登录了 |
我想,现在大家应该都知道什么是MSN、雅虎实时通以及其他的通信软件吧。那么要连上这些服务器时,该怎么处理哪?很简单,在X Window下面使用Gaim就行了,太方便了。请先进入X Window系统,然后开启一个终端机窗口,接着直接输入Gaim(请注意你必须已经安装了Gaim了),然后就会出现如图5-1所示的窗口。
图5-1 Gaim使用范例图 |
输入你的账号与密码,并选择相对应的实时通信服务器(如MSN或Yahoo实时通),就可以进入到如图5-2所示的界面
图5-2 Gaim使用范例图 |
当一切都没有问题后,按下“登录”按钮,这样就可以在Linux上使用实时通信软件了,方便得很。
文本网页浏览
什么?文本界面竟然有浏览器!别逗了好不好?呵呵!谁有那个时间在逗你。真的有这个东西,是在文本界面下上网浏览的好工具,他们分别是lynx及wget这两个宝贝,但是,你必须确定你已经安装了这两个软件才行。下面就让我们来聊一聊这两个好用的家伙吧。
5.4.1 lynx
这个命令最大的作用就是让我们在文本模式下使用这个浏览器来浏览网页。但鸟哥认为,这个文档最大的功能是查阅Linux本机上面以HTML语法写成的文件信息(Document),怎么说呢?如果你曾经在Linux本机下面的 /usr/share/doc这个目录看过文件信息的话,就会常常发现一些网页文件,使用vi去查阅时,总是看到一堆HTML的语法,妨碍阅读啊。这时候使用lynx就是个好方法了,内容可以看得清清楚楚。
[root@linux ~]# lynx [options] [website] 参数: options 指的是一些惯用的参数,可以使用 man lynx 查阅,常见的有: -anonymous :默认使用匿名登录。 -assume_charset=big5 :设置默认的语系数据为 big5 ,用在中文网页很方便。 范例一:浏览 Linux kernel 网站 [root@linux ~]# LANG=zh_TW.big5 [root@linux ~]# lynx |
输入LANG=zh_TW.big5是当你想要浏览中文网站时,那么终端机就得要有相对应的显示编码才行,否则会有一堆乱码产生。当我直接输入lynx网站的网址后,就会出现如图5-3所示界面。
图5-3 lynx使用范例图 |
在图5-3中,特殊字体的部分是我们可以使用Tab按键来进行超级链接的切换。而上图最下面一行则显示出一些热键,可以按上述的热键来参考一些常见的命令功能。不过有些地方你还是要知道一下:
· 进入界面之后,由于是文本模式,所以编排可能会有点位移。不过不要紧,不会影响我们查看信息。
· 这个时候可以使用“上下键”让光标停在上面的选项当中(如信箱、书签等),再按下Enter就进入该页面。
· 可以使用左右键来移动“上一页”或“下一页”。
· 可以通过修改 /etc/lynx.cfg来设置显示的字符编码(中国台湾地区可以选择Big5编码)。
· 其他的设置可以使用上面的范例中最下面那一行的说明。
一些常见功能如下:
· h:Help,求助功能,在线说明书。
· g:Goto URL,按g后输入网页地址(URL)如 等。
· d:download,下载文件。
· q:Quit,退出lynx 。
· Ctrl+C:强迫中止lynx的执行。
· 方向键如下:
Ø 上:移动光标至本页中“上一个可链接点”。
Ø 下:移动光标至本页中“下一个可链接点”。
Ø 左:back,跳回上一页。
Ø 右:进入反白光标所链接的网页。
Ø Enter:等同“右”键。
至于如果是浏览Linux本机上面的网页文件,那就可以使用如下的方式:
[root@linux ~]# cd /usr/share/doc/samba-3.0.10/htmldocs [root@linux htmldocs]# lynx index.html |
在鸟哥的Cent OS 4.3当中,有这么一个文件,我就可以利用lynx来取得查看。显示的结果如图5-4所示。
图5-4 lynx使用范例图 |
当然,因为你的环境可能是在Linux本机的tty1~tty6,所以无法显示出中文,这个时候你就得要进行LANG=en_US之类的语言设置才行。而如果你常常需要浏览中文语系的网页,那就可以直接修改配置文件,例如 /etc/lynx.cfg这个文件内容:
[root@linux ~]# vi /etc/lynx.cfg CHARACTER_SET:utf-8 <==约在 399 行 #ASSUME_CHARSET:iso-8859-1 <==约在 414 行 #PREFERRED_LANGUAGE:en <==约在 542 行 # 你可以将它改成如下所示: CHARACTER_SET:big5 ASSUME_CHARSET:big5 PREFERRED_LANGUAGE:zh_TW |
另外,如果有时候你必须上网点选某个网站来自动取得更新时。例如,早期的自动在线更新主机名称系统,仅支持网页更新,那你如何进行更新呢?可以使用lynx!利用 -dump这个参数先处理:
[root@linux ~]# lynx -dump \ > > testfile |
上面的网站后面有加个问号(?)对吧?后面接的则是利用网页的GET功能取得的各项变量数据,利用这个功能,我们就可以直接登录到该网站上了。非常方便吧。而且会将执行的结果输出到testfile文件中,不过如果网站提供的数据是以POST为主的话,那鸟哥就不知道如何搞定了。
tcpdump
说实在的,对于tcpdump这个软件来说,你甚至可以说这个软件其实就是个黑客软件,因为它不但可以分析数据包的流向,连数据包的内容也可以进行监听,如果你使用的传输数据是明文的话,在Router上就可能被人家监听走了。很可怕。所以,我们也要来了解一下这个软件(注:这个tcpdump必须使用root的身份执行)。
[root@linux ~]# tcpdump [-nn] [-i 接口] [-w 储存档名] [-c 次数] [-Ae] [-qX] [-r 文件] [所欲捕获的数据内容] 参数: -nn,直接以 IP 及 Port Number 显示,而非主机名与服务名称。 -i,后面接要「监听」的网络接口,例如 eth0, lo, ppp0 等等的接口。 -w,如果你要将监听所得的数据包数据储存下来,用这个参数就对了。后面接文件名。 -c,监听的数据包数,如果没有这个参数, tcpdump 会持续不断的监听, 直到用户输入 [ctrl]-c 为止。 -A,数据包的内容以 ASCII 显示,通常用来捉取 WWW 的网页数据包资料。 -e,使用资料连接层 (OSI 第二层) 的 MAC 数据包数据来显示。 -q,仅列出较为简短的数据包信息,每一行的内容比较精简。 -X,可以列出十六进制 (hex) 以及 ASCII 的数据包内容,对于监听数据包内容很有用。 -r,从后面接的文件将数据包数据读出来。那个「文件」是已经存在的文件, 并且这个「文件」是由 -w 所制作出来的。 所欲捕获的数据内容:我们可以专门针对某些通信协议或者是 IP 来源进行数据包捕获。 那就可以简化输出的结果,并取得最有用的信息。常见的表示方法有。 'host foo', 'host 127.0.0.1' :针对单台主机来进行数据包捕获。 'net 192.168' :针对某个网段来进行数据包的捕获。 'src host 127.0.0.1' 'dst net 192.168':同时加上来源(src)或目标(dst)限制。 'tcp port 21':还可以针对通信协议检测,如tcp、udp、arp、ether 等。 还可以利用 and 与 or 来进行数据包数据的整合显示呢。 范例一:以 IP 与 Port Number 捉下 eth0 这个网卡上的数据包,持续 3 秒 [root@linux ~]# tcpdump -i eth0 -nn tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 01:33:40.41 IP 192.168.1.100.22 > 192.168.1.11.1190: P 116:232(116) ack 1 win 9648 01:33:40.41 IP 192.168.1.100.22 > 192.168.1.11.1190: P 232:364(132) ack 1 win 9648 <==按下 [ctrl]-c 之后结束 6680 packets captured <==捉取下来的数据包数量 14250 packets received by filter <==由过滤所得的总数据包数量 7512 packets dropped by kernel <==被核心所丢弃的数据包 |
如果你是第一次看tcpdump的man page时,肯定会晕菜的,因为tcpdump几乎都是分析数据包的表头数据,用户如果没有简单的网络数据包基础知识,要看懂很困难。所以,至少你得要回到第2章“网络基础”里面去好好理解一下TCP数据包的表头信息才好。至于那个在范例一所产生的输出中,我们可以大概区分为几个字段,现以范例一当中那行特殊字体行来说明一下:
· 01:33:40.41:这个是此数据包被捕获的时间,“时:分:秒”的单位。
· IP:通过的通信协议是IP。
· 192.168.1.100.22>:传送端是192.168.1.100这个IP,而传送的Port Number为22,那个大于(>)的符号指的是数据包的传输方向。
· 192.168.1.11.1190:接收端的IP是192.168.1.11,且该主机开启port 1190来接收。
· P 116:232(116):这个数据包带有PUSH的数据传输标志,且传输的数据为整体数据的116~232 Byte,所以这个数据包带有116 Bytes的数据量。
· ack 1 win 9648:ACK与Window size的相关资料。
最简单的说法,就是该数据包是由192.168.1.100传到192.168.1.11,通过的port是由22到1190,且带有116 Bytes的数据量,使用的是PUSH的标记,而不是SYN之类的主动联机标志。不容易看得懂吧。所以,我才会讲请务必到“TCP表头数据”的章节去看一看。
接下来,在一个网络状态很忙的主机上面,你想要取得某台主机对你联机的数据包数据时,使用tcpdump配合管线命令与正则表达式也可以,不过,毕竟不好捕获。我们可以通过tcpdump的表达式功能,就能够轻易地将所需要的数据独立的取出来。在上面的范例一当中,我们仅针对eth0做监听,所以整个eth0接口上面的数据都会被显示到屏幕上,但这样不好分析,可以简化吗?例如,只取出port 21的联机数据包,可以这样做:
[root@linux ~]# tcpdump -i eth0 -nn port 21 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 01:54:37.96 IP 192.168.1.11.1240 > 192.168.1.100.21:. ack 1 win 65535 01:54:37.96 IP 192.168.1.100.21 > 192.168.1.11.1240:P 1:21(20) ack 1 win 5840 01:54:38.12 IP 192.168.1.11.1240 > 192.168.1.100.21:. ack 21 win 65515 01:54:42.79 IP 192.168.1.11.1240 > 192.168.1.100.21:P 1:17(16) ack 21 win 65515 01:54:42.79 IP 192.168.1.100.21 > 192.168.1.11.1240: . ack 17 win 5840 01:54:42.79 IP 192.168.1.100.21 > 192.168.1.11.1240: P 21:55(34) ack 17 win 5840 |
看!这样就仅取出port 21的信息,如果仔细看的话,你会发现数据包的传递都是双向的,Client端发出请求而Server端则予以响应,所以,当然是有去有回了。而我们也就可以经过这个数据包的流向来了解到数据包运动的过程了。例如:
· 我们先在一个终端机窗口输入“tcpdump-i lo-nn”的监听。
· 再另开一个终端机窗口来对本机(127.0.0.1)登录“ssh localhost”,那么输出的结果会是如何?
[root@linux ~]# tcpdump -i lo -nn 1 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode 2 listening on lo, link-type EN10MB (Ethernet), capture size 96 bytes 3 11:02:54.253777 IP 127.0.0.1.32936 > 127.0.0.1.22: S 933696132:933696132(0) win 32767 |
代码显示的头两行是tcpdump的基本说明,然后:
· 第3行显示的是来自Client端带有SYN主动联机的数据包。
· 第4行显示的是来自Server端,除了响应Client端之外(ACK),还带有SYN主动联机的标志。
· 第5行则显示Client端响应Server确定联机建立(ACK)。
· 第6行以后则开始进入数据传输的步骤。
从第3~5行的流程来看,熟不熟悉啊?没错。那就是3次握手的基础流程,有趣吧。不过tcpdump之所以被称为黑客软件之一远不止上面介绍的功能。上面介绍的功能可以用来作为我们主机的数据包联机与传输的流程分析,这将有助于我们了解到数据包的运作,同时了解到主机的防火墙设置规则是否有需要修订的地方。
还有更神奇的用法。当我们使用tcpdump在Router上面监听明文的传输数据时,例如FTP传输协议,你觉得会发生什么问题呢?我们先在主机端执行“tcpdump -i lo port 21 -nn –X”,然后再以FTP登录本机,并输入账号与密码,结果你就可以发现如下的状况:
[root@linux ~]# tcpdump -i lo -nn -X 'port 21' 0x0000: 4500 0048 2a28 4000 4006 1286 7f00 0001 E..H*(@.@....... 0x0010: 7f00 0001 0015 80ab 8355 2149 835c d825 .........U!I.\.% 0x0020: 8018 2000 fe3c 0000 0101 080a 0e2e 0b67 .....<.........g 0x0030: 0e2e 0b61 3232 3020 2876 7346 5450 6420 ...a220.(vsFTPd. 0x0040: 322e 302e 3129 0d0a 2.0.1).. 0x0000: 4510 0041 d34b 4000 4006 6959 7f00 0001 E..A.K@.@.iY.... 0x0010: 7f00 0001 80ab 0015 835c d825 8355 215d .........\.%.U!] 0x0020: 8018 2000 fe35 0000 0101 080a 0e2e 1b37 .....5.........7 0x0030: 0e2e 0b67 5553 4552 2064 6d74 7361 690d ...gUSER.dmtsai. 0x0040: 0a . 0x0000: 4510 004a d34f 4000 4006 694c 7f00 0001 E..J.O@.@.iL.... 0x0010: 7f00 0001 80ab 0015 835c d832 8355 217f .........\.2.U!. 0x0020: 8018 2000 fe3e 0000 0101 080a 0e2e 3227 .....>........2' 0x0030: 0e2e 1b38 5041 5353 206d 7970 6173 7377 ...8PASS.mypassw 0x0040: 6f72 6469 7379 6f75 0d0a ordisyou.. |
上面的输出结果已经被简化过了,你需要自行在你的输出结果中搜索相关的字符串才行。从上面输出结果的特殊字体中,我们可以发现该FTP软件使用的是vsFTPd,并且用户输入dmtsai这个账号名称,且密码是mypasswordisyou。你说可不可怕啊。如果使用的是明文方式来传输你的网络数据呢?所以我们才常常在讲啊,网络是很不安全的。
另外你得了解,为了让网络接口可以让tcpdump监听,所以执行tcpdump时网络接口会启动在“混杂模式(promiscuous)”,所以你会在 /var/log/messages里面看到很多的警告信息,通知你说你的网卡被设置成为混杂模式。别担心,那是正常的。至于更多的应用,请参考man tcpdump了。
例题:如何使用tcpdump监听来自eth0适配卡且通信协议为port 22,目标来源为192.168.1.100的数据包资料? 答:tcpdump -i eth0 -nn 'port 22 and src host 192.168.1.100'。 |
ethereal
除了tcpdump这个软件之外,其实你还可以使用ethereal这个好用的网络流量分析软件。ethereal分为文本界面与图形界面,文本界面的用法与tcpdump类似,不过它的命令名称为tethereal就是了。因为用法差不多,所以建议你直接使用man tethereal查阅。在Cent OS上原本就有ethereal,所以请拿出光盘来安装即可,需要同时安装ethereal与ethereal-gnome才行。
启动的方法很简单,你需要在X Window下面,先启动一个终端机,然后直接输入ethereal后,就会出现如图5-5所示的画面
图5-5 ethereal使用范例图 |
简单的做法,你可以单击如图5-5显示的那个按钮,会出现挑选监听的接口窗口,如图5-6所示。
图5-6 ethereal使用范例图 |
你应该选择要监听的接口,在这里因为是测试用的,所以鸟哥使用的是lo这个内部接口,你当然应该要选择你自己的网络接口才是。然后单击Start后,就会出现开始检测的界面了,如图5-7所示。
图5-7 ethereal使用范例图 |
在这个界面当中你可以看到很多类型的数据包协议,在等你处理完毕后,就可以单击Stop结束监听,而开始进入如图5-8所示的数据包分析界面。
图5-8 ethereal使用范例图 |
数据包分析界面共分为3大区块,如图5-8所示,第一区块主要显示的是数据包的标头资料,内容有点类似tcpdump的显示结果;第二区块则是详细的表头数据,包括通信协议的内容以及Socket Pair等信息。第三区块则是16进制与ASCII码的显示结果。通过这个ethereal,你就可以一口气得到所需要的所有数据包内容。而且还是图形界面的,很方便吧。通过在第一区块选择不同的数据包,就能够查阅每个数据包的数据内容了。
nc、netcat
这个nc可以用来作为某些服务的检测,因为它可以连接到某个port来进行通信,此外,还可以自行启动一个port来倾听其他用户的联机,非常好用。如果在编译的时候设置GAPING_SECURITY_HOLE参数的话,这个软件还可以用来取得客户端的bash。可怕吧。我们的CentOS比较人性化,并没有设置上面的参数,所以我们不能够用来作为黑客软件。但是用来取代Telnet功能已经够用了(有的系统将执行文件改名为netcat了)。
[root@linux ~]# nc [IP|host] [port] [root@linux ~]# nc -l -p [port] 参数: -l,作为监听之用,亦即开启一个 port 来监听用户的联机。 -p,开启的这个 Port Number。 范例一:连接本地端的 port 25 查阅相关信息 [root@linux ~]# nc localhost 25 localhost.localdomain [127.0.0.1] 25 (smtp) open 220 pc.dm.tsai ESMTP Postfix ehlo localhost 250-pc.dm.tsai 250-PIPELINING 250-SIZE 40000000 250-ETRN quit 221 Bye |
这个最简单的功能与Telnet几乎一样吧,它可以检查某个服务。不过,更神奇的在后面,我们可以建立两个联机来通信。举个例子来说,我们先在Client端的地方启动一个port来进行倾听:
范例二:激活一个 port 来监听用户的联机要求 [root@linux ~]# nc -l -p 20000 # 启动一个 port 20000 在主机上,如果此时使用 netstat –tlnp。 # 就可以看到系统上多出来一个 port 20000 在倾听用户的联机。 |
然后在主机端的地方,也利用nc来联机到客户端,并且输入一些命令看看。
[root@linux ~]# nc localhost 20000 <==这里可以开始输入字符串了。 |
此时,在主机端我们可以打入一些字,你会发现在Client端会同时出现你输入的文字。如果你同时设置一些额外的参数,例如利用标准输入与输出(stdout与stdin)的话,那么就可以通过这个联机来做很多事情了。当然nc的功能不仅如此,你还可以发现很多的用途。请自行到你主机内的 /usr/share/doc/nc-1.10/scripts目录下看看这些script,有帮助的。不过,如果你需要额外地编译出含有GAPING_ SECURITY_HOLE功能,以使两端联机可以进行额外命令的执行时,就需要自己下载源代码来编译了。
重 点 回 顾
· 修改网络接口的硬件相关参数,可以使用ifconfig这个命令,包括MTU等。
· ifup与ifdown其实只是script,在使用时,会主动去 /etc/sysconfig/network- scripts里找到相对应的设备设置文件,才能够正确地启动与关闭。
· 路由的修改与查阅可以使用route来查询,此外,route亦可进行新增、删除路由的工作。
· ip命令可以用来作为整个网络环境的设置,利用ip link可以修改网络设备的硬件相关功能,包括MTU与MAC等,可以使用ip address修改TCP/IP方面的参数,包括IP以及网段参数等,ip route则可以修改路由。
· ping主要是通过ICMP数据包来进行网络环境的检测工作,并且可以使用ping来查询整体网段可接受的最大MTU值。
· 监测每个节点的连接状况,可以使用traceroute这个命令来追踪。
· netstat除了可以观察本机的启动接口外,还可以观察Unix socket的传统接口数据。
· host与nslookup默认都是通过/etc/resolv.conf内设置的DNS主机来进行主机名称与IP的查询。
· LFTP可以用来匿名登录远程的FTP主机。
· Telnet不仅用来进行BBS的登录,也可以用来作为某些端口服务的测试。
· lynx主要的功能是浏览,包括本机上HTML语法的文件,wget则主要用来下载WWW的资料。
· 捕获数据包以分析数据包的流向,可使用tcpdump,至于图形界面的ethereal则可以进行更为详细的解析。
· 通过tcpdump分析3次握手,以及分析明文传输的数据,可发现网络加密的重要性。
· nc可用来取代Telnet进行某些服务端口的检测工作,同时若自行编译nc,可额外地执行-e参数。