Linux 常用网络命令

2014-10-31 Friday     linux , network

简单记录一下 Linux 中的常用网络命令,如 tcpdump、netcat 等。

Wget

一个下载文件的工具,支持断点下载、FTP 和 HTTP 下载、代理服务器,如下简单介绍其使用方法。

1. 下载单个文件

以下的例子是从网络下载一个文件并保存在当前目录

$ wget http://foobar.example.com/your-file-name.tar.bz2

在下载的过程中会显示进度条,包含下载完成百分比,已经下载的字节,当前下载速度,剩余下载时间。

2. 重命名保存文件

默认会以最后一个符合 "/" 的后面的字符来命名文件,对于动态链接的下载通常文件名会不正确,如下示例会下载一个文件并以名称 download.php?id=1 保存。

$ wget https://www.example.com/download?id=1

即使下载后的文件是 zip 格式,仍然以 download.php?id=1 命令,此时可以通过 -O 来指定一个下载文件名。

$ wget -O example.zip https://www.example.com/download.php?id=1
3. 限速下载

当执行 wget 时,默认会占用全部可能的宽带下载,但是当你准备下载一个大文件,而你还需要下载其它文件时就有必要限速了。

$ wget --limit-rate=300k http://foobar.example.com/your-file-name.tar.bz2
4. 断点续传

通过 -c 参数重新启动下载中断的文件。

$ wget -c http://foobar.example.com/your-file-name.tar.bz2

对于下载大文件时突然由于网络等原因中断时非常有用。

5. 后台下载

下载非常大的文件时,可以使用参数 -b 进行后台下载。

