190. Linux中的网络相关

防火墙

查看防火墙状态

1
2
$ firewall-cmd --state
running

显示running,则表示防火墙正在运行。另外,还可以使用systemctl status firewalld来查看防火墙是否开启:

1
$ systemctl status firewalld

查看防火墙所有已开放的端口

1
2
$ firewall-cmd --zone=public --list-ports
7021/tcp 6001/tcp 8080/tcp 16749/tcp

开放端口

1
2
3
4
5
6
7
8
9
# 开放5612端口
$ firewall-cmd --zone=public --add-port=5612/tcp --permanent


#关闭5612端口
$ firewall-cmd --zone=public --remove-port=5612/tcp --permanent


#添加端口,格式为:端口/通讯协议 --permanent #永久生效,没有此参数重启后失效

关闭防火墙

在测试环境或者开发环境中,有时候为了测试方便,可以临时关闭防火墙。但是要注意,只有在保证安全前提下才可关闭防火墙。关闭防火墙的命令为:

1
$ systemctl stop firewalld.service

此外,还可以使用:

1
$ systemctl stop firewalld

若开启则将 stop 改为 start

重启防火墙

防火墙端口策略改变后,需要重启才能生效:

1
$ firewall-cmd --reload

查看监听的端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

$ netstat -lnpt
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:17000 0.0.0.0:* LISTEN 22781/./src/redis-s
tcp 0 0 0.0.0.0:17001 0.0.0.0:* LISTEN 22783/./src/redis-s
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 8095/sshd
tcp 0 0 0.0.0.0:6589 0.0.0.0:* LISTEN 22781/./src/redis-s
tcp 0 0 0.0.0.0:7002 0.0.0.0:* LISTEN 22783/./src/redis-s
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1183/master
tcp6 0 0 127.0.0.1:8004 :::* LISTEN 13884/java
tcp6 0 0 :::17000 :::* LISTEN 22781/./src/redis-s
tcp6 0 0 :::17001 :::* LISTEN 22783/./src/redis-s
tcp6 0 0 :::18767 :::* LISTEN 13884/java
tcp6 0 0 :::9904 :::* LISTEN 13884/java
tcp6 0 0 :::8080 :::* LISTEN 13884/java
tcp6 0 0 :::22 :::* LISTEN 8095/sshd
tcp6 0 0 :::6589 :::* LISTEN 22781/./src/redis-s
tcp6 0 0 :::7002 :::* LISTEN 22783/./src/redis-s
tcp6 0 0 ::1:25 :::* LISTEN 1183/master

检查端口被哪个进程占用

1
2
$ netstat -lnpt |grep 8080
tcp6 0 0 :::8080 :::* LISTEN 13884/java

中止进程

当由于某种原因,按正常方法无法关掉进程的时候,可以强制关闭(关掉端口):

1
$ kill -9 8080

其他相关命令

1
2
3
4
5
6
7
8
9
10
11
firewall-cmd --get-zones                      ##列出支持的zone
firewall-cmd --get-services ##列出支持的服务,在列表中的服务是放行的
firewall-cmd --query-service ftp ##查看ftp服务是否支持,返回yes或者no
firewall-cmd --add-service=ftp ##临时开放ftp服务
firewall-cmd --add-service=ftp --permanent ##永久开放ftp服务
firewall-cmd --remove-service=ftp --permanent ##永久移除ftp服务
firewall-cmd --add-port=80/tcp --permanent ##永久添加80端口
firewall-cmd --remove-port=80/tcp --permanent ##永久移除80端口
firewall-cmd --zone=public --list-ports ##查看已开放的端口
iptables -L -n ##查看规则,这个命令是和iptables的相同的
man firewall-cmd

tcpdump

tcpdump 是分析网络和排查网络问题的一个很好用的工具,它通过抓取数据包,显示网络的实时情况,并将结果输出到标准输出(STDOUT)上,也可以存储在文件中。关于它的具体使用,它有很多可用的选项,本文我们介绍关于此命令常用的几个核心选项。

检查可用网口(interfaces)

查询所有可用的网口,使用 -D 选项:

1
sudo tcpdump -D

上述命令将会列出系统中所有可用的网络接口,包括有线和无线接口,使用 --list-interfaces 选项也可以达到相同的目的:

1
sudo tcpdump --list-interfaces

运行结果如下图所示:

抓取某个网口的数据包

不适用任选项的情况下,tcpdump 将会扫描所有网口,使用 -i 选项可抓取某个特定网口的数据:

