1、手动/自动设定与启动/关闭IP参数:ifconfig,ifup,ifdown
这三个指令的用途都是在启动网络接口,不过,ifup与ifdown仅能就/etc/sysconfig/network-scripts内的ifcfg-ethX (X 为数字)进行启动或关闭的动作,并不能直接修改网络参数,除非手动调整ifcfg-ethX档案才行。至于ifconfig则可以直接手动给予某个接口IP或调整其网络参数!底下我们就分别来谈一谈!
1)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
net.qiang@hotmail.com
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:最大传输单元;
RX:网络由启动到目前为止的封包接收情况,packets代表封包数、errors代表封包发生错误的数量、dropped代表封包由于有问题而遭丢弃的数量等等;
TX:与 RX 相反,为网络由启动到目前为止的传送情况;
collisions:代表封包碰撞的情况,如果发生太多次,表示你的网络状况不太好;
txqueuelen:代表用来传输数据的缓冲区的储存长度;
RX bytes, TX bytes:总接收、发送字节总量。
范例二:暂时修改网络接口,给予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: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存在与否啊!
2)ifup, ifdown
实时的手动修改一些网络接口参数,可以利用ifconfig来达成,如果是要直接以配置文件,亦即是在 /etc/sysconfig/network-scripts里面的 ifcfg-ethx等档案
的设定参数来启动的话,那就得要透过ifdown或ifup来达成了。
[root@www ~]# ifup {interface}
[root@www ~]# ifdown {interface}
ifup与ifdown 真是太简单了!这两支程序其实是script而已,他会直接到/etc/sysconfig/network-scripts目录下搜寻对应的配置文件,例如ifup eth0时,
他会找出ifcfg-eth0这个档案的内容,然后来加以设定。不过,由于这两支程序主要是搜寻配置文件 (ifcfg-ethx) 来进行启动与关闭的,所以在使用前请确定 ifcfg-ethx是否真的存在于正确的目录内,否则会启动失败喔!另外,如果以ifconfig eth0 .... 来设定或者是修改了网络接口后,那就无法再以ifdown eth0的方式来关闭了!因为ifdown会分析比对目前的网络参数与ifcfg-eth0是否相符,不符的话,就会放弃该次动作。因此,使用ifconfig修改完毕后,应该要以ifconfig eth0 down才能够关闭该接口。
重要配置文件:
[root@www ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0" <==网络卡代号,必须要ifcfg-eth0相对应
HWADDR="08:00:27:71:85:BD" <==就是网络卡地址,若只有一张网卡,可省略此项目
NM_CONTROLLED="no" <==不要受到其他软件的网络管理!
ONBOOT="yes" <==是否默认启动此接口的意思
BOOTPROTO=none <==取得IP的方式,其实关键词只有dhcp,手动可输入none
IPADDR=192.168.1.100 <==就是IP啊
NETMASK=255.255.255.0 <==就是子网掩码
GATEWAY=192.168.1.254 <==就是预设路由
# 重点是上面这几个设定项目,底下的则可以省略的!
NETWORK=192.168.1.0 <==就是该网段的第一个IP,可省略
BROADCAST=192.168.1.255 <==就是广播地址啰,可省略
MTU=1500 <==就是最大传输单元的设定值,若不更改则可省略
2、路由修改:route
[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
加-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)。然后当我们要判断某个网络封包应该如何传送的时候,该封包会经由这个路由的过程来判断喔!
# 范例二:路由的增加与删除
[root@www ~]# route del -net 169.254.0.0 netmask 255.255.0.0 dev eth0 #删除掉169.254.0.0/16这个网域!
[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
Tips:一般来说,如果一个新的环境内的主机,在不想要变动原系统的网络情况下,又需要临时配置一个新的网络用于测试,可以先手动变成:『ifconfig eth0 192.168.1.100; route add default gw 192.168.1.254』这样就配置了一个新的网络。等到完成测试后,再给她/etc/init.d/network restart恢复原系统的网络即可。
3、网络参数综合指令:ip
[root@www ~]# ip [option] [动作] [指令]
选项与参数:
option:设定的参数,主要有:
-s :显示出该装置的统计数据(statistics),例如总接受封包数等;
动作:亦即是可以针对哪些网络参数进行动作,包括:
link :关于装置 (device) 的相关设定,包括MTU, MAC地址等等
addr/address :关于IP协议,例如多IP的达成等等;
route :与路由有关的相关设定
1)关于装置接口 (device) 的相关设定:ip link
ip link可以设定与装置 (device) 有关的相关参数,包括MTU以及该网络接口的MA 等等,当然也可以启动(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
[root@www ~]# ip -s link show eth0
使用ip link show可以显示出整个装置接口的硬件相关信息,包括网卡地址(MAC)、MTU等等,而如果加上 -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的值,达到1000bytes,单位就是bytes啊!
更新网络卡的MTU使用ifconfig也可以达成啊!没啥了不起,不过,如果是要更改『网络卡代号、 MAC 地址的信息』的话,那可就得使用ip啰~不过,设定前可能得
要先关闭该网络卡,否则会不成功。 如下所示:
# 范例三:修改网络卡代号、MAC 等参数
[root@www ~]# ip link set eth0 down <==关闭界面
[root@www ~]# ip link set eth0 name vbird <==设定
[root@www ~]# ip link show <==观察一下
[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)可以更改的话,上面这个动作就可以更改你的网络卡地址了!厉害吧!不过,还是那句老话,测试完之后请立刻改回来。
2)关于额外的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
范例二:新增一个接口,名称假设为 eth0:vbird
[root@www ~]# ip address add 192.168.50.50/24 broadcast + dev eth0 label eth0:vbird #那个 broadcast + 也可以写成broadcast 192.168.50.255啦!
[root@www ~]# ip address show eth0
范例三:将刚刚的界面删除
[root@www ~]# ip address del 192.168.50.50/24 dev eth0 #删除就比较简单
3)关于路由的相关设定: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
范例二:增加路由,主要是本机直接可沟通的网域
[root@www ~]# ip route add 192.168.5.0/24 dev eth0 #针对本机直接沟通的网域设定好路由,不需要透过外部的路由器
[root@www ~]# ip route show
范例三:增加可以通往外部的路由,需透过router喔!
[root@www ~]# ip route add 192.168.10.0/24 via 192.168.5.100 dev eth0
[root@www ~]# ip route show
范例四:增加预设路由
[root@www ~]# ip route add default via 192.168.1.254 dev eth0 #只要一个预设路由就OK !
范例五:删除路由
[root@www ~]# ip route del 192.168.10.0/24
[root@www ~]# ip route del 192.168.5.0/24
4、无线网络:iwlist, iwconfig
iwlist:利用无线网卡进行无线AP的侦测与取得相关的数据
iwconfig:设定无线网卡的相关参数
5、手动使用 DHCP 自动取得IP参数: dhclient
如果你是使用 DHCP 协议在局域网络内取得 IP 的话,那么是否一定要去编辑ifcfg-eth0内的BOOTPROTO呢?嘿嘿!有个更快速的作法,那就是利用dhclient这个指令~因为这个指令才是真正发送dhcp要求工作的程序啊!
范例:
[root@www ~]# dhclient eth0
够简单吧!这样就可以立刻叫我们的网络卡以dhcp协议去尝试取得IP喔!
6、两部主机两点沟通:ping
ping主要透过ICMP封包来进行整个网络的状况报告,最重要的就是那个ICMP type 0, 8这两个类型,分别是要求回报与主动回报网络状态是否存在的特性。要特别注意的是,ping还是需要透过IP 封包来传送ICMP封包的,而IP封包里面有个相当重要的TTL属性,这是很重要的一个路由特性。
[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追踪路径中的最大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) 就已经占用了20bytes ,再加上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
Ethernet 1500
PPPoE 1492
Dial-up(Modem) 576
7、两主机间各节点分析: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的I 就是了。
范例一:侦测本机到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
8、察看本机的网络联机与后台: netstat
[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每五秒更新一次网络状态的显示;
-e 显示扩展信息,例如uid等;
-s 按各个协议进行统计。
提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到
netstat的输出主要分为两大部分,分别是TCP/IP的网络接口部分以及传统的Unix socket部分(Active Unix domain sockets的内容)。
通常建议加上-n 这个参数的,因为可以避过主机名与服务名称的反查,直接以IP及端口口号码(port number)来显示,显示的速度上会快很多!
Active Internet connections称为有源TCP连接,主要是分为几个大项:
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 』参数查阅。
其中"Recv-Q"和"Send-Q"指%0A的是接收队列和发送队列。这些数字一般都应该是0。如果不是则表示软件包正在队列中堆积。这种情况只能在非常少的情况见到。
Active UNIX domain sockets称为有源Unix域套接口(和网络套接字一样,但是只能用于本机通信,性能可以提高一倍):
Proto 显示连接使用的协议
RefCnt 表示连接到本套接口上的进程号
Types 显示套接口的类型
State 显示套接口当前的状态
Path 表示连接到套接口的其它进程使用的路径名
Flags 联机的旗标
实用命令实例
1)列出所有端口 (包括监听和未监听的)
列出所有端口:netstat -a
列出所有tcp端口:netstat -at
列出所有udp端口:netstat -au
2)列出所有处于监听状态的Sockets
只显示监听端口:netstat -l
只列出所有监听tcp端口:netstat -lt
只列出所有监听udp端口:netstat -lu
只列出所有监听UNIX端口:netstat -lx
3)显示每个协议的统计信息
显示所有端口的统计信息:netstat -s
显示TCP或UDP端口的统计信息:netstat -st 或 -su
4)持续输出netstat信息:netstat 将每隔一秒输出网络信息。
5)显示系统不支持的地址族(Address Families):netstat --verbose
6)找出程序运行的端口:netstat -an | grep ':80' 并不是所有的进程都能找到,没有权限的会不显示,使用 root 权限查看所有的信息。
7)显示网络接口列表:netstat -i
范例一:列出目前的路由表状态,且以IP及port number显示:
[root@www ~]# netstat -rn
其实这个参数就跟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
....(底下省略)....
范例三:秀出目前已经启动的网络服务
[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喔!
9、侦测主机名与IP对应:host, nslookup
关于主机名与IP的对应,除了DNS客户端功能的dig指令,其实还有两个更简单的指令,那就是host与nslookup啦!?
1)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
net.qiang@hotmail.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
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
会告诉我们所使用来查询的主机是哪一部吶!这样就够清楚了吧!不过,再怎么清楚也比不过dig这个指令的,所以这个指令仅是参考参考啦!
2)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
范例二:找出168.95.1.1的主机名
[root@www ~]# nslookup 168.95.1.1
10、网络联机/传输
1)telnet
[root@www ~]# telnet [host|IP [port]
2)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 这个档案
net.qiang@hotmail.com
ftp> mkdir dir <==建立 dir 这个目录
ftp> lcd /home <==切换『本地端主机』的工作目录
ftp> passive <==启动或关闭 passive 模式
ftp> binary <==数据传输模式设定为 binary 格式
ftp> bye <==结束 ftp 软件的使用
3)lftp
[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去查阅相关内部指令
11、浏览下载工具
1)文字浏览器: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
如果是浏览Linux本机上面的网页档案,那就可以使用如下的方式:
[root@www ~]# links /usr/share/doc/HTML/index.html
透过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
2)文字接口下载器: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
12、arp
[root@www ~]# arp -[nd] hostname
[root@www ~]# arp -s hostname(IP) Hardware_address
选项与参数:
-n:将主机名以IP的型态显示
-d:将hostname的hardware_address由ARP table当中删除掉
-s:设定某个IP或hostname的MAC到ARP table当中
范例一:列出目前主机上面记载的 IP/MAC 对应的ARP表格
[root@www ~]# arp -n
Address HWtype HWaddress Flags Mask Iface
192.168.1.100 ether 00:01:03:01:02:03 C eth0
192.168.1.240 ether 00:01:03:01:DE:0A C eth0
192.168.1.254 ether 00:01:03:55:74:AB C eth0
范例二:将192.168.1.100那部主机的网卡卡号直接写入ARP表格中
[root@www ~]# arp -s 192.168.1.100 01:00:2D:23:A1:0E #这个指令的目的在建立静态ARP
13、ethtool
Ethtool是Linux下用于查询及设置网卡参数的命令。
选项与参数:
ethtool ethX //查询ethX网口基本设置
ethtool –h //显示ethtool的命令帮助(help)
ethtool –i ethX //查询ethX网口的相关信息
ethtool –d ethX //查询ethX网口注册性信息
ethtool –r ethX //重置ethX网口到自适应模式
ethtool –S ethX //查询ethX网口收发包统计
ethtool –s ethX [speed 10|100|1000] //设置网口速率10/100/1000M
[duplex half|full] //设置网口半/全双工
[autoneg on|off] //设置网口是否自协商
[port tp|aui|bnc|mii] //设置网口类型
...
14、ifstat
网络接口监测工具,比较简单看网络流量概况。
1)比较简单的看网络流量
ifstat
eth0 eth1
KB/s in KB/s out KB/s in KB/s out
0.07 0.20 0.00 0.00
0.07 0.15 0.58 0.00
默认ifstat不监控回环接口,显示的流量单位是KB。
2)监控所有网络接口
ifstat -a
lo eth0 eth1
KB/s in KB/s out KB/s in KB/s out KB/s in KB/s out
0.00 0.00 0.28 0.58 0.06 0.06
0.00 0.00 1.41 1.13 0.00 0.00
0.61 0.61 0.26 0.23 0.00 0.00
15、iftop
实时流量监控工具,监控TCP/IP连接等,缺点就是无报表功能。必须以root身份才能运行。
参数:
-i 设定监测的网卡,如:# iftop -i eth1
-B 以bytes为单位显示流量(默认是bits),如:# iftop -B
-n 使host信息默认直接都显示IP,如:# iftop -n
-N 使端口信息默认直接都显示端口号,如: # iftop -N
-F 显示特定网段的进出流量,如# iftop -F 10.10.1.0/24或# iftop -F 10.10.1.0/255.255.255.0
-h (display this message),帮助,显示参数信息
-p 使用这个参数后,中间的列表显示的本地主机信息,出现了本机以外的IP信息;
-b 使流量图形条默认就显示;
-f 这个暂时还不太会用,过滤计算包用的;
-P 使host信息及端口信息默认就都显示;
-m 设置界面最上边的刻度的最大值,刻度分五个大段显示,例:# iftop -m 100M
1)执行iftop -N -n -i eth1:
19.1Mb 38.1Mb 57.2Mb 76.3Mb 95.4Mb
+-----------------+-----------------+--------------------+--------------------+---------------------
192.168.1.11 => 192.168.1.66 5.3Mb 3.22Mb 3.20Mb
<= 219kb 45.7kb 49.3kb
192.168.1.11 => 192.168.1.29 144kb 30.8kb 29.6kb
<= 11.3Mb 2.38Mb 2.74Mb
192.168.1.11 => 12.2.11.71 0b 6.40kb 6.66kb
<= 0b 0b 0b
192.168.1.11 => 192.168.1.8 2.63kb 1.43kb 932b
<= 1.31kb 1.05kb 893b
192.168.1.11 => 192.168.2.78 2.53kb 1.54kb 2.15kb
<= 160b 160b 187b
192.168.1.11 => 111.126.195.69 0b 166b 69b
<= 0b 0b 0b
------------------------------------------------------------------------------------------------------
TX: cum: 9.70MB peak: 15.6Mb rates: 15.4Mb 3.26Mb 3.23Mb
RX: 8.38MB 14.9Mb 11.5Mb 2.42Mb 2.79Mb
TOTAL: 18.1MB 30.5Mb 27.0Mb 5.69Mb 6.03Mb
第一行:带宽显示
中间部分:外部连接列表,即记录了哪些ip正在和本机的网络连接
中间部分右边:实时参数分别是该访问ip连接到本机2秒,10秒和40秒的平均流量
=>代表发送数据,<= 代表接收数据
底部三行:
表示发送,接收和全部的流量
TX:发送流量
RX:接收流量
TOTAL:总流量
Cumm:运行iftop到目前时间的总流量
peak:流量峰值
rates:分别表示过去 2s 10s 40s 的平均流量
通过iftop的界面很容易找到哪个ip在霸占网络流量,这个是ifstat做不到的。不过iftop的流量显示单位是Mb,这个b是bit,是位,不是字节,而ifstat的KB,这个B就是字节了,byte是bit的8倍。
2)进入iftop画面后的一些操作命令(注意大小写)
h 切换是否显示帮助;
n 切换显示本机的IP或主机名;
s 切换是否显示本机的host信息;
d 切换是否显示远端目标主机的host信息;
t 切换显示格式为2行/1行/只显示发送流量/只显示接收流量;
N 切换显示端口号或端口服务名称;
S 切换是否显示本机的端口信息;
D 切换是否显示远端目标主机的端口信息;
p 切换是否显示端口信息;
P 切换暂停/继续显示;
b 切换是否显示平均流量图形条;
B 切换计算2秒或10秒或40秒内的平均流量;
T 切换是否显示每个连接的总流量;
l 打开屏幕过滤功能,输入要过滤的字符,比如ip,按回车后,屏幕就只显示这个IP相关的流量信息;
L 切换显示画面上边的刻度;刻度不同,流量图形条会有变化;
j或k 可以向上或向下滚动屏幕显示的连接记录;
1或2或3 可以根据右侧显示的三列流量数据进行排序;
< 根据左边的本机名或IP排序;
> 根据远端目标主机的主机名或IP排序;
o 切换是否固定只显示当前的连接;
f 可以编辑过滤代码,这是翻译过来的说法,我还没用过这个!
! 可以使用shell命令,这个没用过!没搞明白啥命令在这好用呢!
q 退出监控。
16、Netcat(nc)
网络工具中的瑞士军刀,它能通过TCP和UDP在网络中读写数据。通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它。使用netcat命令所能完成的事情令人惊讶。netcat所做的就是在两台电脑之间建立链接并返回两个数据流,在这之后所能做的事就看你的想像力了。你能建立一个服务器,传输文件,与朋友聊天,传输流媒体或者用它作为其它协议的独立客户端。之所以叫做netcat,因为它是网络上的cat,想象一下cat的功能,读出一个文件的内容,然后输出到屏幕上(默认的stdout是屏幕,当然可以重定向到其他地方)。netcat也是如此,它读取一端的输入,然后传送到网络的另一端, 就这么简单.但是千万不要小看了它,netcat可以完成很多任务,,尤其是和其他程序组合时.好了,废话少说,进入正题吧.:p 网上有两种版本的netcat,一个是@stake公司netcat也就是最初的版本,还有一个是GNU的,它的功能更多,不过GNU的没有windows平台的版本。
参数:
-e prog 程序重定向,一旦连接,就执行 [危险]
-g gateway source-routing hop point[s], up to 8
-G num source-routing pointer: 4, 8, 12, ...
-h 帮助信息
-i secs 延时的间隔
-l 监听模式,用于入站连接
-n 指定数字的IP地址,不能用hostname
-o file 记录16进制的传输
-p port 本地端口号
-r 任意指定本地及远程端口
-s addr 本地源地址
-u UDP模式
-v 详细输出――用两个-v可得到更详细的内容
-w secs timeout的时间
-z 将输入输出关掉――用于扫描时
1)简单服务器
nc -l -p 1234 [假设这台主机ip为192.168.0.1]
然后客户端输入:nc 192.168.0.1 1234
你从任一端输入的数据就会显示在另一端了。其实netcat的server和client的区别并不大,区别仅仅在于谁执行了-l来监听端口,一旦连接建立以后,就没有什么区别了。从这里我们也可以了解netcat的工作原理了,通过网络链接读写数据。
2)telnet服务器(打开一个shell)
nc有一个-e的选项,用来指定在连接后执行的程序。在windows平台上可以指定-e cmd.exe(如果是98就指定command.exe、linux则指定-e bash),或者任何你喜欢的shell,或者是你自己编写的程序,指定-e的效果是由你指定的程序代替了nc自己来接受另一端的输入,并把输入(命令)后反馈的结果显示到另一端。
server: nc -l -p 1234 -e bash
client: nc 192.168.0.1 1234
就可以远程登陆server了。
不一定非要在server端指定-e,也可以在client端指定:
server: nc -l -p 1234
client: nc -e 192.168.0.1 1234
这样,就相当于在server上远程登陆client了。有关client和server的区分是没有什么意义的.谁做为telnet server的标准只有一个,谁执行了-e [shell]。
假如netcat不支持-e参数仍然能够创建远程shell
Server
$mkfifo /tmp/tmp_fifo
$cat /tmp/tmp_fifo | /bin/sh -i 2>&1 | nc -l 1567 > /tmp/tmp_fifo
创建了一个fifo文件,然后使用管道命令把这个fifo文件内容定向到shell 2>&1中。是用来重定向标准错误输出和标准输出,然后管道到netcat 运行的端口1567上。至此,我们已经把netcat的输出重定向到fifo文件中。
Client
$nc -n 172.31.100.7 1567
会得到一个shell提示符在客户端
3)端口扫描
端口扫描经常被系统管理员和黑客用来发现在一些机器上开放端口,帮助他们识别系统中的漏洞。
nc -z -v -n 172.31.100.7 21-25
打印21到25所有开放的端口。Banner是一个文本,Banner是一个你连接的服务发送给你的文本信息。当你试图鉴别漏洞或者服务的类型和版本的时候,Banner信息是非常有用的。但是,并不是所有的服务都会发送banner。一旦你发现开放的端口,你可以容易的使用netcat连接服务抓取他们的banner:
nc -v 172.31.100.7 21
netcat命令会连接开放端口21并且打印运行在这个端口上服务的banner信息。
4)Chat Server
假如你想和你的朋友聊聊,有很多的软件和信息服务可以供你使用。但是,如果你没有这么奢侈的配置,比如你在计算机实验室,所有的对外的连接都是被限制的,你怎样和整天坐在隔壁房间的朋友沟通那?不要郁闷了,netcat提供了这样一种方法,你只需要创建一个Chat服务器,一个预先确定好的端口,这样子他就可以联系到你了。
Server
$nc -l 1567
netcat命令在1567端口启动了一个tcp服务器,所有的标准输出和输入会输出到该端口。输出和输入都在此shell中展示。
Client
$nc 172.31.100.7 1567
不管你在机器B上键入什么都会出现在机器A上。
5)文件传输
大部分时间中,我们都在试图通过网络或者其他工具传输文件。有很多种方法,比如FTP,SCP等等,但是当你只是需要临时或者一次传输文件,真的值得浪费时间来安装配置一个软件到你的机器上嘛。假设,你想要传一个文件file.txt 从A到B。A或者B都可以作为服务器或者客户端,以下让A作为服务器,B为客户端。
Server
$nc -l 1567 < file.txt
Client
$nc -n 172.31.100.7 1567 > file.txt
这里我们创建了一个服务器在A上并且重定向netcat的输入为文件file.txt,那么当任何成功连接到该端口,netcat会发送file的文件内容。在客户端我们重定向输出到file.txt,当B连接到A,A发送文件内容,B保存文件内容到file.txt。没有必要创建文件源作为Server,我们也可以相反的方法使用。像下面的我们发送文件从B到A,但是服务器创建在A上,这次我们仅需要重定向netcat的输出并且重定向B的输入文件。
B作为Server:
Server
$nc -l 1567 > file.txt
Client
nc 172.31.100.23 1567 < file.txt
如果想要发送多个文件,或者整个目录,一样很简单,只需要使用压缩工具tar,压缩后发送压缩包。
Server
$tar -cvf – dir_name | nc -l 1567
Client
$nc -n 172.31.100.7 1567 | tar -xvf -
这里在A服务器上,我们创建一个tar归档包并且通过-在控制台重定向它,然后使用管道,重定向给netcat,netcat可以通过网络发送它。在客户端我们下载该压缩包通过netcat 管道然后打开文件。
如果想要节省带宽传输压缩包,我们可以使用bzip2或者其他工具压缩。
Server 通过bzip2压缩
$tar -cvf – dir_name| bzip2 -z | nc -l 1567
Client 使用bzip2解压
$nc -n 172.31.100.7 1567 | bzip2 -d |tar -xvf -
6)流视频
虽然不是生成流视频的最好方法,但如果服务器上没有特定的工具,使用netcat,我们仍然有希望做成这件事。
服务端
$cat video.avi | nc -l 1567
这里我们只是从一个视频文件中读入并重定向输出到netcat客户端
客户端
$nc 172.31.100.7 1567 | mplayer -vo x11 -cache 3000 -
这里我们从socket中读入数据并重定向到mplayer。
7)克隆一个设备
如果你已经安装配置一台Linux机器并且需要重复同样的操作对其他的机器,而你不想在重复配置一遍。不在需要重复配置安装的过程,只启动另一台机器的一些引导可以随身碟和克隆你的机器。克隆Linux PC很简单,假如你的系统在磁盘/dev/sda上
Server
$dd if=/dev/sda | nc -l 1567
Client
$nc -n 172.31.100.7 1567 | dd of=/dev/sda
通过netcat服务器重定向它的输出流到其他机器并且写入到磁盘中,它会随着分区表拷贝所有的信息。但是如果我们已经做过分区并且只需要克隆root分区,我们可以根据我们系统root分区的位置,更改sda为sda1,sda2等等。
8)指定源端口
假设你的防火墙过滤除25端口外其它所有端口,你需要使用-p选项指定源端口。
服务器端
$nc -l 1567
客户端
$nc 172.31.100.7 1567 -p 25
使用1024以内的端口需要root权限。该命令将在客户端开启25端口用于通讯,否则将使用随机端口。
9)指定源地址
假设你的机器有多个地址,希望明确指定使用哪个地址用于外部数据通讯。我们可以在netcat中使用-s选项指定ip地址。
服务器端
$nc -u -l 1567 < file.txt
客户端
$nc -u 172.31.100.7 1567 -s 172.31.100.5 > file.txt
该命令将绑定地址172.31.100.5。
10)HTTP客户端用于下载文件
这是最简单的使用方式,nc <hostname> <portnumber>
nc http://www.apache.org/ 80
get / http/1.1
HTTP/1.1 400 Bad Request
Date: Mon, 08 Dec 2003 06:23:31 GMT
Server: Apache/2.0.48-dev (Unix)
Content-Length: 310
Connection: close
Content-Type: text/html; charset=iso-8859-1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
<hr />
<address>Apache/2.0.48-dev (Unix) Server at http://www.apache.org/ Port 80</address>
</body></html>
11)其它用途
a、使用-t选项模拟Telnet客户端
b、连接到邮件服务器,使用SMTP协议检查邮件,
c、使用ffmpeg截取屏幕并通过流式传输分享,等等。其它更多用途。
只要你了解协议就可以使用netcat作为网络通讯媒介,实现各种客户端。
附:Linux网络相关配置文件
1)、/etc/sysconfig/network-scripts/ifcfg-eth0
设置IP、Netmask、DHCP与Gateway等。
重要参数:
DEVICE=网卡的代号
BOOTPROTO=是否使用dhcp
HWADDR=是否加入网卡卡号(MAC)
IPADDR=就是IP地址
NETMASK=子网掩码
ONBOOT=要不要默认启动此接口
GATEWAY=网关
NM_CONTROLLED=额外的网管软件,建议取消
2)、/etc/sysconfig/network
设置主机名
重要参数:
NETWORKING=要不要有网络
NETWORKING_IPV6=支援IPv6否?
HOSTNAME=你的主机名
3)、/etc/resolv.conf
DNS IP
重要参数:
nameserver DNS的IP
4)、/etc/hosts
私有IP对应的主机名
重要参数:
私有IP 主机名 别名
5)、/etc/services
记录架构在TCP/IP上面的总协议,包括http, ftp, ssh, telnet等等服务所定义的port number,都是这个档案所规划出来的。如果你想要自定义一个新的协议与port 的对应,就得要改这个档案了。
6)、/etc/protocols
这个档案则是在定义出IP封包协议的相关数据,包括ICMP/TCP/UDP这方面的封包协议的定义等。
7)、/etc/modprobe.conf
开机时用来设置加载内核模块的文件,网卡与对应模块写在这个文件中。