Linux常用网路指令

Linux 的网路功能相当的强悍,一时之间我们也无法完全的介绍所有的网路指令,这个章节主要的目的在介绍一些常见的网路指令而已。至于每个指令的详细用途将在后续伺服器架设时,依照指令的相关性来进行说明。当然,在这个章节的主要目的是在于将所有的指令汇整在一起, 比较容易了解啦!这一章还有个相当重要的重点,那就是封包撷取的指令。若不熟悉也没关系,先放着,全部读完后再回来这一章仔细练习啊!


大标题的图示 5.1 网路参数设定使用的指令

任何时刻如果你想要做好你的网路参数设定,包括IP 参数、路由参数与无线网路等等,就得要了解底下这些相关的指令才行!其中以ifconfig 及route 这两支指令算是较重要的喔!^_^!当然,比较新鲜的作法,可以使用ip 这个汇整的指令来设定IP 参数啦!

  • ifconfig    :查询、设定网路卡与IP网域等相关参数;
  • ifup, ifdown:这两个档案是script,透过更简单的方式来启动网路介面;
  • route       :查询、设定路由表(route table)
  • ip          :复合式的指令,可以直接修改上述提到的功能;


小标题的图示 5.1.1 手动/自动设定与启动/关闭IP 参数: ifconfig, ifup, ifdown

这三个指令的用途都是在启动网路介面,不过, ifup 与ifdown 仅能就/etc/sysconfig/network-scripts 内的ifcfg-ethX (X 为数字) 进行启动或关闭的动作,并不能直接修改网路参数,除非手动调整ifcfg-ethX 档案才行。至于ifconfig 则可以直接手动给予某个介面IP 或调整其网路参数!底下我们就分别来谈一谈!


  • ifconfig

ifconfig 主要是可以手动的启动、观察与修改网路介面的相关参数,可以修改的参数很多啊,包括IP 参数以及MTU 等等都可以修改,他的语法如下:

[root@www ~]# ifconfig {interface} {up|down}   <==观察与启动介面 
[root@www ~]# ifconfig interface {options}     <==设定与修改介面
选项与参数:
interface:网路卡介面代号,包括eth0, eth1, ppp0 等等
options :可以接的参数,包括如下:
    up, down :启动(up) 或关闭(down) 该网路介面(不涉及任何参数)
    mtu :可以设定不同的MTU 数值,例如mtu 1500 (单位为byte)
    netmask :就是子遮罩网路;
    broadcast:就是广播位址啊!

#范例一:观察所有的网路介面(直接输入ifconfig) 
[root@www ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:71:85:BD
          inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe71:85bd/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
          RX packets:2555 errors:0 dropped:0 overruns:0 frame:0
          TX packets:70 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:239892 (234.2 KiB) TX bytes:11153 (10.8 KiB)

一般来说,直接输入ifconfig就会列出目前已经被启动的卡,不论这个卡是否有给予IP,都会被显示出来。而如果是输入ifconfig eth0,则仅会秀出这张介面的相关资料,而不管该介面是否有启动。所以如果你想要知道某张网路卡的Hardware Address,直接输入『 ifconfig "网路介面代号" 』即可喔!^_^!至于上表出现的各项资料是这样的(资料排列由上而下、由左而右):

  • eth0:就是网路卡的代号,也有lo这个loopback ;
  • HWaddr:就是网路卡的硬体位址,俗称的MAC是也;
  • inet addr:IPv4的IP位址,后续的Bcast, Mask分别代表的是Broadcast与netmask喔!
  • inet6 addr:是IPv6的版本的IP ,我们没有使用,所以略过;
  • MTU:就是第二章谈到的 MTU啊!
  • RX:那一行代表的是网路由启动到目前为止的封包接收情况, packets代表封包数、errors代表封包发生错误的数量、 dropped代表封包由于有问题而遭丢弃的数量等等
  • TX:与RX相反,为网路由启动到目前为止的传送情况;
  • collisions:代表封包碰撞的情况,如果发生太多次,表示你的网路状况不太好;
  • txqueuelen:代表用来传输资料的缓冲区的储存长度;
  • RX bytes, TX bytes:总接收、传送的位元组总量

透过观察上述的资料,大致上可以了解到你的网路情况,尤其是那个RX, TX 内的error 数量, 以及是否发生严重的collision 情况,都是需要注意的喔!^_^

#范例二:暂时修改网路介面,给予eth0一个192.168.100.100/24 ​​的参数 
[root@www ~]# ifconfig eth0 192.168.100.100 
#如果不加任何其他参数,则系统会依照该IP所在的class范围,自动的计算出
# netmask 以及network, broadcast 等IP 参数,若想改其他参数则:

[root@www ~]# ifconfig eth0 192.168.100.100 \ 
> netmask 255.255.255.128 mtu 8000 
#设定不同参数的网路介面,同时设定MTU的数值!

[root@www ~]# ifconfig eth0 mtu 9000 
#仅修改 ​​该介面的MTU数值,其他的保持不动!

[root@www ~]# ifconfig eth0:0 192.168.50.50 
#仔细看那个介面是eth0:0喔!那就是在该实体网卡上,再模拟一个网路介面,
# 亦即是在一张网路卡上面设定多个IP 的意思啦!

[root@www ~]# ifconfig 
eth0 Link encap:Ethernet   HWaddr 08:00:27:71:85:BD 
          inet addr:192.168.100.100   Bcast:192.168.100.127   Mask:255.255.255.128
          inet6 addr: fe80::a00:27ff:fe71:85bd/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST   MTU:9000   Metric:1
          RX packets:2555 errors:0 dropped:0 overruns:0 frame:0
          TX packets:70 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:239892 (234.2 KiB) TX bytes:11153 (10.8 KiB)

eth0:0 Link encap:Ethernet   HWaddr 08:00:27:71:85:BD 
          inet addr:192.168.50.50   Bcast:192.168.50.255   Mask:255.255.255.0 
          UP BROADCAST RUNNING MULTICAST   MTU:9000   Metric:1
 #仔细看,是否与硬体有关的资讯都相同啊!没错!因为是同一张网卡嘛!
# 那如果想要将刚刚建立的那张eth0:0 关闭就好,不影响原有的eth0 呢?

[root@www ~]# ifconfig eth0:0 down 
#关掉eth0:0这个介面。那如果想用预设值启动eth1:『ifconfig eth1 up』即可达成

#范例三:将手动的处理全部取消,使用原有的设定值重建网路参数: 
[root@www ~]# /etc/init.d/network restart 
#刚刚设定的资料全部失效,会以ifcfg- ethX的设定为主!

使用ifconfig可以暂时手动来设定或修改某个介面卡的相关功能,并且也可以透过eth0:0这种虚拟的网路介面来设定好一张网路卡上面的多个IP喔!手动的方式真是简单啊!并且设定错误也不打紧,因为我们可以利用 /etc/init.d/network restart 来重新启动整个网路介面,那么之前手动的设定资料会全部都失效喔!另外,要启动某个网路介面,但又不让他具有IP参数时,直接给他ifconfig eth0 up即可!这个动作经常在无线网卡当中会进行,因为我们必须要启动无线网卡让他去侦测AP存在与否啊!


  • ifup, ifdown

即时的手动修改一些网路介面参数,可以利用ifconfig 来达成,如果是要直接以设定档, 亦即是在/etc/sysconfig/network-scripts 里面的ifcfg-ethx 等档案的设定参数来启动的话,那就得要透过ifdown 或ifup 来达成了。

[root@www ~]# ifup {interface} 
[root@www ~]# ifdown {interface}

[root@www ~]# ifup eth0

ifup与ifdown真是太简单了!这两支程式其实是script而已,他会直接到/etc/sysconfig/network-scripts目录下搜寻对应的设定档,例如ifup eth0时,他会找出ifcfg- eth0这个档案的内容,然后来加以设定。关于ifcfg-eth0的设定则请参考第四章的说明。

不过,由于这两支程式主要是搜寻设定档(ifcfg-ethx)来进行启动与关闭的,所以在使用前请确定ifcfg-ethx是否真的存在于正确的目录内,否则会启动失败喔!另外,如果以ifconfig eth0 ....来设定或者是修改了网路介面后,那就无法再以ifdown eth0的方式来关闭了!因为ifdown会分析比对目前的网路参数与ifcfg-eth0是否相符,不符的话,就会放弃该次动作。因此,使用ifconfig修改完毕后,应该要以ifconfig eth0 down才能够关闭该介面喔!


小标题的图示 5.1.2 路由修改: route

我们在第二章网路基础的时候谈过关于路由的问题,两部主机之间一定要有路由才能够互通TCP/IP的协定,否则就无法进行连线啊!一般来说,只要有网路介面,该介面就会产生一个路由,所以我们安装的主机有一个eth0的介面,看起来就会是这样:

[root@www ~]# route [-nee] 
[root@www ~]# route add [-net|-host] [网域或主机] netmask [mask] [gw|dev] 
[root@www ~]# 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@www ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.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 1002 0 0 eth0
0.0.0.0 192.168.1.254 0.0.0.0 UG 0 0 0 eth0

[root@www ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
link-local * 255.255.0.0 U 1002 0 0 eth0
default 192.168.1.254 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):需要透过外部的主机(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.1.0/24是Class C),逐渐到大网域(169.254.0.0/16 Class B)最后则是预设路由( 0.0.0.0/0.0.0.0)。然后当我们要判断某个网路封包应该如何传送的时候,该封包会经由这个路由的过程来判断喔!举例来说,我上头仅有三个路由,若我有一个传往192.168.1.20的封包要传递,那首先会找192.168.1.0/24这个网域的路由,找到了!所以直接由eth0传送出去;

如果是传送到Yahoo 的主机呢?Yahoo 的主机IP 是119.160.246.241,我们通过判断1)不是192.168.1.0/24, 2)不是169.254.0.0/16 结果到达3)0/0 时,OK!传出去了,透过eth0 将封包传给192.168.1.254 那部gateway 主机啊!所以说,路由是有顺序的。