1
tcpdump -i <target-interface>

在上述命令中 <target-interface> 表示网口名称。假如我们要抓取网口 eth0 的数据,可使用如下命令:

1
sudo tcpdump -i eth0

注:为了方便演示,我们后文中将会使用 eth0 或者 eth1 作为目标网口。

预设抓包数量

使用 -c 选项可以预设抓包的数量。比如,下面命令将会抓取 4 个数据包:

1
sudo tcpdump -c 4 -i eth0 

如果没有预设抓包数量,需要使用 ctrl+c 或者 ctrl+z 手动停止抓包操作。

获取详细输出

使用 -v 选项可以获取详细输出,如下命令:

1
sudo tcpdump -c 6 -v -i eth0 

详情的输出,有个详细程度的区别,换句话说,可以使用更多的 -v 标志,比如 -vv 或者 -vvv,这将会在终端上产生更加详细的输出:

1
sudo tcpdump -vv -i eth0 

以 ASCII 格式打印抓取到的数据

有时候我们希望数据以 HEX 或者 ASCII 格式展现,这里可以使用 -A 选项来表示以 ASCII 格式,-XX 选项表示以 ASCII 和 HEX 格式展示数据:

1
sudo tcpdump -XX -i eth0

抓取从某个源 IP 发送的数据包

要抓取来自某个特定源 IP 的数据包,可使用如下命令:

1
sudo tcpdump -i eth0 src <source-ip-address>

比如,我们查看来自 IP 为 192.168.56.11 的数据:

1
sudo tcpdump -i eth1 -c 5 src 192.168.56.11

上面例子中的计数 5 为只抓取5个数据包。

抓取发送到特定目标 IP 的数据包

如果要检查发送到特定目标 IP 地址的流量,可使用以下命令:

1
sudo tcpdump -i eth0 dst <source-ip-address>

比如我们将目标 IP 设为 192.168.56.11,查看流量的详细信息:

1
sudo tcpdump -i eth1 -c 5 dst 192.168.56.11

在 tcpdump 中使用过滤选项

tcpdump 命令提供了一些过滤选项,以缩小抓包数据的范围,这样可以过滤掉一些不必要的数据,以便于分析数据。过滤方式包括主机地址、端口、协议或者其他过滤条件。下面我们来举例说明。

端口号

如果要执行端口号(比如端口22)过滤,可参照如下方式执行 tcpdump 命令:

1
sudo tcpdump -i eth0 port 22

此命令将抓取 TCP 和 UDP 数据流。

协议

与端口号类似,proto 指令根据特定流量过滤数据包捕获。在这里,你可以使用协议名称或协议编号作为参数值:

1
sudo tcpdump -i eth0 proto tcp

或者:

1
sudo tcpdump -i eth0 proto 6

上面两个命令是相同的,因为 6 是 TCP 的协议号。

主机过滤

host 参数使用特定主机的IP,筛选来自该主机的数据流:

1
sudo tcpdump -i eth0 host 192.168.56.10

这将捕获来自此主机的所有流量。此外,还可以对主机应用多个过滤条件,以针对特定类型的数据包流量。

比如:

1
sudo tcpdump -i eth1 -c 50 “(host 192.168.56.11) and (port 443 or port 80)"

上面例子中,我将多个过滤条件合并到一个规则中,过滤 http 和 https 数据流,这两个协议的端口分分别为 80 和 443。我们之前分享过一篇常见网络端口的文字,感兴趣的朋友可以参考:Linux中常见的网络端口号

保存抓取到的数据

如果要保存抓取到的数据,可参考如下命令:

1
sudo tcpdump -i eth0 -c 10 -w my_capture.pcap

这里需要注意的是,最好将要抓取的数据包预设一个最小的值,否则需要手动停止该进程。

读取抓取到的数据

我们可以使用 Wireshark或者其他图形网络分析工具分析抓取到的数据(上个例子中保存到.pcap文件中的数据)。此外,也可以使用 tcpdump 本身来读取:

1
tcpdump -r my_capture.pcap

当你进行数据包抓取的时候,这是一个很好用的工具。如果你想用更直观的方式来分析数据包,可以试试 Wireshark。

查找 IP 地址

fconfig 是 Linux 中最受欢迎的查询本机 IP 地址的方法。但是现如今 ifconfig 命令已经被启用了。在某些 Linux 发行版上已经不用了:

1
command not found: ifconfig

那么,除此以外还有什么别的方式来查询 IP 地址呢?今天我们就来了解一下这个问题。

在 Linux 命令行中查找 IP 地址

现在,可以使用 ip 命令来查询 IP 地址。ip 命令是通用的,可以用于网络相关的其他一些事情。

不过,要显示 IP 地址,可以使用 ip addr,ip a 或者 ip address,如下所示命令:

1
$ ip address

输出如下:

1
2
3
4
5
6
7
8
9
10
11
12
13

1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: wlp58s0: mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 9c:b6:d0:d0:fc:b5 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.20/24 brd 192.168.1.255 scope global dynamic noprefixroute wlp58s0
valid_lft 5962sec preferred_lft 5962sec
inet6 fe80::bf14:21e3:4223:e5e4/64 scope link noprefixroute
valid_lft forever preferred_lft forever

在上面的输出中,你可以忽略第一个名为lo(loopback)的输出,除此以外,可以看到 IP 地址显示为192.168.1.20。它后面的24是子网掩码。

如上所示,可以使用 ip 命令获取主机的 IP 地址。除此以外,还可以通过 bash 脚本获取 IP 地址。

获取 IP 地址的其他方法

除了使用 ip 命令以外,还有其他的几个方法来获取 IP 地址。

使用 hostname 命令查看IP地址

hostname 命令通常用于显示系统的主机名,也可以用于显示主机的IP地址:

1
$ hostname -I

上述命令会显示主机的 IP 地址:

1
2
$ hostname -I
192.168.0.106

使用 nmcli 工具显示 IP 地址

大多数 Linux 发行版都有一个 Network Manager 的工具,该工具有一个名为 nmcli 的命令行界面,可以使用此 nmcli 工具来查看网络配置。比如可以使用如下命令查看 IP 地址:

1
$ nmcli -p device show

那么,ifconfig 呢?

实际上,我们仍然可以使用 ifconfig 命令。如果系统中不存在这个命令,我们可以手动安装,它存在于网络工具包中。

在基于 Ubuntu 的 Linux 中,可以使用如下命令安装网络工具:

1
$ sudo apt install net-tools

安装完成后,就可以使用 ifconfig 命令来查询 IP 地址了:

1
$ ifconfig -a

