文章简单的介绍一些简单我们日常使用的一些命令,平时遇到问题时能够快速查找问题,提供一定的思路解决问题。
netstat
这个命令用来查看当前建立的网络连接(深刻理解netstat每一项代表的含义)。最经典的案例就是查看本地系统打开了哪些端口:
# sudo netstat -lnpt
[sudo] password for fgp:
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:3306 0.0.0.0:* LISTEN 2183/mysqld
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 2506/memcached
tcp 0 0 0.0.0.0:9292 0.0.0.0:* LISTEN 1345/python
tcp 0 0 0.0.0.0:6800 0.0.0.0:* LISTEN 2185/ceph-osd
tcp 0 0 0.0.0.0:6801 0.0.0.0:* LISTEN 2185/ceph-osd
tcp 0 0 0.0.0.0:28017 0.0.0.0:* LISTEN 1339/mongod
tcp 0 0 0.0.0.0:6802 0.0.0.0:* LISTEN 2185/ceph-osd
tcp 0 0 0.0.0.0:6803 0.0.0.0:* LISTEN 2185/ceph-osd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1290/sshd
netstat能够查看所有的网络连接,包括unix socket连接,其功能非常强大。
另外使用netstat还可以查看本地路由表:
# sudo netstat -nr
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 brqcb225471-1f
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 brqcb225471-1f
192.168.56.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
以上Genmask为0.0.0.0的表示默认路由,即连接外网的路由。网络中0.0.0.0的IP地址表示整个网络,即网络中的所有主机。它的作用是帮助路由器发送路由表中无法查询的包。如果设置了全零网络的路由,路由表中无法查询的包都将送到全零网络的路由中去。
ifconfig
查看网卡ip地址:
# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0C:29:A2:6E:53
inet addr:172.16.100.100 Bcast:172.16.255.255 Mask:255.255.0.0
inet6 addr: fe80::20c:29ff:fea2:6e53/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:37795 errors:0 dropped:0 overruns:0 frame:0
TX packets:55779 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2912696 (2.7 MiB) TX bytes:5708099 (5.4 MiB)
为网卡eth0增加一个新的地址(虚拟网卡):
# sudo ifconfig eth0:0 10.103.240.2/24
# ifconfig eth0:0
eth0:0 Link encap:Ethernet HWaddr 08:00:27:c9:b4:f2
inet addr:10.103.240.2 Bcast:10.103.240.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
关闭网卡以及开启网卡:
sudo ifconfig eth0 down
sudo ifconfig eth0 up
route
route命令用于查看和修改路由表:
查看路由表:sudo route -n
增加/删除路由分别为add/del子命令,比如删除默认路由:sudo route del defau
增加默认路由,网关为192.168.1.1,网卡为brqcb225471-1f:sudo route add default gw 192.168.1.1 dev brqcb225471-1f
查看网卡eth1配置:
# sudo ip link ls eth1
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:a2:6e:53 brd ff:ff:ff:ff:ff:ff
inet 172.16.100.100/16 brd 172.16.255.255 scope global eth0
inet6 fe80::20c:29ff:fea2:6e53/64 scope link
valid_lft forever preferred_lft forever
traceroute
ping命令用于探测两个主机间连通性以及响应速度,而traceroute会统计到目标主机的每一跳的网络状态(print the route packets trace to network host),这个命令常常用于判断网络故障,比如本地不通,可使用该命令探测出是哪个路由出问题了。如果网络很卡,该命令可判断哪里是瓶颈:
# sudo traceroute -I -n int32bit.me
traceroute to int32bit.me (192.30.252.154), 30 hops max, 60 byte packets
1 192.168.1.1 4.610 ms 5.623 ms 5.515 ms
2 117.100.96.1 5.449 ms 5.395 ms 5.356 ms
3 124.205.97.48 5.362 ms 5.346 ms 5.331 ms
4 218.241.165.5 5.322 ms 5.310 ms 5.299 ms
5 218.241.165.9 5.187 ms 5.138 ms 7.386 ms
...
可以看到,从主机到int32bit.me共经过30跳,并统计了每一跳间的响应时间。另外可以参考tracepath。
ss
ss命令也是一个查看网络连接的工具(another utility to investigate sockets),用来显示处于活动状态的套接字信息。关于ss的描述,引用Linux命令大全-ss命令。
ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。当服务器的socket连接数量变得非常大时,无论是使用netstat命令还是直接cat /proc/net/tcp,执行速度都会很慢。可能你不会有切身的感受,但请相信我,当服务器维持的连接达到上万个的时候,使用netstat等于浪费 生命,而用ss才是节省时间。天下武功唯快不破。ss快的秘诀在于,它利用到了TCP协议栈中tcp_diag。tcp_diag是一个用于分析统计的模块,可以获得Linux 内核中第一手的信息,这就确保了ss的快捷高效。当然,如果你的系统中没有tcp_diag,ss也可以正常运行,只是效率会变得稍慢。
其中比较常用的参数包括:
-l 查看处于LISTEN状态的连接
-t 查看tcp连接
-4 查看ipv4连接
-n 不进行域名解析
因此我们可以通过ss命令查看本地监听的所有端口(和netstat命令功能类似):
#ss -t -l -n -4
wget
wget是一个强大的非交互网络下载工具(The non-interactive network downloader),虽然curl也支持文件下载,不过wget更强大,比如支持断点下载等。
最简单的用法直接加上文件URL即可:wget http://xxx/xxx/video.mp4
使用-r参数为递归的下载网页,默认递归深度为5,相当于爬虫,用户可以通过-l指定递归深度。注意wget默认没有开启断点下载功能,需要手动传入-c参数。
如果需要批量下载,可以把所有的URL写入文件download.txt,然后通过-i指定下载文件列表:wget -i download.txt
如果用户不指定保存文件名,wget默认会以最后一个符合/的后面的字符作为保存文件名,有时不是我们所期望的,此时需要-O指定保存的文件名。通过--limit-rate可以限制下载的最大速度。使用-b可以实现后台下载。
另外wget甚至可以镜像整个网站:wget --mirror -p --convert-links -P int32bit http://int32bit.me
wget还支持指定下载文件的格式,比如只下载jpg图片:wget -A.jpg -r -l 2 http://int32bit.me/
axel
axel是一个多线程下载工具(A light download accelerator for Linux),通过建立多连接,能够大幅度提高下载速度,所以我经常使用这个命令开挂下载大文件,比wget快多了,并且默认就支持断点下载:
开启20个线程下载文件:axel -n 20 URL
这个强大的下载工具极力推荐,非常好用!
ipset
以上我们通过iptables封IP,如果IP地址非常多,我们就需要加入很多的规则,这些规则需要一一判断,性能会下降(线性的)。ipset能够把多个主机放入一个集合,iptables能够针对这个集合设置规则,既方便操作,又提高了执行效率。注意ipset并不是只能把ip放入集合,还能把网络地址、mac地址、端口等也放入到集合中。
首先我们创建一个ipset:
# sudo ipset create blacklist hash:ip
以上创建了一个blacklist集合,集合名称后面为存储类型,除了hash表,还支持bitmap、link等,后面是存储类型,我们指定的是ip,表示我们的集合元素为ip地址。
我们为这个blacklist集合增加一条规则,禁止访问:
# sudo iptables -I INPUT -m set --match-set blacklist src -j DROP
此时只要在blacklist的ip地址就会自动加入黑名单。
我们把192.168.56.1和192.168.56.3加入黑名单中:
# sudo ipset add blacklist 192.168.56.3
# sudo ipset add blacklist 192.168.56.1
此时ssh连接中断,使用vnc连接查看:
# /github/int32bit.github.io$ sudo ipset list blacklist
Name: blacklist
Type: hash:ip
Revision: 2
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 176
References: 1
Members:
192.168.56.1
192.168.56.3
把192.168.56.1移除黑名单:
# sudo ipset del blacklist 192.168.56.1
我们上面的例子指定的类型为ip,除了ip,还可以是网络段,端口号(支持指定TCP/UDP协议),mac地址,网络接口名称,或者上述各种类型的组合。比如指定 hash:ip,port就是 IP地址和端口号共同作为hash的键。指定类型为net既可以放入ip地址,也可以放入网络地址。
另外ipset还支持timeout参数,可以指定时间,单位为秒,超过这个时间,ipset会自动从集合中移除这个元素,比如封192.168.56.11分钟时间不允许访问
# sudo ipset create blacklist hash:net timeout 300
# sudo ipset add blacklist 192.168.56.1 timeout 60
以上首先创建了支持timeout的集合,这个集合默认超时时间为300s,接着把192.168.56.1加入到集合中并设置时间为60s。
注意:执行ipset add时指定timeout必须保证创建的集合支持timeout参数,即设置默认的timeout时间.如果不想为集合设置默认timeout时间,而又想支持timeout,可以设置timeout为0,相当于默认不会超时。
linux常用一些命令:
-
网络配置相关:ifconfig、ip
-
路由相关:route、netstat、ip
-
查看端口工具:netstat、lsof、ss、nc、telnet
-
下载工具:curl、wget、axel
-
防火墙:iptables、ipset
-
流量相关:iftop、nethogs
-
连通性及响应速度:ping、traceroute、mtr、tracepath
-
域名相关:nslookup、dig、whois
-
web服务器:python、nginx
-
抓包相关:tcpdump
-
网桥相关:ip、brctl、ifconfig、ovs