因此当你重复设定多个同样的路由时, 例如在你的主机上的两张网路卡设定为相同网域的IP 时,会出现什么情况?会

Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1

也就是说,由于路由是依照顺序来排列与传送的,所以不论封包是由那个介面(eth0, eth1)所接收,都会由上述的eth0传送出去,所以,在一部主机上面设定两个相同网域的IP本身没有什么意义!有点多此一举就是了。除非是类似虚拟机器(Xen, VMware等软体)所架设的多主机时,才会有这个必要~

#范例二:路由的增加与删除 
[root@www ~]# route del -net 169.254.0.0 netmask 255.255.0.0 dev eth0 
#上面这个动作可以删除掉169.254.0.0/16这个网域!
# 请注意,在删除的时候,需要将路由表上面出现的资讯都写入
# 包括netmask , dev 等等参数喔!注意注意

[root@www ~]# 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.1.11 这个IP ,所以不能直接与192.168.200.254
# 这个网段直接使用MAC 互通!这样说,可以理解吗?

[root@www ~]# route add default gw 192.168.1.250 
#增加预设路由的方法!请注意,只要有一个预设路由就够了喔!
# 同样的,那个192.168.1.250 的IP 也需要能与你的LAN 沟通才行!
# 在这个地方如果你随便设定后,记得使用底下的指令重新设定你的网路
# /etc/init.d/network restart

如果是要进行路由的删除与增加,那就得要参考上面的例子了,其实,使用man route里面的资料就很丰富了!仔细查阅一下啰!你只要记得,当出现『SIOCADDRT: Network is unreachable』这个错误时,肯定是由于gw后面接的IP无法直接与你的网域沟通(Gateway并不在你的网域内),所以,赶紧检查一下是否输入错误啊!

Tips: 
一般来说,鸟哥如果接触到一个新的环境内的主机,在不想要更动原系统的设定档情况下,然后预计使用本书的网路环境设定时,手动的处理就变成:『ifconfig eth0 192.168.1.100; route add default gw 192.168.1.254』这样就搞定了!直接联网与测试。等到完成测试后,再给她/etc/init.d/network restart恢复原系统的网路即可。
鸟哥的图示

小标题的图示 5.1.3 网路参数综合指令: ip

ip 是个指令喔!并不是那个TCP/IP 的IP 啦!这个ip 指令的功能可多了!基本上,他就是整合了ifconfig 与route 这两个指令啰~不过, ip 可以达成的功能却又多更多!真是个相当厉害的指令。如果你有兴趣的话,请自行vi /sbin/ifup ,就知道整个ifup 就是利用ip 这个指令来达成的。好了,如何使用呢?让我们来瞧一瞧先!

[root@www ~]# ip [option] [动作] [指令] 
选项与参数:
option :设定的参数,主要有:
    -s :显示出该装置的统计数据(statistics),例如总接受封包数等;
动作:亦即是可以针对哪些网路参数进行动作,包括有:
    link :关于装置(device) 的相关设定,包括MTU, MAC 位址等等
    addr/address :关于额外的IP 协定,例如多IP 的达成等等;
    route :与路由有关的相关设定

由上面的语法我们可以知道, ip 除了可以设定一些基本的网路参数之外,还能够进行额外的IP 协定,包括多IP 的达成,真是太完美了!底下我们就分三个部分(link, addr, route) 来介绍这个ip 指令吧!


  • 关于装置介面(device) 的相关设定: ip link

ip link 可以设定与装置(device) 有关的相关参数,包括MTU 以及该网路介面的MAC 等等,当然也可以启动(up) 或关闭(down) 某个网路介面啦!整个语法是这样的:

[root@www ~]# ip [-s] link show   <==单纯的查阅该装置相关的资讯 
[root@www ~]# ip link set [device] [动作与参数] 
选项与参数:
show:仅显示出这个装置的相关内容,如果加上-s 会显示更多统计数据;
set :可以开始设定项目, device 指的是eth0, eth1 等等介面代号;
动作与参数:包括有底下的这些动作:
   up|down :启动(up) 或关闭(down) 某个介面,其他参数使用预设的乙太网路;
   address :如果这个装置可以更改MAC 的话,用这个参数修改!
   name :给予这个装置一个特殊的名字;
   mtu :就是最大传输单元啊!

#范例一:显示出所有的介面资讯 
[root@www ~]# ip link show 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:71:85:bd brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 08:00:27:2a:30:14 brd ff:ff:ff:ff:ff:ff
4: sit0: <NOARP> mtu 1480 qdisc noop state DOWN
    link/sit 0.0.0.0 brd 0.0.0.0

[root@www ~]# ip -s link show eth0 
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:71:85:bd brd ff:ff:ff:ff:ff:ff
    RX: bytes packets errors dropped overrun mcast
    314685 3354 0 0 0 0
    TX: bytes packets errors dropped carrier collsns
    2720​​0 199 0 0 0 0

使用ip link show 可以显示出整个装置介面的硬体相关资讯,如上所示,包括网卡位址(MAC)、MTU等等, 比较有趣的应该是那个sit0 的介面了,那个sit0 的介面是用在IPv4 及IPv6 的封包转换上的, 对于我们仅使用IPv4 的网路是没有作用的。lo 及sit0 都是主机内部所自行设定的。而如果加上-s 的参数后,则这个网路卡的相关统计资讯就会被列出来, 包括接收(RX) 及传送(TX) 的封包数量等等,详细的内容与ifconfig 所输出的结果相同的。

#范例二:启动、关闭与设定装置的相关资讯 
[root@www ~]# ip link set eth0 up 
#启动eth0这个装置介面;

[root@www ~]# ip link set eth0 down 
#阿就关闭啊!简单的要命~

[root@www ~]# ip link set eth0 mtu 1000 
#更改MTU的值,达到1000 bytes,单位就是bytes啊!

更新网路卡的MTU 使用ifconfig 也可以达成啊!没啥了不起,不过,如果是要更改『网路卡代号、 MAC 位址的资讯』的话,那可就得使用ip 啰~不过,设定前可能得要先关闭该网路卡,否则会不成功。如下所示:

#范例三:修改网路卡代号、MAC等参数 
[root@www ~]# ip link set eth0 name vbird
SIOCSIFNAME: Device or resource busy
# 因为该装置目前是启动的,所以不能这样做设定。你应该要这样做:

[root@www ~]# ip link set eth0 down        <==关闭介面 
[root@www ~]# ip link set eth0 name vbird  <==重新设定 
[root@www ~]# ip link show                 <==观察一下
2: vbird : <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:71:85:bd brd ff:ff:ff:ff:ff:ff 
#怕了吧!连网路卡代号都可以改变!不过,玩玩后记得改回来啊!
# 因为我们的ifcfg-eth0 还是使用原本的装置代号!避免有问题,要改回来

[root@www ~]# ip link set vbird name eth0  <==介面改回来

[root@www ~]# ip link set eth0 address aa:aa:aa:aa:aa:aa 
[root@www ~]# ip link show eth0 
#如果你的网路卡支援硬体位址(MAC)可以更改的话,上面这个动作就可以更改
# 你的网路卡位址了!厉害吧!不过,还是那句老话,测试完之后请立刻改回来啊!

在这个装置的硬体相关资讯设定上面,包括MTU, MAC 以及传输的模式等等,都可以在这里设定。有趣的是那个address 的项目,那个项目后面接的可是硬体位址(MAC) 而不是IP 喔!很容易搞错啊!切记切记!更多的硬体参数可以使用man ip 查阅一下与ip link 有关的设定。


  • 关于额外的IP 相关设定: ip address

如果说ip link是与OSI七层协定 的第二层资料连阶层有关的话,那么ip address (ip addr)就是与第三层网路层有关的参数啦!主要是在设定与IP有关的各项参数,包括netmask, broadcast等等。

[root@www ~]# ip address show    <==就是查阅IP参数啊!
[root@www ~]# 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@www ~]# ip address show 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:71:85:bd brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.100/24​​ brd 192.168.1.255 scope global eth0
    inet6 fe80::a00:27ff:fe71:85bd/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 08:00:27:2a:30:14 brd ff:ff:ff:ff:ff:ff
4: sit0: <NOARP> mtu 1480 qdisc noop state DOWN
    link/sit 0.0.0.0 brd 0.0.0.0

看到上面那个特殊的字体吗?没错!那就是IP 参数啦!也是ip address 最主要的功能。底下我们进一步来新增虚拟的网路介面试看看:

#范例二:新增一个介面,名称假设为eth0:vbird 
[root@www ~]# ip address add 192.168.50.50/24 broadcast + \ 
> dev eth0 label eth0:vbird 
[root@www ~]# ip address show eth0 
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:71:85:bd 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::a00:27ff:fe71:85bd/64 scope link
       valid_lft forever preferred_lft forever 
#看到上面的特殊字体了吧?多出了一行新的介面,且名称是eth0:vbird
# 至于那个broadcast + 也可以写成broadcast 192.168.50.255 啦!

[root@www ~]# ifconfig 
eth0:vbird Link encap:Ethernet HWaddr 08:00:27:71:85:BD
          inet addr:192.168.50.50 Bcast:192.168.50.255 Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
# 如果使用ifconfig 就能够看到这个怪东西了!可爱吧!^_^

#范例三:将刚刚的介面删除 
[root@www ~]# ip address del 192.168.50.50/24 dev eth0 
#删除就比较简单啊!^_^

  • 关于路由的相关设定: ip route

这个项目当然就是路由的观察与设定啰!事实上, ip route 的功能几乎与route 这个指令差不多,但是,他还可以进行额外的参数设计,例如MTU 的规划等等,相当的强悍啊!