输出如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 1000 (Local Loopback)
RX packets 14855 bytes 3027297 (3.0 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 14855 bytes 3027297 (3.0 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
wlp58s0: flags=4163 mtu 1500
inet 192.168.0.106 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::bf14:21e3:4223:e5e4 prefixlen 64 scopeid 0x20
ether 9c:b6:d0:d0:fc:b5 txqueuelen 1000 (Ethernet)
RX packets 88413 bytes 61851930 (61.8 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 56505 bytes 11409219 (11.4 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

不过,因为 ifconfig 命令已经被弃用,所以我们还是不鼓励使用网络工具,建议使用 ip 命令。

查询公网IP地址

上面我们介绍的都是查询本地内网IP地址的方法,也就是局域网的 IP 地址。

内网 IP 地址是局限在局域网中的地址,用于与局域网中的其他设备进行通信。局域网之外的其他设备无法通过这个 IP 地址找到你。我们所说的公网地址一般是指路由器的IP地址,路由器通过内网 IP 与你的设备通信。

那么,如何获取公网IP地址呢?这就需要借助于第三方工具了。

比如,可以使用 OpenDNS 的 host 命令来获取公网 IP 地址。

1
host myip.opendns.com resolver1.opendns.com

其输出如下:

1
Using domain server:Name: resolver1.opendns.comAddress: 208.67.222.222#53Aliases:myip.opendns.com has address 202.91.87.117Host myip.opendns.com not found: 3(NXDOMAIN)Host myip.opendns.com not found: 3(NXDOMAIN)

查询默认网关

网关是两个网络之间的入口,路由器就是网关的一个例子。你的网络中所有的流量都是流向路由器,然后再通过路由器流向互联网。

有时候你需要知道路由器的 IP 地址,网关 IP 其实就是正常设置中路由器的 IP 地址。

下面我们使用 ip 命令在命令行中显示网关 IP,打开一个终端,然后输入如下命令:

1
ip route

会看到如下输出:

1
2
3
default via 192.168.0.1 dev wlp58s0 proto dhcp metric 600
169.254.0.0/16 dev wlp58s0 scope link metric 1000
192.168.0.0/24 dev wlp58s0 proto kernel scope link src 192.168.0.106 metric 600

上面的输出中,注意 default 开头的那一行,后面跟的就是默认网关 IP 地址。

或者,可以将上述命令与 grep 结合使用:

1
ip route | grep default

这个命令的输出只会给出默认网关 IP:

1
default via 192.168.0.1 dev wlp1s0 proto dhcp metric 600

如上所示,192.168.0.1 即为我们例子中的默认网关 IP。

查找网关IP地址的其他方法

Linux 中的 ip 命令提供了大多数网络相关的操作,如果用过一段时间的 Linux 系统,我们可能就会注意到,要完成某件事情,一般会有多种不同的方法。所以,要查看默认网关,还有其他的一些方法,比如使用其他网络命令行工具,接下来我们就来看一下。

使用 route 命令查询网关地址

我们可以在 route 命令中使用 -n 选项来显示包含 IP 地址的路由表,如下所示:

1
route -n

输出如下所示:

1
2
3
4
5
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 600 0 0 wlp58s0
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 wlp58s0
192.168.0.0 0.0.0.0 255.255.255.0 U 600 0 0 wlp58s0

注意到其中的 UG 标志了吗?U 表示路由“向上”,G 表示它是网关

使用 netstat 命令查询网关

我们还可以使用 netstat 命令显示组成网关的路由表,以此来获取网关地址。看如下命令:

1
netstat -r -n

其输出与 route 命令的输出相同:

1
2
3
4
5
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 wlp58s0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 wlp58s0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 wlp58s0

可以通过 G 标志来找到网关地址。

端口占用情况

netstat

1
netstat -tunlp

用于显示 tcp,udp 的端口和进程等相关情况。

netstat 查看端口占用语法格式:

1
netstat -tunlp | grep 端口号
  • -t (tcp) 仅显示tcp相关选项
  • -u (udp)仅显示udp相关选项
  • -n 拒绝显示别名,能显示数字的全部转化为数字
  • -l 仅列出在Listen(监听)的服务状态
  • -p 显示建立相关链接的程序名

例如查看 8000 端口的情况,使用以下命令:

1
2
# netstat -tunlp | grep 8000
tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 26993/nodejs

更多命令:

1
2
3
netstat -ntlp   //查看当前所有tcp端口
netstat -ntulp | grep 80 //查看所有80端口使用情况
netstat -ntulp | grep 3306 //查看所有3306端口使用情况

lsof

不管你是直接登录的系统,还是使用 ssh 连接的,都可以使用 lsof 命令来检查端口:

1
sudo lsof -i -P -n

该命令用于查找用户使用的文件和进程。上述命令中的选项,包括:

选项 说明
-i 如果没有指定IP地址,那么此选项就会选择所有网络文件的列表;
-P 禁止将网络文件的端口号转换为端口名;
-n 禁止将网络文件的网络编号转为主机名。

但是,这也会展示许多计算机并没有监听的其他端口。

我们可以通过管道将此输出传输到 grep,并匹配模式 “LISTEN”,如下所示:

1
sudo lsof -i -P -n | grep LISTEN

这样就只显示计算机正在监听的,以及正在运行的服务所占用的端口。

netcat

nc(Netcat) 是一个命令行实用程序,使用TCP和UDP协议在网络计算机之间读取和写入数据。

以下是nc命令的语法:

1
nc [options] host port

这个工具有一个很实用的 -z 选项,它会让 nc 命令扫描正在监听的守护进程,但是不会向端口发送任何数据。

将其与 -v 选项结合,启动详细信息,会有详细信息的输出。

如下是使用 nc 命令扫描开放的端口:

1
nc -z -v <IP-ADDRESS> 1-65535 2>&1 | grep -v 'Connection refused'

将上面的<IP-ADDRESS> 替换为你要检查的 Linux 系统的IP地址。

至于为什么我会选择 1 到 65535,那是因为端口的范围是 1 到 65535

最后,通过管道将输出传到grep,使用 -v 选项可以排除“拒绝连接( Connection refused)”的端口。

这样就会扫描到计算机上所有开放的端口,这些端口可以被网络上的其他机器访问。

以上两种方法中,lsof 比 nc 速度要快。但是使用 lsof 需要先登录到系统中,并且具有 sudo 访问权限。所以,如果你扫描的是你已经登录到的系统,可以优先选择 lsof。

nc 命令可以很灵活的扫描端口,而不需要登录。

netstat

Linux下网络连接分析指令:netstat

netstat指令主要用于显示与IP、TCP、UDP和ICMP协议相关的统计数据及网络相关信息,可以用于检验本机各端口的网络连接情况,哪个端口被哪个程序占用、TCP连接状态、统计网络连接信息等。

Linux系统终端输入netstat命令,会输出以下内容显示tcp相关的信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost ~]# netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost.localdoma:ssh 10.47.0.58:53706 ESTABLISHED
tcp 0 0 localhost.localdom:http 10.72.17.179:55137 ESTABLISHED
tcp 0 0 localhost:globe localhost:59988 ESTABLISHED
tcp 0 0 localhost:dc localhost:40862 ESTABLISHED
tcp6 0 0 172.31.2.63:56949 172.31.2.169:6379 ESTABLISHED
tcp6 0 0 172.31.2.63:46256 172.31.2.169:6379 ESTABLISHED
tcp6 0 0 172.31.2.63:25068 172.31.2.65:mysql ESTABLISHED
tcp6 0 0 172.31.2.63:21653 172.31.2.65:mysql ESTABLISHED
tcp6 0 0 172.31.2.63:36472 172.31.2.169:6379 ESTABLISHED
tcp6 0 0 172.31.2.63:26128 172.31.2.65:mysql ESTABLISHED
tcp6 0 0 172.31.2.63:57247 172.31.2.169:6379 ESTABLISHED
...

从整体上看,netstat指令的输出分为以下两个部分:

1)Active Internet connections (w/o servers) 部分

这一部分称为有源的tcp连接,其中Recv-Q和Send-Q分别指接受队列和发送队列,这些数字一般都是为0。如果不为0,则表示数据包正在队列中堆积。

2)Active Unix domain sockets (w/o servers) 部分

这一部分称为有源的Unix域套接口(和网络套接字一样,但是只能用于本机通信,性能可以提高一倍)。proto显示连接用的协议,RefCnt表示连接到本套接口上的进程号,Types显示套接口的类型,State显示套接口当前的状态,Path表示连接到套接口的其他进程使用的路径名。

了解了netstat指令的这些含义后,再配合一些常用的选项,可以让netstat指令输出更丰富有用的信息,netstat指令常用的选项如下:

参数 说明
-a/-all 显示所有选项,默认不显示listen相关;
-t/-tcp 仅显示tcp传输协议的连接状况;
-u/-udp 仅显示udp传输协议的连接状况;
-n/-numeric 拒绝显示别名,能显示数字的全部转化成数字;
-l/-listening 仅列出在listen(监听)状态的socket;
-p/-programs 显示正在使用socket的程序识别码和程序名称;
-r/-route 显示路由信息;
-s/-statistice 显示网络工作信息统计表;
-c/-continuous 每隔指定时间执行netstat指令。

提示:listen和listening的状态只有使用 -a 或 -l 选项才能看到。

例子

列出所有端口信息

netstat -a 指令列出当前操作系统的所有端口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@localhost ~]# netstat -a|more
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:http 0.0.0.0:* LISTEN
tcp 0 0 localhost:dc 0.0.0.0:* LISTEN
tcp 0 0 localhost:globe 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN
tcp 0 0 localhost.localdo:44550 localhost.localdo:12888 TIME_WAIT
tcp 0 0 localhost.localdom:http 10.72.145.14:54042 ESTABLISHED
tcp 0 0 localhost.localdom:http 10.72.145.14:60963 ESTABLISHED
tcp 0 0 localhost.localdom:http 10.72.145.14:54882 ESTABLISHED
tcp 0 0 localhost.localdom:http 10.72.145.14:64495 ESTABLISHED
tcp 0 0 localhost.localdo:44644 localhost.localdo:12888 TIME_WAIT
tcp 0 0 localhost.localdom:http 10.72.145.14:49926 ESTABLISHED
tcp 0 52 localhost.localdoma:ssh 10.47.0.58:63897 ESTABLISHED
tcp 0 0 localhost.localdo:44510 localhost.localdo:12888 ESTABLISHED
...