$ wget -c http://foobar.example.com/your-file-name.tar.bz2
Continuing in background, pid 9817.
Output will be written to `wget-log'.

可以使用 tail -f wget-log 命令查看进度。

6. 伪装代理下载

有些网站能根据代理是不是浏览器而拒绝下载,此时可以通过 --user-agent 参数伪装代理。

$ wget --user-agent="Mozilla/5.0 (Windows NT 6.1; en-US)" http://foobar.example.com/file.tar.bz2
7. 测试下载链接

通常在 A) 定时下载之前进行检查;B) 间隔检测网站是否可用;C) 检查网站页面的死链接,可以通过 --spider 检查链接是否可用。

如果下载链接正常,将会显示:

$ wget --spider URL
Spider mode enabled. Check if remote file exists.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Remote file exists and could contain further links,
but recursion is disabled -- not retrieving.

而对于错误链接,将会显示如下错误:

$ wget --spider URL
Spider mode enabled. Check if remote file exists.
HTTP request sent, awaiting response... 404 Not Found
Remote file does not exist -- broken link!!!
8. 增加重试次数

如果网络有问题或下载一个大文件也有可能失败,默认重试 20 次连接下载文件,如果需要,可以使用 --tries 增加重试次数。

$ wget --tries=40 URL
9. 下载多个文件

通过 -i 参数指定下载文件,下载多个文件。

$ cat filelist.txt
url1
url2
url3

$ wget -i filelist.txt
10. 镜像网站

使用 --mirror 下载整个网站,下面的例子是下载整个网站到本地。

$ wget --mirror -p --convert-links -P ./LOCAL URL
--miror  镜像下载
-p       下载所有为了html页面显示正常的文件
--convert-links  下载后,转换成本地的链接
-P ./LOCAL       保存所有文件和目录到本地指定目录
11. 过滤指定格式

你想下载一个网站,但你不希望下载图片,你可以使用以下命令。

$ wget --reject=gif url

tcpdump

tcpdump 会根据表达式 (expression) 来决定是否过滤报文,如果满足条件则会捕获报文,如果没有给出任何条件则会将所有的报文捕获;tcpdump 命令参数如下:

tcpdump [ -AbdDefhHIJKlLnNOpqRStuUvxX ] [ -B buffer_size ] [ -c count ]
        [ -C file_size ] [ -G rotate_seconds ] [ -F file ]
        [ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ]
        [ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]
        [ -W filecount ]
        [ -E spi@ipaddr algo:secret,...  ]
        [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]
        [ expression ]

参数详见:
  -n           : 不转换地址;-nn 不转换地址和端口号。
  -i interface : 指明要监听的介面,如eth0、lo等,any表示所有的,可以通过tcpdump -D查看对应的编号。
  -X           : 显示ASCII和十六进制。
  -XX          : 同-X,但同时显示包的头部信息。
  -S           : 使用绝对地址而非相对地址显示序列号。
  -s NUM       : 默认96字节的数据,0(或1514)表示捕获所有数据。
  -v -vv -vvv  : 显示详细信息,对应不同等级。
  -c           : 获取一定数量的包后停止。
  -e           : 同时获取ethernet header。
  -q           : 减少协议信息的显示。
  -E           : 通过提供的密码解密IPSEC包。
  -w/r         : 写入或者读取文件。

在表达式 (expression) 中通常有如下几种关键字:
  类型
    host: 指明是一台主机,如host 192.168.9.100。
    net: 捕获与网络地址的通讯包,如net 192.168.0.0/16。
    port: 指明是端口号,如port 21;也可以指定范围 portrange 21-23。

  传输方向
    src: 源地址,如src 192.168.9.100。
    dst: 目的地址,如dst 192.168.9.100。
    dst and src: 是目的地址且是源地址。
    dst or src(default): 是目的地址或是源地址。
    src|dst port: 指定目的或源端口号。

  协议
    fddi: 在FDDI(分布式光纤数据接口网络)上的特定网络协议,是ether的别名。
    ip arp rarp tcp udp icmp: 指定协议的类型。

  过滤包的大小
    less/greater 32 接受小于或大于32bytes的包,或者< >=等,其它运算符也可以。

  其它
    gateway broadcast less greater
    逻辑运算: 非'not'/'!',与'and'/'&&',或'or'/'||',通过逻辑可以将上述的条件连接起来。

另外常见的示例举例如下:

  • 指定主机,可以设定源和目的地,可以为主机名或者 IP 。
    tcpdump host 192.168.1.0                                      # 所有进出的数据包
    tcpdump host 192.168.1.0 and \(192.168.1.2 or 192.168.1.3 \)  # 截获0和2或3之间的通讯
    tcpdump ip host foo and ! bar                                 # 截获foo和非bar之间的通讯,!可换为not
    tcpdump src host hostname                                     # 主机发送的数据
    tcpdump dst host hostname                                     # 发送到主机的数据
  • 指定端口,协议,协议可以为tcp/udp
    tcpdump tcp port 23 host 192.168.1.0
  • 截获ftp发送的信息,获取用户名和密码
    tcpdump -i lo -nn -X port 21
  • 从192.168网络法往10或172.16网络的数据包
    tcpdump -nvX src net 192.168.0.0/16 and dst net 10.0.0.0/8 or 172.16.0.0/16
  • 从172.16网络发往192.168.0.2的非ICMP包
    tcpdump -nvvXSs 1514 dst 192.168.0.2 and src net 172.16.0.0/16 and not icmp

对于复杂的条件可以使用 (),终端中需要\( \)转义,或者用 '' 包裹,还可指定标志如 ACK 。

高级选项

常见的,只想监控 TCP 的三次握手建立链接以及四次握手断开连接,也就是说只需要捕获 TCP 控制包,如 SYN、ACK 或 FIN 标记相关的包。

基于 libpcap 的 tcpdump 支持标准的包过滤规则,如基于包头的过滤,也就是基于源目的 IP 地址、端口和协议类型,而且也支持更多通用分组表达式。包中的任意字节范围都可以使用关系或二进制操作符进行检查;对于字节范围表达,可以使用以下格式:

proto [ expr : size ]
参数详解:
  proto: 常见的协议之一,如 ip、arp、tcp、udp、icmp、ipv6
  expr : 与指定的协议头开头相关的字节偏移量,如直接偏移量(tcpflags)、取值常量(tcp-syn、tcp-ack、tcp-fin)
  size : 可选,从字节偏移量开始检查的字节数量

常见的场景:

# tcpdump -i eth0 "tcp[tcpflags] & (tcp-syn) != 0"           // 只捕获TCP SYNC包
# tcpdump -i eth0 "tcp[13] & (2) != 0"                       // 同上

# tcpdump -i eth0 "tcp[tcpflags] & (tcp-ack) != 0"           // 只捕获TCP ACK包
# tcpdump -i eth0 "tcp[tcpflags] & (tcp-fin) != 0"           // 只捕获TCP FIN包
# tcpdump -i eth0 "tcp[tcpflags] & (tcp-syn|tcp-ack) != 0"   // 只捕获TCP SYN或ACK包

可见 tcpflags==13,其它的还有 SYNCHRONIZE(2)、ACKNOWLEDGE(16)、URGENT(32)、PUSH(8)、RESET(4)、FINISH(1),如果是捕获 SYNC+ACK(18) 。

Netcat

Netcat 用于调试、检查网络的工具包,可用于创建 TCP/IP 连接,最大的用途就是用来处理 TCP UDP 套接字。在网络安全领域被称作 “TCP IP 的瑞士军刀” (Swiss-army knife for TCP/IP)。

在 CentOS 中,可以通过如下方式安装。

----- CentOS 6版本安装
# yum install nc

----- CentOS 7版本安装
# yum install nmap-ncat

常用参数简单列举如下。

常用参数:
  -k      保持打开,默认只监听一个客户端,如果某一端退出则退出
  -l      监听模式,用于接收链接请求,默认客户端退出后服务同时退出
  -n      直接使用IP地址,不做DNS解析
  -v      用于显示更详细的信息,可以使用多个
  -u      UDP模式
  -w secs 连接超时
  -t      使用TELNET协议
  -e file 链接后执行的命令

常见示例

在此简单列举下常见的示例。

运行于服务器模式,侦听指定端口

默认使用 ipv4(-4) ,可以显示使用 ipv6(-6);默认当客户端退出后,服务端同时也会退出,可以通过 -k 防止服务端退出;通过 -u 指定是 UDP 连接。

$ nc -l 2389                                     // 创建服务端,监听2389端口
$ nc 127.1 2389                                  // 使用客户端模式来连接到2389端口
端口扫描
----- 扫描10.1.1.180主机上的80或者1~14000号TCP端口
$ nc -v -z -w2 10.1.1.180 80
(UNKNOWN) [10.1.1.180] 80 (www) open
$ nc -v -z -w2 10.1.1.180 1-14000

----- 扫描10.1.1.180主机上的1~14000号UDP端口
$ nc -u -v -z -w2 10.1.1.180 1-14000
REMOTE主机绑定SHELL
----- 绑定到5354端口
$ nc -l -p 5354 -t -e c:\winnt\system32\cmd.exe
$ nc -l -p 5354 -t -e /bin/bash

----- 链接到服务器,可以执行Bash命令
$ nc 10.1.1.180 5354
传输文件/文件夹

将客户端的 testfile 传输到服务器端的 test,可以是文本文件,也可以是二进制文件。对于目录需要通过 tar 打包,然后再发送。

$ nc -l 2389 > test                              // 服务器端将文件重定向到test
$ cat testfile | nc 127.1 2389                   // 客户端传输文件,或者如下
$ nc 127.1 2389 &lt; testfile

$ tar -cvf -- DIR-NAME | nc -l 1567              // 打包目录
$ nc -n 172.1 1567 | tar -xvf -
$ tar -cvf -- DIR-NAME | bzip2 -z | nc -l 1567   // 同时进行压缩,减小带宽的使用
$ nc -n 172.1 1567 | bzip2 -d |tar -xvf -
加密传输
$ nc 127.1 1567 | mcrypt --flush --bare -F -q -d -m ecb > file.txt   // 在此使用mcrypt工具加密数据
$ mcrypt --flush --bare -F -q -m ecb < file.txt | nc -l 1567

以上两个命令会提示需要密码,确保两端使用相同的密码,也可以使用其它任意加密工具。

视频流

虽然不是生成流视频的最好方法,但如果服务器上没有特定的工具,使用 netcat 。

$ cat video.avi | nc -l 1567
$ nc 172.31.100.7 1567 | mplayer -vo x11 -cache 3000 -
克隆一个设备

如果已经安装配置一台 Linux 机器并且需要重复同样的操作对其他的机器,而你不想在重复配置一遍。

$ dd if=/dev/sda | nc -l 1567             // 假设系统在磁盘/dev/sda上
$ nc -n 172.1 1567 | dd of=/dev/sda       // 复制到其它机器

如果已经做过分区并且只需要克隆 root 分区,可以根据系统 root 分区的位置,更改 sda 为 sda1,sda2 等等。

超时控制

多数情况我们不希望连接一直保持,那么我们可以使用 -w 参数来指定连接的空闲超时时间,该参数紧接一个数值,代表秒数,如果连接超过指定时间则连接会被终止。

$ nc -l 2389
$ nc -w 10 localhost 2389                // 该连接将在 10 秒后中断。

注意: 不要在服务器端同时使用 -w 和 -l 参数,因为 -w 参数将在服务器端无效果。

发送Unix Domain Socket

直接发送数据。

$ echo "show stat" | nc -U /usr/var/your.sock

curl

curl 用于向服务器传输数据,它支持 http、https、ftp、ftps、scp、sftp、tftp、telnet 等协议。

常见示例

----- 查看源码,保存到某个文件;默认输出到终端
$ curl -o filename www.sina.com

----- 自动调转到新地址,会自动跳转为www.sina.com.cn
$ curl -L www.sina.com

----- 显示头信息以及网页代码,如果只查看头则可以使用-I参数
$ curl -i www.sina.com

----- 显示通信过程,通过-v可显示http通信的整个过程,包括端口连接和http request头信息
$ curl -v www.sina.com                             # 显示交互信息
$ curl --trace output.txt www.sina.com             # 显示更加信息的信息
$ curl --trace-ascii output.txt www.sina.com

----- 发送GET表单
$ curl www.example.com/form.cgi?data=xxx

----- 发送POST表单信息,需要把数据和网址分开,也就是--data参数,通过第一个参数对表单编码
$ curl --data-urlencode --data "data=April 1" www.example.com/form.cgi

各阶段时间

可以通过如下方式检查 HTTP 请求各个阶段的耗时。

-w 在执行完成后,按照指定的格式将信息输出到终端,更多参数可以查看man(1) curl
  time_namelookup DNS解析域名的时间 
  time_connect 客户端和服务端建立TCP连接的时间
  time_starttransfer 从客户端发出请求到收到服务端响应第一个字节的时间
  time_total 从客户端发出请求到收到服务端收到所有字节的时间
  speed_download 下载速度单位是B/s

$ curl -o /dev/null -s -w "%{time_namelookup}:%{time_connect}:%{time_starttransfer}:%{time_total}\n" \
	http://www.huawei.com


如果喜欢这里的文章,而且又不差钱的话,欢迎打赏个早餐 ^_^


About This Blog

Recent Posts

Categories

Related Links

  • RTEMS
    RTEMS
  • GNU
  • Linux Kernel
  • Arduino

Search


This Site was built by Jin Yang, generated with Jekyll, and hosted on GitHub Pages
©2013-2018 – Jin Yang