[root@www ~]# ip route show   <==单纯的显示出路由的设定而已 
[root@www ~]# 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@www ~]# ip route show
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100
169.254.0.0/16 dev eth0 scope link metric 1002
default via 192.168.1.254 dev eth0

如上表所示,最简单的功能就是显示出目前的路由资讯,其实跟route 这个指令相同啦!指示必须要注意几个小东西:

  • proto:此路由的路由协定,主要有redirect, kernel, boot, static, ra 等, 其中kernel 指的是直接由核心判断自动设定。
  • scope:路由的范围,主要是link ,亦即是与本装置有关的直接连线。

再来看一下如何进行路由的增加与删除吧!

#范例二:增加路由,主要是本机直接可沟通的网域 
[root@www ~]# ip route add 192.168.5.0/24 dev eth0 
#针对本机直接沟通的网域设定好路由,不需要透过外部的路由器 
[root@www ~]# ip route show
192.168.5.0/24 dev eth0 scope link
....(以下省略)....

#范例三:增加可以通往外部的路由,需透过router喔!
[root@www ~]# ip route add 192.168.10.0/24 via 192.168.5.100 dev eth0 
[root@www ~]# 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@www ~]# ip route add default via 192.168.1.254 dev eth0 
#那个192.168.1.254就是我的预设路由器(gateway)的意思啊!^_^
# 真的记得,只要一个预设路由就OK !

#范例五:删除路由 
[root@www ~]# ip route del 192.168.10.0/24 
[root@www ~]# ip route del 192.168.5.0/24

事实上,这个ip 的指令实在是太博大精深了!刚接触Linux 网路的朋友,可能会看到有点晕~ 不要紧啦!你先会使用ifconfig, ifup , ifdown 与route 即可, 等以后有经验了之后,再继续回来玩ip 这个好玩的指令吧!^_^ 有兴​​趣的话,也可以自行参考ethtool 这个指令喔!(man ethtool)。


小标题的图示 5.1.4 无线网路: iwlist, iwconfig

这两个指令你必须要有无线网卡才能够进行喔!这两个指令的用途是这样的:

  • iwlist:利用无线网卡进行无线AP 的侦测与取得相关的资料;
  • iwconfig:设定无线网卡的相关参数。

这两个指令的应用我们在第四章里面的无线网卡设定谈了很多了,所以这里我们不再详谈,有兴趣的朋友应该先使用man iwlist与man iwconfig了解一下语法,然后再到前一章的无线网路小节查一查相关的用法,就了解了啦!^_^


小标题的图示 5.1.5 手动使用DHCP 自动取得IP 参数: dhclient

如果你是使用DHCP 协定在区域网路内取得IP 的话,那么是否一定要去编辑ifcfg-eth0 内的BOOTPROTO 呢?嘿嘿!有个更快速的作法,那就是利用dhclient 这个指令~因为这个指令才是真正发送dhcp 要求工作的程式啊!那要如何使用呢?很简单!如果不考虑其他的参数,使用底下的方法即可:

[root@www ~]# dhclient eth0

够简单吧!这样就可以立刻叫我们的网路卡以dhcp 协定去尝试取得IP 喔!


大标题的图示 5.2 网路侦错与观察指令

在网路的互助论坛中,最常听到的一句话就是:『高手求救!我的Linux不能连上网路了!』我的天呐!不能上网路的原因多的很!而要完全搞懂也不是一件简单的事情呢!不过,事实上我们可以自己使用测试软体来追踪可能的错误原因,而很多的网路侦测指令其实在Linux里头已经都预设存在了,只要你好好的学一学基本的侦测指令,那么一些朋友在告诉你如何侦错的时候,你应该就立刻可以知道如何来搞定他啰!

其实我们在第四章谈到的五个检查步骤已经是相当详细的网路侦错流程了!只是还有些重要的侦测指令也得要来了解一下才好!


小标题的图示 5.2.1 两部主机两点沟通: ping

这个ping是很重要的指令,ping主要透过ICMP封包 来进行整个网路的状况报告,当然啦,最重要的就是那个ICMP type 0, 8这两个类型,分别是要求回报与主动回报网路状态是否存在的特性。要特别注意的是, ping还是需要透过 IP封包来传送ICMP封包的,而IP封包里面有个相当重要的TTL属性,这是很重要的一个路由特性,详细的IP与ICMP表头资料请参考第二章网路基础的详细介绍。