列出所有tcp端口信息

netstat -at指令列出所有处于监听状态的sockets

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost ~]# netstat -at
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:http 0.0.0.0:* LISTEN
tcp 0 0 localhost:dc 0.0.0.0:* LISTEN
tcp 0 0 localhost:globe 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN
tcp 0 0 localhost.localdom:http 10.72.145.14:54042 ESTABLISHED
tcp 0 0 localhost.localdom:http 10.72.145.14:60963 ESTABLISHED
tcp 0 0 localhost.localdom:http 10.72.145.14:54882 ESTABLISHED
...

列出所有udp端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#列出所有udp端口
[root@localhost ~]# netstat -au
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 localhost:323 0.0.0.0:*
udp6 0 0 [::]:12521 [::]:*
udp6 0 0 [::]:16620 [::]:*
udp6 0 0 localhost:323 [::]:*
udp6 0 0 [::]:16712 [::]:*
udp6 0 0 [::]:16861 [::]:*
udp6 0 0 [::]:57943 [::]:*
udp6 0 0 [::]:37501 [::]:*
udp6 0 0 [::]:62094 [::]:*
udp6 0 0 [::]:33765 [::]:*
udp6 0 0 [::]:34081 [::]:*
udp6 0 0 [::]:11239 [::]:*
udp6 0 0 [::]:27708 [::]:*
udp6 0 0 [::]:31870 [::]:*
udp6 0 0 [::]:28440 [::]:*
udp6 0 0 [::]:36716 [::]:*

