目前我们用在网络方面的指令有哪些呢?如何远程连接控管主机呢?如何以文本界面来浏览呢?
任何时刻如果你想要做好你的网络参数设置,包括 IP 参数、路由参数与无线网络等等,就得要了解底下这些相关的指令才行!其中以 ifconfig 及 route 这两支指令算是较重要的喔! ^_^!当然,比较新鲜的作法,可以使用 ip 这个汇整的指令来设置 IP 参数啦!
这三个指令的用途都是在启动网络接口,不过, ifup 与 ifdown 仅能就 /etc/sysconfig/network-scripts 内的 ifcfg-ethX (X 为数字) 进行启动或关闭的动作,并不能直接修改网络参数,除非手动调整 ifcfg-ethX 文件才行。至于 ifconfig 则可以直接手动给予某个接口 IP 或调整其网络参数!底下我们就分别来谈一谈!
[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:F3:5D:23 inet addr:192.168.1.11 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fef3:5d23/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:485 errors:0 dropped:0 overruns:0 frame:0 TX packets:143 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:46082 (45.0 KiB) TX bytes:19559 (19.1 KiB) |
# 范例二:暂时修改网络接口,给予 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:F3:5D:23 inet addr:192.168.100.100 Bcast:192.168.100.127 Mask:255.255.255.128 inet6 addr: fe80::a00:27ff:fef3:5d23/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:9000 Metric:1 RX packets:1305 errors:0 dropped:0 overruns:0 frame:0 TX packets:230 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:123306 (120.4 KiB) TX bytes:30671 (29.9 KiB) eth0:0 Link encap:Ethernet HWaddr 08:00:27:F3:5D:23 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 的设置为主! |
[root@www ~]# ifup {interface} [root@www ~]# ifdown {interface} [root@www ~]# ifup eth0 |
我们在第二章网络基础的时候谈过关于路由的问题, 两部主机之间一定要有路由才能够互通 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 0 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 169.254.0.0 * 255.255.0.0 U 0 0 0 eth0 default gateway.vbird 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 , 而上面的信息有哪些你必须要知道的呢?
此外,观察一下上面的路由排列顺序喔,依序是由小网域 (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 并不在你的网域内), 所以,赶紧检查一下是否输入错误啊!
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 指令吧!
[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 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 qlen 1000 link/ether 08:00:27:f3:5d:23 brd ff:ff:ff:ff:ff:ff 3: sit0: <NOARP> mtu 1480 qdisc noop 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 qlen 1000 link/ether 08:00:27:f3:5d:23 brd ff:ff:ff:ff:ff:ff RX: bytes packets errors dropped overrun mcast 438038 4511 0 0 0 0 TX: bytes packets errors dropped carrier collsns 104983 769 0 0 0 0 |
# 范例二:启动、关闭与设置设备的相关信息 [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 啊! |
# 范例三:修改网络卡代号、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 qlen 1000 link/ether 08:00:27:f3:5d:23 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) 可以更改的话, # 那么上面这个动作就可以更改你的网络卡地址了!厉害吧! # 不过,还是那句老话,测试完之后请立刻改回来啊! |
[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 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 qlen 1000 link/ether 08:00:27:f3:5d:23 brd ff:ff:ff:ff:ff:ff inet 192.168.1.11/24 brd 192.168.1.255 scope global eth0 inet6 fe80::a00:27ff:fef3:5d23/64 scope link valid_lft forever preferred_lft forever 3: sit0: <NOARP> mtu 1480 qdisc noop link/sit 0.0.0.0 brd 0.0.0.0 |
# 范例二:添加一个接口,名称假设为 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 qlen 1000 link/ether 08:00:27:f3:5d:23 brd ff:ff:ff:ff:ff:ff inet 192.168.1.11/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:fef3:5d23/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:F3:5D:23 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 # 删除就比较简单啊! ^_^ |
[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.11 169.254.0.0/16 dev eth0 scope link default via 192.168.1.254 dev eth0 |
# 范例二:增加路由,主要是本机直接可沟通的网域 [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.2 就是我的缺省路由器 (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)。
这两个指令你必须要有无线网卡才能够进行喔!这两个指令的用途是这样的:
这两个指令的应用我们在前一章里面的无线网卡设置谈了很多了, 所以这里我们不再详谈,有兴趣的朋友应该先使用 man iwlist 与 man iwconfig 了解一下语法, 然后再到前一章的无线网络小节查一查相关的用法,就了解了啦! ^_^
如果你是使用 DHCP 协定在局域网路内取得 IP 的话,那么是否一定要去编辑 ifcfg-eth0 内的 BOOTPROTO 呢? 嘿嘿!有个更快速的作法,那就是利用 dhclient 这个指令~因为这个指令才是真正发送 dhcp 要求工作的程序啊!那要如何使用呢?很简单!如果不考虑其他的参数,使用底下的方法即可:
[root@www ~]# dhclient eth0
|
够简单吧!这样就可以立刻叫我们的网络卡以 dhcp 协定去尝试取得 IP 喔!
在网络的互助论坛中,最常听到的一句话就是:『高手求救!我的 Linux 不能连上网络了!』我的天呐!不能上网络的原因多的很!而要完全搞懂也不是一件简单的事情呢! 不过,事实上我们可以自己使用测试软件来追踪可能的错误原因,而很多的网络侦测指令其实在 Linux 里头已经都缺省存在了,只要你好好的学一学基本的侦测指令,那么一些朋友在告诉你如何调试的时候, 你应该就立刻可以知道如何来搞定他啰!
其实我们在第四章谈到的五个检查步骤已经是相当详细的网络调试流程了!
只是还有些重要的侦测指令也得要来了解一下才好!
这个 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 封包去要求对方主机回应是否存在于网络环境中,上面的回应消息当中,几个重要的项目是这样的:
如果你忘记加上 -c 3 这样的规定侦测次数,那就得要使用 [ctrl]-c 将他结束掉了!
例题:
写一支脚本程序 ping.sh ,通过这支脚本程序,你可以用 ping 侦测整个网域的主机是否有回应。此外,每部主机的侦测仅等待一秒钟,也仅侦测一次。
答:
由于仅侦测一次且等待一秒,因此 ping 的选项为: -W1 -c1 ,而位于本机所在的区网为 192.168.1.0/24 ,所以可以这样写:
#!/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 喔!
# 范例二:找出最大的 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.11 icmp_seq=1 Frag needed and DF set (mtu = 1500) # 这个错误消息是说,本地端的 MTU 才到 1500 而已,你要侦测 8000 的 MTU # 根本就是无法达成的!那要如何是好?用前一小节介绍的 ip link 来进行 MTU 设置吧! |
网络接口 | MTU |
Ethernet | 1500 |
PPPoE | 1492 |
Dial-up(Modem) | 576 |
我们前面谈到的指令大多数都是针对主机的网络参数设置所需要的,而 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 还是 ppp1 啦! -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
|
如果你觉得你的某个网络服务明明就启动了,但是就是无法造成连接的话,那么应该怎么办? 首先你应该要查找一下自己的网络接口所监听的端口口 (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:2207 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:735 0.0.0.0:* LISTEN tcp 0 0 :::22 :::* LISTEN tcp 0 132 192.168.1.11:22 192.168.201.101:1865 ESTABLISHED udp 0 0 192.168.1.11:137 0.0.0.0:* udp 0 0 0.0.0.0:137 0.0.0.0:* ....(中间省略).... Active UNIX domain sockets (servers and established) Proto RefCnt Flags Type State I-Node Path unix 2 [ ACC ] STREAM LISTENING 10098 /tmp/.X11-unix/X0 unix 2 [ ACC ] STREAM LISTENING 10571 @/tmp/fam-root- ....(底下省略).... |
netstat 的输出主要分为两大部分,分别是 TCP/IP 的网络接口部分,以及传统的 Unix socket 部分。 还记得我们在基础篇里面曾经谈到文件的类型吗?那个 socket 与 FIFO 文件还记得吧? 那就是在 Unix 接口用来做为程序数据交流的接口了,也就是上头表格内看到的 Active Unix domain sockets 的内容啰~
通常鸟哥都是建议加上『 -n 』这个参数的,因为可以避过主机名称与服务名称的反查,直接以 IP 及端口口号码 (port number) 来显示,显示的速度上会快很多!至于在输出的消息当中, 我们先来谈一谈关于网络连接状态的输出部分,他主要是分为底下几个大项:
基本上,我们常常谈到的 netstat 的功能,就是在观察网络的连接状态了,而网络连接状态中, 又以观察『我目前开了多少的 port 在等待用户端的连接』以及 『目前我的网络连接状态中,有多少连接已创建或产生问题』最常见。 那你如何了解与观察呢?通常鸟哥是这样处理的:
# 范例三:秀出目前已经启动的网络服务 [root@www ~]# netstat -tulnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program tcp 0 0 127.0.0.1:2208 0.0.0.0:* LISTEN 2029/hpiod tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN 2158/smbd tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1792/portmap tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 2056/cupsd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2088/sendmail: ....(底下省略).... # 上面最重要的其实是那个 -l 的参数,因为可以仅列出有在 Listen 的 port |
你可以发现很多的网络服务其实仅针对本机的 lo 开放而已,互联网是连接不到该端口口与服务的。 而由上述的数据我们也可以看到,启动 port 111 的,其实就是 portmap 那只程序,那如果想要关闭这个端口口, 你可以使用 kill 删除 1792 ,也可以使用 killall 删除 portmap 这个进程即可。如此一来, 很轻松的你就能知道哪个程序启动了哪些端口口啰!
# 范例四:观察本机上头所有的网络连接状态 [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 127.0.0.1:2208 0.0.0.0:* LISTEN 2029/hpiod ....(中间省略).... tcp 0 0 :::22 :::* LISTEN 2047/sshd tcp 0 148 192.168.1.11:22 192.168.201.101:1865 ESTABLISHED 13619/1 ....(底下省略).... |
看到上头的特殊字体吧?那代表目前已经创建连接的一条网络连接,他是由远程主机 192.168.201.101 启动一个大于 1024 的端口口向本地端主机 192.168.1.11 的 port 22 进行连接的一条连接, 你必须要想起来的是:『Client 端是随机取一个大于 1024 以上的 port 进行连接』,此外『只有 root 可以启动小于 1024 以下的 port 』,那就看的懂上头那条连接啰!如果这条连接你想要砍掉他的话, 看到最右边的 13619 了没? kill 会用吧! ^_^
至于传统的 Unix socket 的数据,记得使用 man netstat 查阅一下吧! 这个 Unix socket 通常是用在一些仅在本机上运作的程序所打开的插槽接口档, 例如 X Window 不都是在本机上运作而已吗?那何必启动网络的 port 呢?当然可以使用 Unix socket 啰,另外,例如 Postfix 这一类的网络服务器,由于很多动作都是在本机上头来完成的, 所以以会占用很多的 Unix socket 喔!
例题:
请说明服务名称与 port number 的对应在 Linux 当中,是用那个文件来设置对应的?
答:
/etc/services
|
关于主机名称与 IP 的对应中,我们主要介绍的是 DNS 用户端功能的 dig 这个指令。不过除了这个指令之外,
其实还有两个更简单的指令,那就是 host 与 nslookup 啦!底下让我们来聊聊这两个指令吧!
[root@www ~]# host [-a] hostname [server] 选项与参数: -a :列出该主机详细的各项主机名称设置数据 [server] :可以使用非为 /etc/resolv.conf 的 DNS 服务器 IP 来查找。 # 范例一:列出 tw.yahoo.com 的 IP [root@www ~]# host tw.yahoo.com w.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 |
[root@www ~]# host tw.yahoo.com 168.95.1.1 Using domain server: Name: 168.95.1.1 Address: 168.95.1.1#53 Aliases: 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 |
[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. |
啥是远程连接呢?其实就是在不同的电脑之间进行登录的情况啦!我们可以通过 telnet, ssh 或者是 ftp
等协定来进行远程主机的登录。底下我们就分别来介绍一下这些基本的指令吧!这里仅是谈到用户端功能喔,
相关的服务器我们则会在后续进行说明的。
telnet 是早期我们在个人电脑上面要链接到服务器工作时,最重要的一个软件了!他不但可以直接连接到服务器上头, 还可以用来链接 BBS 呢!非常棒!不过, telnet 本身的数据在发送的时候是使用明码 (原始的数据,没有加密) , 所以数据在 Internet 上面跑的时候,会比较危险一点 (就怕被别人监听啊)。 更详细的数据我们会在『远程连接服务器』章节内做介绍的。
[root@www ~]# telnet [host|IP [port]] # 范例一:链接到台湾相当热门的 PTT BBS 站 ptt.cc [root@www ~]# telnet ptt.cc 欢迎来到 批踢踢实业坊 目前有【93144】位用户在在线 请输入代号,或以 guest 参观,或以 new 注册: 甄选青年环保大使迈向联合国会议殿堂,全额补助您前往墨西哥!http://ppt.cc/s;Cy PTTradio 8/31 (二)20:00 苏打绿-十年一刻访问 更多访问,请上 http://pttradio.net |
如上所示,我们可以通过 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 127.0.0.1... Connected to localhost.localdomain (127.0.0.1). Escape character is '^]'. 220 www.centos.vbird ESMTP Sendmail 8.13.8/8.13.8; Wed, 1 Sep 2010 11:42:06 +0800 ehlo localhost 250-www.centos.vbird Hello localhost.localdomain [127.0.0.1], pleased to meet you 250-ENHANCEDSTATUSCODES 250-PIPELINING 250-8BITMIME ....(中间省略).... 250 HELP quit 221 2.0.0 www.centos.vbird closing connection Connection closed by foreign host. |
瞧!根据输出的结果,我们就能够知道这个通信协定 (port number 提供的通信协定功能) 是否有成功的启动呐! 而在每个 port 所监听的服务都有其特殊的指令,例如上述的 port 25 就是在本机接口所提供的电子邮件服务, 那个服务所支持的指令就如同上面使用的数据一样,但是其他的 port 就不见得支持这个『 ehlo 』的命令, 因为不同的 port 有不同的程序嘛!所以当然支持的命令就不同啰! 与 mail server 有关的 telnet 用法,我们将在邮件服务器内提到喔!
现在的人们由于有高容量的 email 可以用,因此发送文件可以很轻松的通过 email 。不过 email 还是有单封信件容量限制,
如果想要一口气发送个几百 MB 的文件,恐怕还是得要通过 FTP 这个通信协定才行啊!文本接口的 FTP 软件主要有 ftp,
lftp 两个,图形接口的呢?在 CentOS 上面缺省有 gftp 这个好用的东东。在这里我们仅介绍文本接口的两个指令而已。
[root@www ~]# ftp [host|IP] [port] # 范例一:连接到昆山科大去看看 [root@www ~]# ftp ftp.ksu.edu.tw Connected to ftp.ksu.edu.tw. 220---------- Welcome to Pure-FTPd [privsep] ---------- 220-You are user number 1 of 50 allowed. 220-Local time is now 12:02. 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 软件的使用 |
[root@www ~]# ftp hostname 318 # 假设对方主机的 ftp 服务打开在 318 这个 port 啊! |
[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 ~]# lftp ftp.ksu.edu.tw lftp ftp.ksu.edu.tw:~> # 瞧!一下子就登录了!很快乐吧! ^_^!你同样可使用 help 去查阅相关内部指令 |
# 使用文件配合 lftp 去处理时: [root@www ~]# mkdir 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-beta RPM-GPG-KEY-CentOS-3 RPM-GPG-KEY-centos4 RPM-GPG-KEY-CentOS-4 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 |
现在应该大家都知道什么是 MSN, 雅虎即时通以及其他的通信软件吧?那么要连上这些服务器时,该怎么处理哪?很简单,在 X Window 底下使用 pidgin 就好了!简直简单到不行~请先进入 X Window 系统,然后经过『应用程序』--> 『互联网』-->『Pidgin 网络即时通』启动他即可 (请注意你必须已经安装了 pidgin 了,可用 yum install pidgin 处理)。然后就会出现如下的窗口啦:
在上图中按下『添加』,然后你会看到如下的画面:
很神奇的是, pidgin 支持的通信有够多的!我们使用 MSN 来作个解释好了:
如上图,在画面中输入你的帐号与密码,如果是在公用的电脑上,千万不要按下『记住密码』项目喔!按下添加后, pidgin 缺省就会尝试登录了!登录后的画面如下所示:
如果想要注销了,那么就按下图 5.3-4 最右边那个窗口,将『启动』的那个方框勾选取消,你就直接注销啰!
什么?文本界面竟然有浏览器!别逗了好不好?呵呵!谁有那个时间在逗你呦!真的啦!有这个东西,
是在文本界面下上网浏览的好工具!分别是 links 及 wget 这两个宝贝蛋,但是,你必需要确定你已经安装了这两个套件才行。
好佳在的是,CentOS 缺省这两个玩意儿都有安装喔!底下就让我们来聊一聊这两个好用的家伙吧!
其实早期鸟哥最常使用的是 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 网站网址后,就会出现如下的图标:
上面这个画面的基本说明如下:
至于如果是浏览 Linux 本机上面的网页文件,那就可以使用如下的方式:
[root@www ~]# cd /usr/share/doc/centos-release-notes-5.5 [root@www htmldocs]# links RELEASE-NOTES-en.html |
在鸟哥的 CentOS 5.5 当中,有这么一个文件,我就可以利用 links 来取出察看呐!显示的结果有点像底下这样:
当然啦!因为你的环境可能是在 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 服务器当中再次的提及!
如果说 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.35.4 版的内核 [root@www ~]# wget \ > http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.35.4.tar.bz2 --2010-09-01 17:36:24-- http://www.kernel.org/pub/linux/kernel/v2.. 正在查找主机 www.kernel.org... 199.6.1.164, 204.152.191.37, 149.20.20.133, ... 正在连接 www.kernel.org|199.6.1.164|:80... 连上了。 已送出 HTTP 要求,正在等候回应... 200 OK 长度: 69259115 (66M) [application/x-bzip2] Saving to: `linux-2.6.35.4.tar.bz2' 94% [====================================> ] 65,163,000 623K/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 |
很多时候由于我们的网络连接出现问题,使用类似 ping 的软件功能却又无法找出问题点,最常见的是因为路由与 IP
转递后所产生的一些困扰 (请参考防火墙与 NAT 主机部分),这个时候要怎么办?最简单的方法就是『分析封包的流向』啰!通过分析封包的流向,我们可以了解一条连接应该是如何进行双向的连接的动作,
也就会清楚的了解到可能发生的问题所在了!底下我们就来谈一谈这个 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 96 bytes 01:33:40.41 IP 192.168.1.10.22 > 192.168.1.11.1190: P 116:232(116) ack 1 win 9648 01:33:40.41 IP 192.168.1.10.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 几乎都是分析封包的表头数据,用户如果没有简易的网络封包基础,要看懂粉难呐! 所以,至少你得要回到网络基础里面去将 TCP 封包的表头数据理解理解才好啊! ^_^!至于那个范例一所产生的输出范例中,我们可以约略区分为数个字段, 我们以范例一当中那个特殊字体行来说明一下:
最简单的说法,就是该封包是由 192.168.1.10 传到 192.168.1.11,通过的 port 是由 22 到 1190 , 且带有 116 bytes 的数据量,使用的是 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.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 端则予以『回应』,所以,当然是有去有回啊! 而我们也就可以经过这个封包的流向来了解到封包运作的过程。举例来说:
那么输出的结果会是如何?
[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-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..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 监听 (1)来自 eth0 适配器且 (2)通信协定为 port 22 ,(3)封包来源为 192.168.1.100 的封包数据?
答:
tcpdump -i eth0 -nn 'port 22 and src host 192.168.1.100'
|
tcpdump 是文本接口的封包截取器,那么有没有图形接口的?有啊!那就是 wireshark (注1) 这套软件。这套软件早期称为 ethereal ,目前同时提供文本接口的 tethereal 以及图形接口的 wireshark 两个咚咚。由于我们当初安装时缺省并没有装这套,因此妳必须要先使用 yum 去网络安装喔!也可以拿出光盘来安装啦!有两套需要安装,分别是文本接口的 wireshark 以及图形接口的 wireshark-gnome 软件。安装方式如下:
[root@www ~]# yum install wireshark wireshark-gnome
|
启动这套软件的方法很简单,你必须要在 X Window 底下,通过『应用程序』-->『互联网』-->『wireshark network analyzer』就可以启动啦!启动的画面如下所示:
其实这一套软件功能非常强大!鸟哥这里仅讲简单的用法,若有特殊需求,就得要自己找找数据啰。 想要开始截取封包前,得要设置一下监听的接口之类的,因此点击图 5.5-1 画面中的网络卡小图标吧! 就会出现如下的画面给你选择了。
在上图中,你得先选择想要监听的接口,鸟哥这里因为担心外部的封包太多导致画面很乱,因此这里使用内部的 lo 接口来作为范例。你得要注意, lo 平时是很安静的!所以,鸟哥在点击了『start』之后,还有打开终端机, 之后使用『 ssh localhost 』来尝试登录自己,这样才能够获得封包喔!如下图所示:
若没有问题,等到你截取了足够的封包想要进行分析之后,按下图 5.5-3 画面中的停止小图标,那么封包截取的动作就会终止, 接下来,就让我们来开始分析一下封包吧!
整个分析的画面如上所示,画面总共分为三大区块,你可以将鼠标光标移动到每个区块中间的移动棒, 就可以调整每个区块的范围大小了。第一区块主要显示的是封包的标头数据,内容就有点类似 tcpdump 的显示结果,第二区块则是详细的表头数据,包括讯框的内容、通信协定的内容以及 socket pair 等等信息。 第三区块则是 16 进位与 ASCII 码的显示结果 (详细的封包内容)。
如果你觉得某个封包有问题,在画面 1 的地方点击该封包 (图例中是第 31 个封包),那么画面 2 与 3 就会跟着变动!由于鸟哥测试的封包是加密数据的封包,因此画面 2 显示出封包表头,但画面 3 的封包内容就是乱码啦! 通过这个 wireshark 你就可以一口气得到所需要的所有封包内容啦!而且还是图形接口的,很方便吧!
这个 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 ~]# nc localhost 25 |
这个最简单的功能与 telnet 几乎一样吧!可以去检查某个服务啦!不过,更神奇的在后面, 我们可以创建两个连接来传讯喔!举个例子来说,我们先在服务器端启动一个 port 来进行倾听:
# 范例二:启动一个 port 20000 来监听用户的连接要求 [root@www ~]# nc -l localhost 20000 & [root@www ~]# netstat -tlunp | grep nc tcp 0 0 127.0.0.1:20000 0.0.0.0:* LISTEN 14152/nc # 启动一个 port 20000 在本机上! |
接下来你再开另外一个终端机来看看,也利用 nc 来连接服务器,并且输入一些指令看看喔!
[root@www ~]# nc localhost 20000 <==这里可以开始输入字符串了! |
此时,在用户端我们可以打入一些字,你会发现在服务器端会同时出现你输入的字眼呐! 如果你同时给予一些额外的参数,例如利用标准输入与输出 (stdout, stdin) 的话,那么就可以通过这个连接来作很多事情了! 当然 nc 的功能不只如此,你还可以发现很多的用途喔! 请自行到你主机内的 /usr/share/doc/nc-1.84/scripts/ 目录下看看这些 script ,有帮助的呐! 不过,如果你需要额外的编译出含有 GAPING_SECURITY_HOLE 功能, 以使两端连接可以进行额外指令的运行时,就得要自行下载原代码来编译了!