[root@www ~]# ping [选项与参数] IP 
选项与参数:
-c 数值:后面接的是执行ping 的次数,例如-c 5 ;
-n :在输出资料时不进行IP 与主机名称的反查,直接使用IP 输出(速度较快);
-s 数值:发送出去的ICMP 封包大小,预设为56bytes,不过你可以放大此一数值;
-t 数值:TTL 的数值,预设是255,每经过一个节点就会少一;
-W 数值:等待回应对方主机的秒数。
-M [do|dont] :主要在侦测网路的MTU 数值大小,两个常见的项目是:
   do :代表传送一个DF (Don't Fragment) 旗标,让封包不能重新拆包与打包;
   dont:代表不要传送DF 旗标,表示封包可以在其他主机上拆包与打包

#范例一:侦测一下168.95.1.1这部DNS主机是否存在?
[root@www ~]# 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=1 ttl=245 time=15.4 ms
64 bytes from 168.95.1.1: icmp_seq=2 ttl=245 time=10.0 ms
64 bytes from 168.95.1.1: icmp_seq=3 ttl=245 time=10.2 ms

--- 168.95.1.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2047ms
rtt min/avg/max/mdev = 10.056/11.910/15.453/2.506 ms

ping 最简单的功能就是传送ICMP 封包去要求对方主机回应是否存在于网路环境中,上面的回应讯息当中,几个重要的项目是这样的:

  • 64 bytes:表示这次传送的ICMP封包大小为64 bytes这么大,这是预设值,在某些特殊场合中,例如要搜索整个网路内最大的MTU时,可以使用-s 2000之类的数值来取代;

  • icmp_seq=1:ICMP所侦测进行的次数,第一次编号为1 ;

  • ttl=243:TTL与IP封包内的TTL是相同的,每经过一个带有MAC的节点(node)时,例如router, bridge时, TTL就会减少一,预设的TTL为255 ,你可以透过-t 150之类的方法来重新设定预设TTL数值;

  • time=15.4 ms:回应时间,单位有ms(0.001秒)及us(0.000001秒),一般来说,越小的回应时间,表示两部主机之间的网路连线越良好!

如果你忘记加上-c 3 这样的规定侦测次数,那就得要使用[ctrl]-c 将他结束掉了!

例题:
写一支脚本程式ping.sh ,透过这支脚本程式,你可以用ping 侦测整个网域的主机是否有回应。此外,每部主机的侦测仅等待一秒钟,也仅侦测一次。
答:
由于仅侦测一次且等待一秒,因此ping 的选项为: -W1 -c1 ,而位于本机所在的区网为192.168.1.0/24 ,所以可以这样写(vim /root/bin/ping. sh):
#!/bin/bash
for siteip in $(seq 1 254)
do
	site="192.168.1.${siteip}"
	ping -c1 -W1 ${site} &> /dev/null
	if [ "$?" == "0" ]; then
		echo "$site is UP"
	else
		echo "$site is DOWN"
	fi
done

特别注意一下,如果你的主机与待侦测主机并不在同一个网域内,那么TTL预设使用255 ,如果是同一个网域内,那么TTL预设则使用64喔

  • 用ping追踪路径中的最大MTU数值

    我们由第二章的网路基础里面谈到加大讯框(frame)时,对于网路效能是有帮助的,因为封包打包的次数会减少,加上如果整个传输的媒体都能够接受这个frame而不需要重新进行封包的拆解与重组的话,那么效能当然会更好,那个修改frame大小的参数就是 MTU啦! 好了,现在我们知道网路卡的MTU修改可以透过ifconfig或者是ip 等指令来达成,那么追踪整个网路传输的最大MTU时,又该如何查询?呵呵!最简单的方法当然是透过ping传送一个大封包,并且不许中继的路由器或switch将该封包重组,那就能够处理啦!没错!可以这样的:


    #范例二:找出最大的MTU数值 
    [root@www ~]# ping -c 2 -s 1000 -M do 192.168.1.254
    PING 192.168.1.254 (192.168.1.254) 1000(1028) bytes of data.
    1008 bytes from 192.168.1.254: icmp_seq=1 ttl=64 time=0.311 ms
    # 如果有回应,那就是可以接受这个封包,如果无回应,那就表示这个MTU 太大了。
    
    [root@www ~]# ping -c 2 -s 8000 -M do 192.168.1.254
    PING 192.168.1.254 (192.168.1.254) 8000(8028) bytes of data.
    From 192.168.1.100 icmp_seq=1 Frag needed and DF set (mtu = 1500) 
    #这个错误讯息是说,本地端的MTU才到1500而已,你要侦测8000的MTU
    # 根本就是无法达成的!那要如何是好?用前一小节介绍的ip link 来进行MTU 设定吧!
    
    不过,你需要知道的是,由于 IP封包表头(不含options)就已经占用了20 bytes ,再加上ICMP的表头有8 bytes ,所以当然你在使用-s size的时候,那个封包的大小就得要先扣除(20+8=28)的大小了。因此如果要使用MTU为1500时,就得要下达『 ping -s 1472 -M do xx.yy.zz.ip 』才行啊! 另外,由于本地端的网路卡MTU也会影响到侦测,所以如果想要侦测整个传输媒体的MTU数值,那么每个可以调整的主机就得要先使用ifcofig或ip先将MTU调大,然后再去进行侦测,否则就会出现像上面提供的案例一样,可能会出现错误讯息的! 不过这个MTU不要随便调整啊!除非真的有问题。通常调整MTU的时间是在这个时候:





    • 因为全部的主机群都是在内部的区网,例如丛集架构(cluster) 的环境下, 由于内部的网路节点都是我们可以控制的,因此可以透过修改MTU 来增进网路效能;
    • 因为作业系统预设的MTU 与你的网域不符,导致某些网站可以顺利连线,某些网站则无法连线。以Windows 作业系统作为连线分享的主机时,在Client 端挺容易发生这个问题;

    如果是要连上Internet 的主机,注意不要随便调整MTU ,因为我们无法知道Internet 上面的每部机器能够支援的MTU 到多大,因为......不是我们能够管的到的嘛^_^ !另外,其实每种连线方式都有不同的MTU 值,常见的各种介面的MTU 值分别为︰

    网路介面MTU
    Ethernet1500
    PPPoE1492
    Dial-up(Modem)576


小标题的图示 5.2.2 两主机间各节点分析: traceroute

我们前面谈到的指令大多数都是针对主机的网路参数设定所需要的,而ping 是两部主机之间的回声与否判断, 那么有没有指令可以追踪两部主机之间通过的各个节点(node​​) 通讯状况的好坏呢?举例来说,如果我们连线到yahoo 的速度比平常慢,你觉得是(1)自己的网路环境有问题?(2)还是外部的Internet 有问题?如果是(1) 的话,我们当然需要检查自己的网路环境啊,看看是否又有谁中毒了?但如果是Internet 的问题呢?那只有『等等等』啊!判断是(1) 还是(2) 就得要使用traceroute 这个指令啦!

[root@www ~]# traceroute [选项与参数] IP 
选项与参数:
-n :可以不必进行主机的名称解析,单纯用IP ,速度较快!
-U :使用UDP 的port 33434 来进行侦测,这是预设的侦测协定;
-I :使用ICMP 的方式来进行侦测;
-T :使用TCP 来进行侦测,一般使用port 80 测试
-w :若对方主机在几秒钟内没有回声就宣告不治...预设是5 秒
-p 埠号:若不想使用UDP 与TCP 的预设埠号来侦测,可在此改变埠号。
-i 装置:用在比较复杂的环境,如果你的网路介面很多很复杂时,才会用到这个参数;
         举例来说,你有两条ADSL 可以连接到外部,那你的主机会有两个ppp,
         你可以使用-i 来选择是ppp0 还是ppp​​1 啦!
-g 路由:与-i 的参数相仿,只是-g 后面接的是gateway 的IP 就是了。

#范例一:侦测本机到yahoo去的各节点连线状态 
[root@www ~]# traceroute -n tw.yahoo.com
traceroute to tw.yahoo.com (119.160.246.241), 30 hops max, 40 byte packets
 1 192.168.1.254 0.279 ms 0.156 ms 0.169 ms
 2 172.20.168.254 0.430 ms 0.513 ms 0.409 ms
 3 10.40.1.1 0.996 ms 0.890 ms 1.042 ms
 4 203.72.191.85 0.942 ms 0.969 ms 0.951 ms
 5 211.20.206.58 1.360 ms 1.379 ms 1.355 ms
 6 203.75.72.90 1.123 ms 0.988 ms 1.086 ms
 7 220.128.24.22 11.238 ms 11.179 ms 11.128 ms
 8 220.128.1.82 12.456 ms 12.327 ms 12.221 ms
 9 220.128.3.149 8.062 ms 8.058 ms 7.990 ms
10 * * *
11 119.160.240.1 10.688 ms 10.590 ms 119.160.240.3 10.047 ms
12 * * * <==可能有防火墙装置等情况发生所致

这个traceroute 挺有意思的,这个指令会针对欲连接的目的地之所有node 进行UDP 的逾时等待, 例如上面的例子当中,由鸟哥的主机连接到Yahoo 时,他会经过12 个节点以上,traceroute会主动的对这12 个节点做UDP 的回声等待,并侦测回覆的时间,每节点侦测三次,最终回传像上头显示的结果。你可以发现每个节点其实回覆的时间大约在50 ms 以内,算是还可以的Internet 环境了。

比较特殊的算是第10/12 个,会回传星号的,代表该node 可能设有某些防护措施,让我们发送的封包资讯被丢弃所致。因为我们是直接透过路由器​​转递封包,并没有进入路由器去取得路由器的使用资源,所以某些路由器仅支援封包转递, 并不会接受来自用户端的各项侦测啦!此时就会出现上述的问题。因为traceroute 预设使用UDP 封包,如果你想尝试使用其他封包, 那么-I 或-T 可以试看看啰!

由于目前UDP/ICMP 的攻击层出不穷,因此很多路由器可能就此取消这两个封包的回应功能。所以我们可以使用TCP 来侦测呦!例如使用同样的方法,透过等待时间1 秒,以及TCP 80 埠口的情况下,可以这样做:

[root@www ~]# traceroute -w 1 -n -T tw.yahoo.com

小标题的图示 5.2.3 察看本机的网路连线与后门: netstat

如果你觉得你的某个网路服务明明就启动了,但是就是无法造成连线的话,那么应该怎么办?首先你应该要查询一下自己的网路介面所监听的埠口(port) 来看看是否真的有启动,因为有时候萤幕上面显示的[OK] 并不一定是OK 啊!^_^

[root@www ~]# netstat -[rn]        <==与路由有关的参数 
[root@www ~]# netstat -[antulpc]   <==与网路介面有关的参数
选项与参数:
与路由(route) 有关的参数说明:
-r :列出路由表(route table),功能如同route 这个指令;
-n :不使用主机名称与服务名称,使用IP 与port number ,如同route -n
与网路介面有关的参数:
-a :列出所有的连线状态,包括tcp/udp/unix socket 等;
-t :仅列出TCP 封包的连线;
-u :仅列出UDP 封包的连线;
-l :仅列出有在Listen (监听) 的服务之网路状态;
-p :列出PID 与Program 的档名;
-c :可以设定几秒钟后自动更新一次,例如-c 5 每五秒更新一次网路状态的显示;

#范例一:列出目前的路由表状态,且以IP及port number显示: 
[root@www ~]# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.1.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.1.254 0.0.0.0 UG 0 0 0 eth0
# 其实这个参数就跟route -n 一模一样,对吧!这不是netstat 的主要功能啦!

#范例二:列出目前的所有网路连线状态,使用IP与port number 
[root@www ~]# netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State 
....(中间省略).... 
tcp 0 0 127.0.0.1:25       0.0.0.0:* LISTEN
 tcp 0 52 192.168.1.100:22 192.168.1.101: 1937 ESTABLISHED  
tcp 0 0 :::22 :::*                 LISTEN 
....(中间省略)....
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 11075 @/var/run/hald/dbus-uukdg1qMPh
unix 2 [ ACC ] STREAM LISTENING 10952 /var/run/dbus/system_bus_socket
unix 2 [ ACC ] STREAM LISTENING 11032 /var/run/acpid.socket
....(底下省略)....

netstat 的输出主要分为两大部分,分别是TCP/IP 的网路介面部分,以及传统的Unix socket 部分。还记得我们在基础篇里面曾经谈到档案的类型吗?那个socket 与FIFO 档案还记得吧?那就是在Unix 介面用来做为程式资料交流的介面了,也就是上头表格内看到的Active Unix domain sockets 的内容啰~

通常鸟哥都是建议加上『 -n 』这个参数的,因为可以避过主机名称与服务名称的反查,直接以IP 及埠口号码(port number) 来显示,显示的速度上会快很多!至于在输出的讯息当中, 我们先来谈一谈关于网路连线状态的输出部分,他主要是分为底下几个大项:

  • Proto:该连线的封包协定,主要为TCP/UDP等封包;
  • Recv-Q:非由使用者程式连接所复制而来的总bytes数;
  • Send-Q:由远端主机所传送而来,但不具有ACK标志的总bytes数,意指主动连线SYN或其他标志的封包所占的bytes数;
  • Local Address:本地端的位址,可以是IP (-n参数存在时),也可以是完整的主机名称。使用的格是就是『 IP:port 』只是IP的格式有IPv4及IPv6的差异。如上所示,在port 22的介面中,使用的:::22就是针对IPv6的显示,事实上他就相同于0.0.0.0:22的意思。至于port 25仅针对lo介面开放,意指Internet基本上是无法连接到我本机的25埠口啦!
  • Foreign Address:远端的主机IP与port number
  • stat:状态列,主要的状态含有:
    • ESTABLISED:已建立连线的状态;
    • SYN_SENT:发出主动连线(SYN标志)的连线封包;
    • SYN_RECV:接收到一个要求连线的主动连线封包;
    • FIN_WAIT1:该插槽服务(socket)已中断,该连线正在断线当中;
    • FIN_WAIT2:该连线已挂断,但正在等待对方主机回应断线确认的封包;
    • TIME_WAIT:该连线已挂断,但socket还在网路上等待结束;
    • LISTEN:通常用在服务的监听port !可使用『 -l 』参数查阅。

基本上,我们常常谈到的netstat的功能,就是在观察网路的连线状态了,而网路连线状态中,又以观察『我目前开了多少的port在等待用户端的连线』以及『目前我的网路连线状态中,有多少连线已建立或产生问题』最常见。那你如何了解与观察呢?通常鸟哥是这样处理的:

#范例三:秀出目前已经启动的网路服务 
[root@www ~]# netstat -tulnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:34796 0.0.0.0:* LISTEN 987/rpc.statd
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 969/rpcbind
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1231/master
tcp 0 0 :::22 :::* LISTEN 1155/sshd
udp 0 0 0.0.0.0:111 0.0.0.0:* 969/rpcbind
....(底下省略).... 
#上面最重要的其实是那个-l的参数,因为可以仅列出有在Listen的port

你可以发现很多的网路服务其实仅针对本机的lo 开放而已,网际网路是连接不到该埠口与服务的。而由上述的资料我们也可以看到,启动port 111 的,其实就是rpcbind 那只程式,那如果想要关闭这个埠口, 你可以使用kill 删除PID 969,也可以使用killall 删除rpcbind 这个程序即可。如此一来, 很轻松的你就能知道哪个程式启动了哪些埠口啰!

#范例四:观察本机上头所有的网路连线状态 
[root@www ~]# netstat -atunp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 969/rpcbind
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1155/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1231/master
tcp 0 52 192.168.1.100:22 192.168.1.101:1937 ESTABLISHED 4716/0 
....(底下省略)....

看到上头的特殊字体吧?那代表目前已经建立连线的一条网路连线,他是由远端主机192.168.1.101启动一个大于1024的埠口向本地端主机192.168.1.100的port 22进行的一条连线,你必须要想起来的是:『Client端是 ​​随机取一个大于1024以上的port进行连线』,此外『只有root可以启动小于1024以下的port』,那就看的懂上头那条连线啰!如果这条连线你想要砍掉他的话,看到最右边的4716了没?kill会用吧!^_^

至于传统的Unix socket 的资料,记得使用man netstat 查阅一下吧!这个Unix socket 通常是用在一些仅在本机上运作的程式所开启的插槽介面档, 例如X Window 不都是在本机上运作而已吗?那何必启动网路的port 呢?当然可以使用Unix socket 啰,另外,例如Postfix 这​​一类的网路伺服器,由于很多动作都是在本机上头来完成的, 所以以会占用很多的Unix socket 喔!

例题:
请说明服务名称与port number 的对应在Linux 当中,是用那个档案来设定对应的?
答:
/etc/services

小标题的图示 5.2.4 侦测主机名称与IP 对应: host, nslookup

关于主机名称与IP 的对应中,我们主要介绍的是DNS 用户端功能的dig 这个指令。不过除了这个指令之外, 其实还有两个更简单的指令,那就是host 与nslookup 啦!底下让我们来聊聊这两个指令吧!


  • host

这个指令可以用来查出某个主机名称的IP 喔!举例来说,我们想要知道tw.yahoo.com 的IP 时,可以这样做:

[root@www ~]# host [-a] hostname [server] 
选项与参数:
-a :列出该主机详细的各项主机名称设定资料
[server] :可以使用非为/etc/resolv.conf 的DNS 伺服器IP 来查询。

#范例一:列出tw.yahoo.com的IP 
[root@www ~]# host tw.yahoo.com
tw.yahoo.com is an alias for tw-cidr.fyap.b.yahoo.com.
tw-cidr.fyap.b.yahoo.com is an alias for tw-tpe-fo.fyap.b.yahoo.com.
tw-tpe-fo.fyap.b.yahoo.com has address 119.160.246.241

瞧!IP是119.160.246.241啊!很简单就可以查询到IP了!那么这个IP是向谁查询的呢?其实就是写在/etc/resolv.conf 那个档案内的DNS伺服器IP啦!如果不想要使用该档案内的主机来查询,也可以这样做:

[root@www ~]# host tw.yahoo.com 168.95.1.1 
Using domain server:
 Name: 168.95.1.1
Address: 168.95.1.1#53
Alias​​es:

tw.yahoo.com is an alias for tw-cidr.fyap.b.yahoo.com.
tw-cidr.fyap.b.yahoo.com is an alias for tw-tpe-fo.fyap.b.yahoo.com.
tw-tpe-fo.fyap.b.yahoo.com has address 119.160.246.241

会告诉我们所使用来查询的主机是哪一部呐!这样就够清楚了吧!不过,再怎么清楚也比不过dig 这个指令的,所以这个指令仅是参考参考啦!


  • nslookup

这玩意儿的用途与host基本上是一样的,就是用来作为IP与主机名称对应的检查,同样是使用/etc/resolv.conf 这个档案来作为DNS伺服器的来源选择。

[root@www ~]# nslookup [-query=[type]] [hostname|IP] 
选项与参数:
-query=type:查询的类型,除了传统的IP 与主机名称对应外,DNS 还有很多资讯,
             所以我们可以查询很多不同的资讯,包括mx, cname 等等,
             例如: -query=mx 的查询方法!

#范例一:找出www.google.com的IP 
[root@www ~]# nslookup www.google.com 
Server: 168.95.1.1
Address: 168.95.1.1#53

Non-authoritative answer:
www.google.com canonical name = www.l.google.com.
Name: www.l.google.com
Address: 74.125.71.106 
....(底下省略)....

#范例二:找出168.95.1.1的主机名称 
[root@www ~]# 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 ,我们会在第十九章DNS伺服器那时再来好好谈一谈吧!


大标题的图示 5.3 远端连线指令与即时通讯软体

啥是远端连线呢?其实就是在不同的电脑之间进行登入的情况啦!我们可以透过telnet, ssh 或者是ftp 等协定来进行远端主机的登入。底下我们就分别来介绍一下这些基本的指令吧!这里仅是谈到用户端功能喔, 相关的伺服器我们则会在后续进行说明的。


小标题的图示 5.3.1 终端机与BBS 连线: telnet

telnet是早期我们在个人电脑上面要连结到伺服器工作时,最重要的一个软体了!他不但可以直接连接到伺服器上头,还可以用来连结BBS呢!非常棒!不过, telnet本身的资料在传送的时候是使用明码(原始的资料,没有加密) ,所以资料在Internet上面跑的时候,会比较危险一点(就怕被别人监听啊)。更详细的资料我们会在第十一章远端连线伺服器内做介绍的。

[root@www ~]# telnet [host|IP [port]]

#范例一:连结到台湾相当热门的PTT BBS站ptt.cc 
[root@www ~]# yum install telnet   <==预设没有安装这软体 
[root@www ~]# telnet ptt.cc
    欢迎来到批踢踢实业坊目前有【100118】名使用者与您一同对抗炎炎夏日。

请输入代号,或以guest 参观,或以new 注册:            
[高手召集令] 台湾骇客年会暑假与你骇翻南港http://reg.hitcon.org/hit2011
要学电脑,首选台湾大学资讯训练班! http://tinyurl.com/3z42apw

如上所示,我们可以透过telnet轻易的连结到BBS上面,而如果你的主机有开启telnet伺服器服务的话,同样的利用『 telnet IP 』并且输入帐号与密码之后,就能够登入主机了。另外,在Linux上的telnet软体还提供了Kerberos的认证方式,有兴趣的话请自行参阅man telnet的说明。

除了连结到伺服器以及连结到BBS 站之外, telnet 还可以用来连结到某个port (服务) 上头呐!举例来说,我们可以用telnet 连接到port 110 ,看看这个port 是否有正确的启动呢?

#范例二:侦测本机端的110这个port是否正确启动?
[root@www ~]# telnet localhost 110
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused
# 如果出现这样的讯息,代表这个port 没有启动或者是这个连线有问题,
# 因为你看到那个refused 嘛!

[root@www ~]# telnet localhost 25
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 www.centos.vbird ESMTP Postfix
ehlo localhost
250-www.centos.vbird
250-PIPELINING
250-SIZE 10240000
....(中间省略)....
250 DSN
quit
221 2.0.0 Bye
Connection closed by foreign host.

瞧!根据输出的结果,我们就能够知道这个通讯协定(port number 提供的通讯协定功能) 是否有成功的启动呐!而在每个port 所监听的服务都有其特殊的指令,例如上述的port 25 就是在本机介面所提供的电子邮件服务, 那个服务所支援的指令就如同上面使用的资料一样,但是其他的port 就不见得支援这个『 ehlo 』的命令, 因为不同的port 有不同的程式嘛!所以当然支援的命令就不同啰!


小标题的图示 5.3.2 FTP 连线软体: ftp, lftp

现在的人们由于有高容量的email 可以用,因此传送档案可以很轻松的透过email 。不过email 还是有单封信件容量限制, 如果想要一口气传送个几百MB 的档案,恐怕还是得要透过FTP 这个通讯协定才行啊!文字介面的FTP 软体主要有ftp, lftp 两个,图形介面的呢?在CentOS 上面预设有gftp 这个好用的东东。在这里我们仅介绍文字介面的两个指令而已。 


  • ftp

ftp 这个指令很简单,用在处理FTP 伺服器的下载资料啦。由于鸟哥所在的位置在昆山科大,因此这里使用昆山科大的FTP 伺服器为例:

[root@www ~]# ftp [host|IP] [port]

#范例一:连线到昆山科大去看看 
[root@www ~]# yum install ftp 
[root@www ~]# ftp ftp.ksu.edu.tw
Connected to ftp.ksu.edu.tw (120.114.150.21).
220---------- Welcome to Pure-FTPd [privsep] ----------
220-You are user number 1 of 50 allowed.
220-Local time is now 16:25. Server port: 21.
220-Only anonymous FTP is allowed here   <==讯息要看啊!这个FTP仅支援匿名
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 5 minutes of inactivity.
Name (ftp.ksu.edu.tw:root): anonymous   <==鸟哥这里用匿名登入!
230 Anonymous user logged in             <==嗯!确实是匿名登入了!
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> <==最终登入的结果看起来是这样!
ftp> help          <==提供需要的指令说明,可以常参考!
ftp> dir <==显示远端伺服器的目录内容(档名列表) 
ftp> cd /pub         <==变换目录到/pub当中 
ftp> get filename    <==下载单一档案,档名为filename 
ftp> mget filename* <==下载多个档案,可使用万用字元* 
ftp> put filename    <==上传filename这个档案到伺服器上 
ftp> delete file     <==删除主机上的file这个档案 
ftp> mkdir dir                                   <==建立dir这个目录 
ftp> lcd /home       <==切换『本地端主机』的工作目录 
ftp> passive         <==启动或关闭passive模式 
ftp> binary          <==资料传输模式设定为binary格式 
ftp> bye             <==结束ftp软体的使用

FTP其实算是一个很麻烦的协定,因为他使用两个port分别进行命令与资料的交流,详细的资料我们会在第二十一章的FTP伺服器内详谈,这里我们先单纯的介绍一下如何使用ftp这个软体。首先我们当然是需要登入啰,所以在上头的表格当中我们当然需要填入帐号与密码了。不过由于昆山科大仅提供匿名登入,而匿名登入者的帐号就是『 anonymous 』所以直接填写那个帐号即可。如果是私人的FTP时,才需要提供一组完整的帐号与密码啦!

登入FTP 主机后,就能够使用ftp 软体的功能进行上传与下载的动作,几个常用的ftp 内指令如上表,不过,鸟哥建议你可以连到大学的FTP 网站后,使用help (或问号? ) 来参考可用的指令,然后尝试下载以测试使用一下这个指令吧!这样以后没有浏览器的时候,你也可以到ftp 下载了呢!不错吧!另外你要注意的是,离开ftp 软体时,得要输入『 bye 』喔!不是『 exit 』啦!

如果由于某些理由,让你的FTP 主机的port 开在非正规的埠口时,那你就可以利用底下的方式来连接到该部主机喔!

[root@www ~]# ftp hostname 318 
#假设对方主机的ftp服务开启在318这个port啊!


  • lftp (自动化脚本)

单纯使用ftp 总是觉得很麻烦,有没有更快速的ftp 用户软体呢?让我们可以使用类似网址列的方式来登入FTP 伺服器啊?有的,那就是lftp 的功能了!lftp 预设使用匿名登入FTP 伺服器,可以使用类似网址列的方式取得资料, 使用上比单纯的ftp 要好用些。此外,由于可在指令列输入帐号/密码,可以辅助进行程式脚本的设计喔!

[root@www ~]# lftp [-p port] [-u user[,pass]] [host|IP] 
[root@www ~]# lftp -f filename 
[root@www ~]# lftp -c "commands " 
选项与参数:
-p :后面可以直接接上远端FTP 主机提供的port
-u :后面则是接上帐号与密码,就能够连接上远端主机了
      如果没有加帐号密码, lftp 预设会使用anonymous 尝试匿名登入
-f :可以将指令写入脚本中,这样可以帮助进行shell script 的自动处理喔!
-c :后面直接加上所需要的指令。

#范例一:利用lftp登入昆山科大的FTP伺服器 
[root@www ~]# yum install lftp 
[root@www ~]# lftp ftp.ksu.edu.tw 
lftp ftp.ksu.edu.tw:~> #瞧!一下子就登入了!很快乐吧!^_^!你同样可使用help去查阅相关内部指令 

至于登入FTP 主机后,一样可以使用『help』来显示出可以执行的指令,与ftp 很类似啦!不过多了书签的功能,而且也非常的类似bash 呐!很不错呦!除了这个好用的文字介面的FTP 软体之外,事实上还有很多图形介面的好用软体呢!最常见的就是gftp 了,非常的容易上手喔!CentOS 本身就有提供gftp 了,你可以拿出原版的光碟来安装,然后进入X Window 后, 启动一个shell ,输入『 gftp 』就能够发现他的好用啦!

如果你想要定时的去捉下昆山科大FTP 网站下的/pub/CentOS/RPM-GPG* 的档案时,那么那个脚本应该要怎么写呢?我们尝试来写写看吧!

#使用档案配合lftp去处理时: 
[root@www ~]# mkdir lftp; cd lftp 
[root@www lftp]# vim lftp.ksu.sh 
open ftp.ksu.edu.tw
cd /pub/CentOS/
mget -c -d RPM-GPG*
bye 
[root@www lftp]# lftp -f lftp.ksu.sh 
[root@www lftp]# ls
lftp.ksu.sh RPM-GPG-KEY-CentOS-3 RPM-GPG-KEY-CentOS-4 RPM-GPG-KEY-CentOS-6
RPM-GPG-KEY-beta RPM-GPG-KEY-centos4 RPM-GPG-KEY-CentOS-5 

#直接将要处理的动作加入lftp指令中 
[root@www lftp]# vim lftp.ksu.sh 
lftp -c "open ftp.ksu.edu.tw
cd /pub/CentOS/
mget -c -d RPM-GPG*
bye" 
[root@www lftp]# sh lftp.ksu.sh

若为非匿名登入时,则可以使用『 open -u username,password hostname 』修改lftp.ksu.sh 的第一行!如果再将这个脚本写入crontab 当中,你就可以定时的以FTP 进行上传/下载的功能啰!这就是文字指令的好处!


小标题的图示 5.3.3 图形介面的即时通讯软体: pidgin (gaim 的延伸)

现在应该大家都知道什么是MSN, 雅虎即时​​通以及其他的通讯软体吧?那么要连上这些伺服器时,该怎么处理哪?很简单,在X Window 底下使用pidgin 就好了!简直简单到不行~请先进入X Window 系统,然后经过『应用程式』--> 『网际网路』-->『Pidgin 网路即时通』启动他即可(请注意你必须​​已经安装了pidgin 了,可用yum install pidgin 处理)。

不过,伤脑筋的是,我们所安装的basic server 类型的CentOS 6.x 主要做为伺服器之用,所以连图形介面也没有给我们。所以,鸟哥又用另外一部主机安装成Desktop 的模式,利用该部主机来测试pidgin 这玩意儿的!因此, 底下的练习你也可以先略过,等到你安装另一部Desktop linux 时再来玩玩!

pidgin 的欢迎画面
图5.3-1、pidgin 的欢迎画面

在上图中按下『新增』,然后你会看到如下的画面:

pidgin 支援的即时通讯资料
图5.3-2、pidgin 支援的即时通讯资料

很神奇的是, pidgin 支援的通讯有够多的!我们使用MSN 来作个解释好了:

设定MSN 的帐号示意图
图5.3-3、设定MSN 的帐号示意图

如上图,在画面中输入你的帐号与密码,如果是在公用的电脑上,千万不要按下『记住密码』项目喔!按下新增后, pidgin 预设就会尝试登入了!登入后的画面如下所示:

使用pidgin 的MSN 方式进行连天啰
图5.3-4、使用pidgin 的MSN 方式进行连天啰

如果想要登出了,那么就按下图5.3-4 最右边那个视窗,将『启动』的那个方框勾选取消,你就直接登出啰!


大标题的图示 5.4 文字介面网页浏览

什么?文字界面竟然有浏览器!别逗了好不好?呵呵!谁有那个时间在逗你呦!真的啦!有这个东西, 是在文字界面下上网浏览的好工具!分别是links 及wget 这两个宝贝蛋,但是,你必需要确定你已经安装了这两个套件才行。好佳在的是,CentOS 预设这两个玩意儿都有安装喔!底下就让我们来聊一聊这两个好用的家伙吧!


小标题的图示 5.4.1 文字浏览器:links

其实早期鸟哥最常使用的是lynx 这个文字浏览器,不过CentOS 从5.x 以后预设使用的文字浏览器是links 这一支,这两支的使用方式又非常的类似,因此,在这一版当中,我们就仅介绍links 啰!若对lynx 有兴趣的话, 自己man 一下吧!

这个指令可以让我们来浏览网页,但鸟哥认为,这个档案最大的功能是在『 查阅Linux本机上面以HTML语法写成的文件资料(document)』怎么说呢?如果你曾经到Linux本机底下的/usr/share/doc这个目录看过文件资料的话,就会常常发现一些网页档案,使用vi去查阅时,老是看到一堆HTML的语法!有碍阅读啊~这时候使用links就是个好方法啦!可以看的清清楚楚啊!^_^

[root@www ~]# links [options] [URL] 
选项与参数:
-anonymous [0|1]:是否使用匿名登入的意思;
-dump [0|1] :是否将网页的资料直接输出到standard out 而非links 软体功能
-dump_charset :后面接想要透过dump 输出到萤幕的语系编码,big5 使用cp950 喔

#范例一:浏览Linux kernel网站 
[root@www ~]# links http://www.kernel.org

当我直接输入links 网站网址后,就会出现如下的图示:

使用links 查询网页资料的显示结果
图5.4-1、使用links 查询网页资料的显示结果

上面这个画面的基本说明如下:

  • 进入画面之后,由于是文字型态,所以编排可能会有点位移!不过不打紧!不会影响我们看咚咚!
  • 这个时候可以使用『上下键』来让游标在上面的选项当中(如信箱、书签等等的),按下Enter 就进入该页面
  • 可以使用『左右键』来移动『上一页或下一页』
  • 一些常见功能按键:
    • h:history ,曾经浏览过的URL 就显示到画面中
    • g:Goto URL,按g 后输入网页位址(URL) 如:http://www.abc.edu/等
    • d:download,将该连结资料下载到本机成为档案;
    • q:Quit,离开links 这个软体;
    • o:Option,进入功能参数的设定值修改中,最终可写入~/.elinks/elinks.conf 中
    • Ctrl+C :强迫切断links 的执行。
    • 方向键:
      • 上:移动游标至本页中"上一个可连结点" .
      • 下:移动游标至本页中"下一个可连结点" .
      • 左:back. 跳回上一页.
      • 右:进入反白游标所连结之网页.
      • ENTER 同滑鼠"右" 键.

至于如果是浏览Linux 本机上面的网页档案,那就可以使用如下的方式:

[root@www ~]# links /usr/share/doc/HTML/index.html

在鸟哥的CentOS 6.x 当中,有这么一个档案,我就可以利用links 来取出察看呐!显示的结果有点像底下这样:

使用links 查询本机的HTML 文件档案
图5.4-2、使用links 查询本机的HTML 文件档案

当然啦!因为你的环境可能是在Linux 本机的tty1~tty6 ,所以无法显示出中文,这个时候你就得要设定为: 『LANG=en_US』之类的语系设定才行喔!另外,如果某些时刻你必须上网点选某个网站以自动取得更新时。举例来说,早期的自动线上更新主机名称系统,仅支援网页更新,那你如何进行更新呢?嘿嘿!可以使用links 喔!利用 -dump 这个参数处理先:

#透过links将tw.yahoo.com的网页内容整个抓下来储存 
[root@www ~]# links -dump http://tw.yahoo.com > yahoo.html

#某个网站透过GET功能可以上传帐号为user密码为pw ,用文字介面处理为: 
[root@www ~]# links -dump \ 
> http://some.site.name/web.php?name= user&password=pw > testfile

上面的网站后面有加个问号(?) 对吧?后面接的则是利用网页的『 GET 』功能取得的各项变数资料, 利用这个功能,我们就可以直接点选到该网站上啰!非常的方便吧!而且会将执行的结果输出到testfile 档案中,不过如果网站提供的资料是以『 POST 』为主的话,那鸟哥就不知道如何搞定了。GET 与POST 是WWW 通讯协定中,用来将资料透过浏览器上传到伺服器端的一种方式, 一般来说,目前讨论区或部落格等,大多使用可以支援较多资料的POST 方式上传啦!关于GET 与POST 的相关资讯我们会在第二十章WWW 伺服器当中再次的提及!


小标题的图示 5.4.2 文字介面下载器: wget

如果说links 是在进行网页的『浏览』,那么wget 就是在进行『网页资料的取得』。举例来说,我们的Linux 核心是放置在www.kernel.org 内,主要同时提供ftp 与http 来下载。我们知道可以使用lftp 来下载资料,但如果想要用浏览器来下载呢?那就利用wget 吧!

[root@www ~]# wget [option] [网址] 
选项与参数:
若想要连线的网站有提供帐号与密码的保护时,可以利用这两个参数来输入喔!
--http-user=usrname
--http-password=password
--quiet :不要显示wget 在抓取资料时候的显示讯息
更多的参数请自行参考man wget 吧!^_^

#范例一:请下载2.6.39版的核心 
[root@www ~]# wget \ 
> http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.39.tar. bz2
--2011-07-18 16:58:26-- http://www.kernel.org/pub/linux/kernel/v2.6/..
Resolving www.kernel.org... 130.239.17.5, 149.20.4.69, 149.20.20.133, ...
Connecting to www.kernel.org|130.239.17.5|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 76096559 (73M) [application/x-bzip2]
Saving to: `linux-2.6.39.tar.bz2'

88% [================================> ] 67,520,536 1.85M/s eta 7s

你瞧瞧~很可爱吧!不必透过浏览器,只要知道网址后,立即可以进行档案的下载, 又快速又方便,还可以透过proxy 的帮助来下载呢!透过修改/etc/wgetrc 来设定你的代理伺服器:

[root@www ~]# vim /etc/wgetrc 
#http_proxy = http://proxy.yoyodyne.com:18023/   <==找到底下这几行,大约在78行
#ftp_proxy = http://proxy.yoyodyne.com:18023/
#use_proxy = on

#将他改成类似底下的模样,记得,你必须要有可接受的proxy主机才行!
http_proxy = http://proxy.ksu.edu.tw:3128/
use_proxy = on

大标题的图示 5.5 封包撷取功能

很多时候由于我们的网路连线出现问题,使用类似ping的软体功能却又无法找出问题点,最常见的是因为路由与IP转递后所产生的一些困扰(请参考防火墙与NAT主机部分),这个时候要怎么办?最简单的方法就是『分析封包的流向』啰!透过分析封包的流向,我们可以了解一条连线应该是如何进行双向的连线的动作,也就会清楚的了解到可能发生的问题所在了!底下我们就来谈一谈这个tcpdump与图形介面的封包分析软体吧!


小标题的图示 5.5.1 文字介面封包撷取器: tcpdump

说实在的,对于tcpdump这个软体来说,你甚至可以说这个软体其实就是个骇客软体,因为他不但可以分析封包的流向,连封包的内容也可以进行『监听』,如果你使用的传输资料是明码的话,不得了,在router或hub上面就可能被人家监听走了!我们在第二章谈到的CSMA/CD 流程中,不是说过有所谓的『监听软体』吗?这个tcpdump就是啦!很可怕呐!所以,我们也要来了解一下这个软体啊!(注:这个tcpdump必须使用root的身份执行)

[root@www ~]# tcpdump [-AennqX] [-i介面] [-w储存档名] [-c次数] \ 
                      [-r档案] [所欲撷取的封包资料格式] 
选项与参数:
-A :封包的内容以ASCII 显示,通常用来捉取WWW 的网页封包资料。
-e :使用资料连接层(OSI 第二层) 的MAC 封包资料来显示;
-nn:直接以IP 及port number 显示,而非主机名与服务名称
-q :仅列出较为简短的封包资讯,每一行的内容比较精简
-X :可以列出十六进位(hex) 以及ASCII 的封包内容,对于监听封包​​内容很有用
-i :后面接要『监听』的网路介面,例如eth0, lo, ppp0 等等的介面;
-w :如果你要将监听所得的封包资料储存下来,用这个参数就对了!后面接档名
-r :从后面接的档案将封包资料读出来。那个『档案』是已经存在的档案,
     并且这个『档案』是由-w 所制作出来的。
-c :监听的封包数,如果没有这个参数, tcpdump 会持续不断的监听,
     直到使用者输入[ctrl]-c 为止。
所欲撷取的封包资料格式:我们可以专门针对某些通讯协定或者是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@www ~]# 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 65535 bytes
17:01:47.360523 IP 192.168.1.101.1937 > 192.168.1.100.22: Flags [.], ack 196, win 65219, 
17:01:47.362139 IP 192.168.1.100.22 > 192.168.1.101.1937: Flags [P.], seq 196:472, ack 1,
17:01:47.363201 IP 192.168.1.100.22 > 192.168.1.101.1937: Flags [P.], seq 472:636, ack 1,
17:01:47.363328 IP 192.168.1.101.1937 > 192.168.1.100.22: Flags [.], ack 636, win 64779, 
<==按下[ctrl]-c之后结束 
6680 packets captured               <==捉下来的封包数量 
14250 packets received by filter    <==由过滤所得的总封包数量 
7512 packets dropped by kernel      <==被核心所丢弃的封包

如果你是第一次看tcpdump的man page时,肯定一个头两个大,因为tcpdump几乎都是分析封包的表头资料,使用者如果没有简易的网路封包基础,要看懂粉难呐!所以,至少你得要回到网路基础里面去将TCP封包的表头资料理解理解才好啊!^_^!至于那个范例一所产生的输出范例中,我们可以约略区分为数个栏位,我们以范例一当中那个特殊字体行来说明一下:

  • 17:01:47.362139:这个是此封包被撷取的时间,『时:分:秒』的单位;
  • IP:透过的通讯协定是IP ;
  • 192.168.1.100.22 >:传送端是192.168.1.100这个IP,而传送的port number为22,你必须要了解的是,那个大于(>)的符号指的是封包的传输方向喔!
  • 192.168.1.101.1937:接收端的IP是192.168.1.101,且该主机开启port 1937来接收;
  • [P.], seq 196:472:这个封包带有PUSH的资料传输标志,且传输的资料为整体资料的196~472 byte;
  • ack 1:ACK的相关资料。

最简单的说法,就是该封包是由192.168.1.100传到192.168.1.101,透过的port是由22到1937 ,使用的是PUSH的旗标,而不是SYN之类的主动连线标志。呵呵!不容易看的懂吧!所以说,上头才讲请务必到TCP表头资料的部分去瞧一瞧的啊!

再来,一个网路状态很忙的主机上面,你想要取得某部主机对你连线的封包资料而已时, 使用tcpdump 配合管线命令与正规表示法也可以,不过,毕竟不好捉取!我们可以透过tcpdump 的表示法功能,就能够轻易的将所需要的资料独立的取出来。在上面的范例一当中,我们仅针对eth0 做监听,所以整个eth0 介面上面的资料都会被显示到萤幕上, 不好分析啊!那么我们可以简化吗?例如只取出port 21 的连线封包,可以这样做:

[root@www ~]# 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.101.1240 > 192.168.1.100. 21 : . ack 1 win 65535
01:54:37.96 IP 192.168.1.100. 21 > 192.168.1.101.1240: P 1:21(20) ack 1 win 5840
01:54:38.12 IP 192.168.1.101.1240 > 192.168.1.100. 21 : . ack 21 win 65515
01:54:42.79 IP 192.168.1.101.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.101.1240: . ack 17 win 5840
01:54:42.79 IP 192.168.1.100. 21 > 192.168.1.101.1240: P 21:55(34) ack 17 win 5840

瞧!这样就仅提出port 21 的资讯而已,且仔细看的话,你会发现封包的传递都是双向的, client 端发出『要求』而server 端则予以『回应』,所以,当然是有去有回啊!而我们也就可以经过这个封包的流向来了解到封包运作的过程。举例来说:

  1. 我们先在一个终端机视窗输入『 tcpdump -i lo -nn 』 的监听,
  2. 再另开一个终端机视窗来对本机(127.0.0.1) 登入『ssh localhost』

那么输出的结果会是如何?

[root@www ~]# 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 <mss 16396,sackOK,timestamp 236681316 0,nop,wscale 2>
4 11:02:54.253831 IP 127.0.0.1.22 > 127.0.0.1.32936: S 920046702:920046702(0) 
    ack 933696133 win 32767 <mss 16396,sackOK,timestamp 236681316 236681316,nop,
   wscale 2>
5 11:02:54.253871 IP 127.0.0.1.32936 > 127.0.0.1.22: . ack 1 win 8192 <nop,
   nop,timestamp 236681316 236681316>
6 11:02:54.272124 IP 127.0.0.1.22 > 127.0.0.1.32936: P 1:23(22) ack 1 win 8192
   <nop,nop,timestamp 236681334 236681316>
7 11:02:54.272375 IP 127.0.0.1.32936 > 127.0.0.1.22: . ack 23 win 8192 <nop,
   nop,timestamp 236681334 236681334>

上表显示的头两行是tcpdump 的基本说明,然后:

  • 第3 行显示的是『来自client 端,带有SYN 主动连线的封包』,
  • 第4 行显示的是『来自server 端,除了回应client 端之外(ACK),还带有SYN 主动连线的标志;
  • 第5 行则显示client 端回应server 确定连线建立(ACK)
  • 第6 行以后则开始进入资料传输的步骤。

从第3-5行的流程来看,熟不熟悉啊?没错!那就是三向交握的基础流程啦!够有趣吧!不过tcpdump之所以被称为骇客软体之一可不止上头介绍的功能呐!上面介绍的功能可以用来作为我们主机的封包连线与传输的流程分析,这将有助于我们了解到封包的运作,同时了解到主机的防火墙设定规则是否有需要修订的地方。

更神奇的使用要来啦!如果我们使用tcpdump 在router 上面监听『明码』的传输资料时, 例如FTP 传输协定,你觉得会发生什么问题呢?我们先在主机端下达『 tcpdump -i lo port 21 -nn -X 』然后再以ftp 登入本机,并输入帐号与密码, 结果你就可以发现如下的状况:

[root@www ~]# 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..AK@.@.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..JO@.@.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 监听(1)来自eth0 介面卡且(2)通讯协定为port 22 ,(3)封包来源为192.168.1.101 的封包资料?
答:
tcpdump -i eth0 -nn 'port 22 and src host 192.168.1.101'


小标题的图示 5.5.2 图形介面封包撷取器: wireshark

tcpdump是文字介面的封包撷取器,那么有没有图形介面的?有啊!那就是wireshark ( 注1 )这套软体。这套软体早期称为ethereal ,目前同时提供文字介面的tethereal以及图形介面的wireshark两个咚咚。由于我们当初安装时预设并没有装这套,因此妳必须要先使用yum去网路安装喔!也可以拿出光碟来安装啦!有两套需要安装,分别是文字介面的wireshark以及图形介面的wireshark-gnome软体。安装方式如下:

[root@www ~]# yum install wireshark wireshark-gnome

启动这套软体的方法很简单,你必须要在X Window 底下,透过『应用程式』-->『网际网路』-->『wireshark network analyzer』就可以启动啦!启动的画面如下所示:

wireshark 的使用示意图
图5.5-1、wireshark 的使用示意图

其实这一套软体功能非常强大!鸟哥这里仅讲简单的用法,若有特殊需求,就得要自己找找资料啰。想要开始撷取封包前,得要设定一下监听的介面之类的,因此点选图5.5-1 画面中的网路卡小图示吧!就会出现如下的画面给你选择了。

wireshark 的使用示意图
图5.5-2、wireshark 的使用示意图

在上图中,你得先选择想要监听的介面,鸟哥这里因为担心外部的封包太多导致画面很乱,因此这里使用内部的lo 介面来作为范例。你得要注意, lo 平时是很安静的!所以,鸟哥在点选了『start』之后,还有打开终端机, 之后使用『 ssh localhost 』来尝试登入自己,这样才能够获得封包喔!如下图所示:

wireshark 的使用示意图
图5.5-3、wireshark 的使用示意图

若没有问题,等到你撷取了足够的封包想要进行分析之后,按下图5.5-3 画面中的停止小图示,那么封包撷取的动作就会终止, 接下来,就让我们来开始分析一下封包吧!

wireshark 的使用示意图
图5.5-4、wireshark 的使用示意图

整个分析的画面如上所示,画面总共分为三大区块,你可以将滑鼠游标移动到每个区块中间的移动棒, 就可以调整每个区块的范围大小了。第一区块主要显示的是封包的标头资料,内容就有点类似tcpdump 的显示结果,第二区块则是详细的表头资料,包括讯框的内容、通讯协定的内容以及socket pair 等等资讯。第三区块则是16 进位与ASC​​II 码的显示结果(详细的封包内容)。

如果你觉得某个封包有问题,在画面1 的地方点选该封包(图例中是第6 个封包),那么画面2 与3 就会跟着变动!由于鸟哥测试的封包是加密资料的封包,因此画面2 显示出封包表头,但画面3 的封包内容就是乱码啦!透过这个wireshark 你就可以一口气得到所需要的所有封包内容啦!而且还是图形介面的,很方便吧!


小标题的图示 5.5.3 任意启动TCP/UDP 封包的埠口连线: nc, netcat

这个nc 指令可以用来作为某些服务的检测,因为他可以连接到某个port 来进行沟通,此外,还可以自行启动一个port 来倾听其他用户的连线呐!非常的不错用!如果在编译nc 软体的时候给予『GAPING_SECURITY_HOLE』参数的话,嘿嘿!这个软体还可以用来取得用户端的bash 哩!可怕吧!我们的CentOS 预设并没有给予上面的参数, 所以我们不能够用来作为骇客软体~但是nc 用来取代telnet 也是个很棒的功能了!(有的系统将执行档nc 改名为netcat 啦!)

[root@www ~]# nc [-u] [IP|host] [port] 
[root@www ~]# nc -l [IP|host] [port] 
选项与参数:
-l :作为监听之用,亦即开启一个port 来监听用户的连线;
-u :不使用TCP 而是使用UDP 作为连线的封包状态

#范例一:与telnet类似,连接本地端的port 25查阅相关讯息 
[root@www ~]# yum install nc 
[root@www ~]# nc localhost 25

这个最简单的功能与telnet 几乎一样吧!可以去检查某个服务啦!不过,更神奇的在后面, 我们可以建立两个连线来传讯喔!举个例子来说,我们先在伺服器端启动一个port 来进行倾听:

#范例二:启动一个port 20000来监听使用者的连线要求 
[root@www ~]# nc -l localhost 20000 & 
[root@www ~]# netstat -tlunp | grep nc 
tcp 0 0 ::1: 20000         :::* LISTEN       5433/nc 
#启动一个port 20000在本机上!

接下来你再开另外一个终端机来看看,也利用nc 来连线伺服器,并且输入一些指令看看喔!

[root@www ~]# nc localhost 20000 
   <==这里可以开始输入字串了!

此时,在用户端我们可以打入一些字,你会发现在伺服器端会同时出现你输入的字眼呐!如果你同时给予一些额外的参数,例如利用标准输入与输出(stdout, stdin) 的话,那么就可以透过这个连线来作很多事情了!当然nc 的功能不只如此,你还可以发现很多的用途喔!请自行到你主机内的/usr/share/doc/nc-1.84/scripts/ 目录下看看这些script ,有帮助的呐!不过,如果你需要额外的编译出含有GAPING_SECURITY_HOLE 功能, 以使两端连线可以进行额外指令的执行时,就得要自行下载原始码来编译了!


大标题的图示 5.6 重点回顾
  • 修改网路介面的硬体相关参数,可以使用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 主机;
  • links 主要的功能是『浏览』,包括本机上HTML 语法的档案, wget 则主要在用来下载WWW 的资料;
  • 撷取封包以分析封包的流向,可使用tcpdump ,至于图形介面的wireshark 则可以进行更为详细的解析。
  • 透过tcpdump 分析三向交握,以及分析明码传输的资料,可发现网路加密的重要性。
  • nc 可用来取代telnet 进行某些服务埠口的检测工作。

大标题的图示 5.7 本章习题
  • 暂时将你的eth0 这张网路卡的IP 设定为192.168.1.100 ,如何进行?
    ifconfig eth0 192.168.1.100
  • 我要增加一个路由规则,以eth0 连接192.168.100.100/24​​ 这个网域,应该如何下达指令?
    route add -net 192.l68.100.0 netmask 255.255.255.0 dev eth0
  • 我的网路停顿的很厉害,尤其是连接到tw.yahoo.com 的时候,那么我应该如何检查那个环节出了问题?
    traceroute tw.yahoo.com
  • 我发现我的Linux 主机上面有个连线很怪异,想要将他断线,应该如何进行?
    以root 的身份进行『netstat -anp |more』查出该连线的PID,然后以『 kill -9 PID 』踢掉该连线。
  • 你如何知道green.ev.ncku.edu.tw 这部主机的IP ?
    方法很多,可以利用host green.ev.ncku.edu.tw 或dig green.ev.ncku.edu.tw 或nslookup green.ev.ncku.edu.tw 等方法找出
  • 请找出你的机器上面最适当的MTU 应该是多少?
    请利用『ping -c 3 -M do -s MTU yourIP 』找出你的IP 的MTU 数值。事实上,你还可以先以ip 设定网路卡较大的MTU 后,在进行上述的动作,才能够找出网域内适合的MTU。
  • 如何在终端机介面上面进行WWW 浏览?又该如何下载WWW 上面提供的档案?
    要浏览可以使用links 或​​lynx ,至于要下载则使用wget 这个软体。
  • 在终端机介面中,如何连接bbs.sayya.org 这个BBS ?
    利用telnet bbs.sayya.org 即可连接上
  • 请自行以tcpdump 观察本机端的ssh 连线时,三向交握的内容
  • 请自行回答:为何使用明码传输的网路连线资料较为危险?并自行以软体将封包取出,并与同学讨论封包的资讯
  • 请自行至Internet 下载nc(netcat) 的原始码,并且编译成为具有GAPING_SECURITY_HOLE 的参数, 然后建立一条连线使用-e /bin/bash 尝试将本地端的bash 丢给目的端执行(特殊功能,可让client 取得来自主机的bash)。

大标题的图示 5.8 参考资料与延伸阅读
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值