只显示监听端口

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost ~]# netstat -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:http 0.0.0.0:* LISTEN
tcp 0 0 localhost:dc 0.0.0.0:* LISTEN
tcp 0 0 localhost:globe 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN
tcp6 0 0 localhost:18044 [::]:* LISTEN
tcp6 0 0 localhost:18045 [::]:* LISTEN
tcp6 0 0 [::]:9853 [::]:* LISTEN
tcp6 0 0 [::]:8093 [::]:* LISTEN
...

显示tcp或udp端口的统计信息

netstat -st-su 指令输出tcp或udp端口的统计信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@localhost ~]# netstat -st
IcmpMsg:
InType0: 1419
InType3: 8365968
InType8: 2051697
InType11: 247
InType13: 34
InType17: 17
InType37: 3
InType165: 4
OutType0: 2051695
OutType3: 7071013
OutType8: 32209
OutType14: 34
Tcp:
112465077 active connections openings
82617386 passive connection openings
43204454 failed connection attempts
13439770 connection resets received
...

显示特定程序

netstat -p 指令可以与其他开关一起使用,可以添加pid/进程名称netstat输出中,debug系统时可以很方便的发现特定端口运行程序。

1
2
3
4
5
6
7
8
[root@localhost ~]# netstat -pt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 localhost.localdom:http 10.47.0.72:60182 ESTABLISHED 23849/nginx: worker
tcp 0 0 localhost.localdom:http 10.72.145.14:54042 ESTABLISHED 23849/nginx: worker
tcp 0 0 localhost.localdom:http 10.72.145.14:60963 ESTABLISHED 23849/nginx: worker
tcp 0 0 localhost.localdom:http 10.72.145.14:54882 ESTABLISHED 23849/nginx: worker
...

在输出中显示pid和进程名称 netstat -p

在netstat指令输出中不显示主机名、端口和用户信息

可以使用 netstat -n 指令使用数字代替名称加速输出显示结果:

1
$ netstat -an

持续输出netstat信息

每隔1秒输出网络信息:

1
$ netstat -ntpl -c

显示核心路由信息

使用 netstat -rn 显示数字格式,不查询主机名称

1
$ netstat -r

找出程序运行的端口

netstat -ap|grep ssh 指令并不是所有的进程都能找到,没有权限的会不显示,使用root权限查看所有的信息。

找出运行在指定端口的进程

使用 netstat -ntpl 指令过滤出端口为22的程序

1
2
3
[root@localhost ~]# netstat -ntpl | grep ':22'
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 9332/sshd: /usr/sbi
tcp6 0 0 :::22 :::* LISTEN 9332/sshd: /usr/sbi

显示网络接口列表

netstat -i指令查看当前主机网络接口信息

1
2
3
4
5
[root@localhost ~]# netstat -i
Kernel Interface table
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500 3575801954 0 976636 0 812647343 0 0 0 BMRU
lo 65536 1345189379 0 0 0 1345189379 0 0 0 LRU

使用 netstat -ie 可以显示网络接口的详细信息。

ip和tcp状态分析

统计当前系统连接服务22端口的前20个ip地址:

1
$ netstat -nat | grep "192.168.1.56:22" | awk '{pring $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -20

tcp各种状态列表

1
$ netstat -nat |awk '{print $6}'

tcp状态信息统计

1
$ netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn

代码实现思路:先把状态全部取出来,然后使用uniq -c统计,再进行排序。

分析ip地址

1
$ awk '{print $1}' /data/app/nginx/logs/access.log|sort|uniq -c|sort -nr|head -10

如上代码分析了web服务器access.log获得访问前10位的ip地址。

traceroute

Linux 中使用 traceroute 命令跟踪目标地址

traceroute 类似于 ping 命令,但是提供了更详细的信息输出,它跟踪从原点到目标系统的路由。当你连接到某个远程系统时,数据会经过几个中间节点(比如你的路由器,ISP路由等等)的传输。

traceroute 一般为系统管理员或者网络管理员用于对网络进行故障排除。

在 Linux 中安装 traceroute

在大多数 Linux 发行版中,traceroute 都没有被预安装,所以需要我们手动安装。

如果你用的是 Ubuntu,可以使用如下命令安装:

1
sudo apt install traceroute

如果你用的是 Fedora,可以使用如下命令:

1
sudo yum install traceroute

下面,我们介绍几个使用 traceroute 的例子。

使用 traceroute 命令

我们先来介绍一个最基本的例子,使用 traceroute 命令跟踪一个主机名,它将显示到达目的地所需的路由器列表(带IP):

1
traceroute google.com

如上图所示,它需要7个路由器才能到达目的地,默认情况下,它向每个路由器发送3个包,并返回响应所需的时间。

下面我们来看看其他几个例子。

配置等待时间

traceroute 中的默认等待时间为3秒,要修改这个时间,可以使用 -w 选项。比如,我们将等待时间改为 1 秒:

1
traceroute -w 1 google.com

更改收发包的数量

默认情况下,traceroute 为一个跃点(hop)发送3个包,如果想更改此行为,可使用 -q 选项。

比如,我们我们将其改为4个数据包:

1
traceroute -q 4 google.com

指定最大跃点数

在traceroute中,单个查询的默认最大跳数为30,可以扩展到255。使用 -m 选项:

1
traceroute -m 4 google.com

指定 TTL

默认情况下,traceroute 将以第一个 TTL 开始,但您可以使用 -f 选项更改此行为。

如下例子,我们从第5个TTL开始跟踪 google:

1
traceroute -f 5 google.com

添加备用源IP地址

使用 -s 选项添加备用 IP 地址:

1
traceroute -s 192.168.1.7 google.com

跟踪时禁用主机名映射到IP地址

如果出于某种原因希望在跟踪时禁用主机名映射,可以使用 -n 选项:

1
traceroute -n google.com

通过网关路由包

可以在要跟踪路由的域时,使用 -g 选项指定网关地址。

比如,我们添加 192.168.1.7 作为网关地址:

1
traceroute -g 192.168.1.7 google.com

更改目标端口

可以使用 -p 来指定要跟踪的目标端口:

1
traceroute -p 29879 google.com

设置最大数据包长度

默认情况下,traceroute 跟踪的数据包长度为 60 字节(bytes),可以在目标地址后跟一个数字(即包大小)来修改:

1
traceroute google.com 100

禁用探测数据包碎片(probe packet fragmentation)

如果你不想允许探测数据包碎片化,有一种简单的方法来实现这个目的,使用 -F 选项:

1
traceroute -F google.com

如果你想要了解 traceroute 是如何工作的,可以参考另一篇指南,这个指南解释了 traceroute 的工作原理,点击这里

设置静态IP

fedora

NetworkManager

  1. 查看并记录Linux实例的网卡信息: IP地址、子网掩码、网关信息

    1
    ifconfig
  2. 查看实例的路由表和网关信息

    1
    route -n
  3. 查看DNS

    1
    $ nmcli device show | grep DNS

    如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    root@localhost:/etc/sysconfig/network-scripts# nmcli device show
    GENERAL.DEVICE: ens18
    GENERAL.TYPE: ethernet
    GENERAL.HWADDR: FE:FC:FE:7E:DB:51
    GENERAL.MTU: 1500
    GENERAL.STATE: 100 (connected)
    GENERAL.CONNECTION: ens18
    GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveConnection/2
    WIRED-PROPERTIES.CARRIER: on
    IP4.ADDRESS[1]: 10.10.32.10/16
    IP4.GATEWAY: 10.10.0.1
    IP4.ROUTE[1]: dst = 10.10.0.0/16, nh = 0.0.0.0, mt = 100
    IP4.ROUTE[2]: dst = 0.0.0.0/0, nh = 10.10.0.1, mt = 100
    IP4.DNS[1]: 10.10.0.1
    IP4.DNS[2]: 223.5.5.5
    IP6.ADDRESS[1]: 240c:c983:5:a569::e27/128
    IP6.ADDRESS[2]: 240c:c983:5:a569:fcfc:feff:fe7e:db51/64
    IP6.ADDRESS[3]: fe80::fcfc:feff:fe7e:db51/64
    IP6.GATEWAY: fe80::266e:96ff:fe19:972
    IP6.ROUTE[1]: dst = fe80::/64, nh = ::, mt = 1024
    IP6.ROUTE[2]: dst = 240c:c983:5:a569::/64, nh = ::, mt = 100
    IP6.ROUTE[3]: dst = ::/0, nh = fe80::266e:96ff:fe19:972, mt = 100
    IP6.ROUTE[4]: dst = 240c:c983:5:a569::e27/128, nh = ::, mt = 100
    IP6.DNS[1]: 2400:3200::1
    IP6.DNS[2]: 2001:da8:8000:1:202:120:2:100

    GENERAL.DEVICE: lo
    GENERAL.TYPE: loopback
    GENERAL.HWADDR: 00:00:00:00:00:00
    GENERAL.MTU: 65536
    GENERAL.STATE: 100 (connected (externally))
    GENERAL.CONNECTION: lo
    GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveConnection/1
    IP4.ADDRESS[1]: 127.0.0.1/8
    IP4.GATEWAY: --
    IP6.ADDRESS[1]: ::1/128
    IP6.GATEWAY: --
    root@localhost:/etc/sysconfig/network-scripts# nmcli device show | grep DNS
    IP4.DNS[1]: 10.10.0.1
    IP4.DNS[2]: 223.5.5.5
    IP6.DNS[1]: 2400:3200::1
    IP6.DNS[2]: 2001:da8:8000:1:202:120:2:100
  4. 修改 /etc/NetworkManager/system-connection/<网卡名>.nmconnection

    • method: manual
    • address: 静态IP地址 (通过 ifconfig 获得)
    • gateway: 网关(通过 route -n 获得)
    • dns: 通过 nmcli device show | grep DNS 得到的

效果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
root@localhost:/etc/NetworkManager/system-connections# cat ens18.nmconnection
[connection]
id=ens18
uuid=05676398-c786-3fd5-a807-11aa3e49aa67
type=ethernet
autoconnect-priority=-999
interface-name=ens18
timestamp=1721699946

[ethernet]

[ipv4]
method=manual
address=10.10.4.138/16;
gateway=10.10.0.1
dns=10.10.0.1;223.5.5.5;

[ipv6]
addr-gen-mode=eui64
method=auto

[proxy]

nmcli

连接 802.1x

Authenticating with a username and password
(This section was helpfully added by a contributor editing the post:)

Or if you use a username/password auth (likely via RADIUS) you can use the command below to add it (use the correct 802-1x.eap option for your network, the example of ttls as below doesn’t require a certificate to be defined) and then use –ask the first time you go to connect to save the password into the connection file.

1
2
3
4
nmcli connection add \
type wifi con-name "MySSID" ifname wlp3s0 ssid "MySSID" -- \
wifi-sec.key-mgmt wpa-eap 802-1x.eap ttls \
802-1x.phase2-auth mschapv2 802-1x.identity "USERNAME"
  • con-name "MySSID": 连接名称

  • ifname wlp3s0: 网卡名称, 可以通过 ip addr 查看, 如下:

  • ssid "MySSID": wifi 名

If using the username/password option you should add –ask after nmcli the first time you bring it up to save the password without leaving it in your command history.
It will give you an error message saying as much when you attempt to bring it up otherwise.
You will probably get prompted about additional wireless settings when using –ask, you can type no for them unless you need to specify a static IP, in which case answer yes for that option and set the correct information, and in the future you shouldn’t need to use –ask unless your password changes.

连接

1
nmcli con up --ask "MySSID"

参考资料

示例

WPA2 802.1X 需要的命令()

1
nmcli connection add type wifi con-name NAME ifname wlan0 ssid SSID -- wifo-sec.key-mgmt wpa-eap 802-1x.eap ttls 802-1x.phase2-auth mschapv2 802-1x.identity USERNAME

第一次登录的时候需要额外使用 --ask 参数输入密码

1
nmcli --ask connection up NAME