netstat 命令为你的 Linux 服务器提供了监测和网络故障排除的重要观察手段。在 之前的文章中，我分享了一些管理你的个人 Linux 服务器的首要步骤。我简要的提到了监测网络连接的监听端口，我想通过 Linux 系统的 netstat 命令来扩展开讲讲。服务监测和端口扫描是标准的行业惯例。有很好的软件，如 Prometheus 协助这个过程自动化，SELinux 协助上下文和保护系统访问权限。然而，我相信了解你的服务器是如何连接到其他网络和设备的，是建立正常服务器基准的关键，能够帮助你识别有可能表明错误和入侵等异常情况。作为一个初学者，我已经掌握了 netstat 命令为我的服务器提供了监测和网络故障排除的重要观察手段。Netstat 和类似的一些网络监测工具被归入 net-tools 软件包 里，用来显示关于活动连接的信息。因为运行在开放的端口的服务往往容易被利用，定期进行网络监测能够帮助你及早探测到可疑的活动。安装 netstatnetstat 经常预装在 Linux 发行版上。如果 netstat 没有在你的服务器上安装，用你的包管理器安装它。下面是在基于 Debian 的系统上：$ sudo apt-get install net-tools 在基于 Fedora 的系统上：$ dnf install net-tools 使用 netstat就其本身而言，netstat 命令显示了全部建立成功的连接。你可以使用 netstat 的参数指定进一步预期的输出。举个例子，要显示所有监听和非监听的连接，使用 --all（-a 为简写）的参数。这将返回许多结果，所以在例子中我用管道符输出给 head 命令来显示输出的前 15 行：$ netstat --all | head -n 15 Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 *:27036 *:* LISTEN tcp 0 0 localhost:27060 *:* LISTEN tcp 0 0 *:16001 *:* LISTEN tcp 0 0 localhost:6463 *:* LISTEN tcp 0 0 *:ssh *:* LISTEN tcp 0 0 localhost:57343 *:* LISTEN tcp 0 0 *:ipp *:* LISTEN tcp 0 0 *:4713 *:* LISTEN tcp 0 0 10.0.1.222:48388 syd15s17-in-f5.1e:https ESTABLISHED tcp 0 0 10.0.1.222:48194 ec2-35-86-38-2.us:https ESTABLISHED tcp 0 0 10.0.1.222:56075 103-10-125-164.va:27024 ESTABLISHED tcp 0 0 10.0.1.222:46680 syd15s20-in-f10.1:https ESTABLISHED tcp 0 0 10.0.1.222:52730 syd09s23-in-f3.1e:https ESTABLISHED 要只显示 TCP 端口，使用 --all 和 --tcp 参数，或者简写成 -at ：$ netstat -at | head -n 5 Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 *:27036 *:* LISTEN tcp 0 0 localhost:27060 *:* LISTEN tcp 0 0 *:16001 *:* LISTEN 要只显示 UDP 端口，使用 --all 和 --udp 参数，或者简写成 -au ：$ netstat -au | head -n 5 Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State udp 0 0 *:27036 *:* udp 0 0 10.0.1.222:44741 224.0.0.56:46164 ESTABLISHED udp 0 0 *:bootpc netstat 命令参数常常是简单易懂的。举个例子，要显示带有全部进程 ID（PID）和数字地址的监听 TCP 和 UDP 的端口：$ sudo netstat --tcp --udp --listening --programs --numeric Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Addr State PID/Program name tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 2500/dnsmasq tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1726/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1721/cupsd tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 4023/sshd: tux@ tcp6 0 0 :::111 :::* LISTEN 1/systemd tcp6 0 0 :::22 :::* LISTEN 1726/sshd tcp6 0 0 ::1:631 :::* LISTEN 1721/cupsd tcp6 0 0 ::1:6010 :::* LISTEN 4023/sshd: tux@ udp 0 0 0.0.0.0:40514 0.0.0.0:* 1499/avahi-daemon: udp 0 0 192.168.122.1:53 0.0.0.0:* 2500/dnsmasq udp 0 0 0.0.0.0:67 0.0.0.0:* 2500/dnsmasq udp 0 0 0.0.0.0:111 0.0.0.0:* 1/systemd udp 0 0 0.0.0.0:5353 0.0.0.0:* 1499/avahi-daemon: udp6 0 0 :::111 :::* 1/systemd udp6 0 0 :::44235 :::* 1499/avahi-daemon: udp6 0 0 :::5353 :::* 1499/avahi-daemon: 这个常用组合简写版本是 -tulpn 。要显示一个指定服务的信息，使用 grep 命令过滤：$ sudo netstat -anlp | grep cups tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1721/cupsd tcp6 0 0 ::1:631 :::* LISTEN 1721/cupsd unix 2 [ ACC ] STREAM LISTENING 27251 1/systemd /var/run/cups/cups.sock unix 2 [ ] DGRAM 59530 1721/cupsd unix 3 [ ] STREAM CONNECTED 55196 1721/cupsd /var/run/cups/cups.sock 接下来的步骤一旦你运行了 netstat 命令，你就可以采取措施来保护你的系统，确保只有你主动使用的服务在你的网络上被监听。识别通常被利用的端口和服务。一般来说，关闭你实际不使用的端口。留意不常见的端口号，认识了解在你系统上使用的合法端口。密切注意 SELinux 错误。有时你需要做的只是更新上下文，以匹配你对系统做的合法更改，但是要阅读错误警告，以确保 SELinux 提醒你的不是可疑或者恶意的活动。如果你发现一个端口正在运行一个可疑的服务，或者你只是简单的想要关闭你不再使用的端口，你可以遵从以下这些步骤，通过防火墙规则手动拒绝端口访问：如果你在使用 firewall-cmd ，运行这些命令：$ sudo firewall-cmd –remove-port=<port number>/tcp $ sudo firewall-cmd –runtime-to-permanent 如果你在使用 UFW，运行以下的命令：$ sudo ufw deny <port number> 下一步，使用 systemctl 来停止这个服务：$ systemctl stop <service> 理解 netstatnetstat 是一个快速收集你的服务器网络连接信息的有用工具。定期网络监测是了解你的系统的重要组成部分，对帮助你保持你的系统安全有着重要意义。将这一步纳入你的日常管理中，你可以使用类似 netstat 或者 ss ，以及 Nmap 等开源端口扫描器或者 Wireshark 等嗅探器 ，它们都允许设定 计划任务。随着服务器存储了大量的个人数据，确保个人服务器的安全日益重要。通过了解你的服务器怎样连接到互联网，你可以降低你的机器的风险，同时你仍可以在数字时代大量的连接中获得益处。via: https://opensource.com/article/22/2/linux-network-security-netstat作者：Sahana Sreeram 选题：lujun9972 译者：hwlife 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
netstat 是一个告诉我们系统中所有 tcp/udp/unix socket 连接状态的命令行工具。它会列出所有已经连接或者等待连接状态的连接。 该工具在识别某个应用监听哪个端口时特别有用，我们也能用它来判断某个应用是否正常的在监听某个端口。netstat 命令还能显示其它各种各样的网络相关信息，例如路由表， 网卡统计信息， 虚假连接以及多播成员等。本文中，我们会通过几个例子来学习 netstat。(推荐阅读: 通过示例学习使用 CURL 命令 )1 - 检查所有的连接使用 a 选项可以列出系统中的所有连接，$ netstat -a 这会显示系统所有的 tcp、udp 以及 unix 连接。2 - 检查所有的 tcp/udp/unix socket 连接使用 t 选项只列出 tcp 连接，$ netstat -at 类似的，使用 u 选项只列出 udp 连接，$ netstat -au 使用 x 选项只列出 Unix socket 连接，$ netstat -ax 3 - 同时列出进程 ID/进程名称使用 p 选项可以在列出连接的同时也显示 PID 或者进程名称，而且它还能与其他选项连用，$ netstat -ap 4 - 列出端口号而不是服务名使用 n 选项可以加快输出，它不会执行任何反向查询（LCTT 译注：这里原文有误），而是直接输出数字。 由于无需查询，因此结果输出会快很多。$ netstat -an 5 - 只输出监听端口使用 l 选项只输出监听端口。它不能与 a 选项连用，因为 a 会输出所有端口，$ netstat -l 6 - 输出网络状态使用 s 选项输出每个协议的统计信息，包括接收/发送的包数量，$ netstat -s 7 - 输出网卡状态使用 I 选项只显示网卡的统计信息，$ netstat -i 8 - 显示 多播组 multicast group 信息使用 g 选项输出 IPV4 以及 IPV6 的多播组信息，$ netstat -g 9 - 显示网络路由信息使用 r 输出网络路由信息，$ netstat -r 10 - 持续输出使用 c 选项持续输出结果$ netstat -c 11 - 过滤出某个端口与 grep 连用来过滤出某个端口的连接，$ netstat -anp | grep 3306 12 - 统计连接个数通过与 wc 和 grep 命令连用，可以统计指定端口的连接数量$ netstat -anp | grep 3306 | wc -l 这会输出 mysql 服务端口（即 3306）的连接数。这就是我们简短的案例指南了，希望它带给你的信息量足够。 有任何疑问欢迎提出。via: http://linuxtechlab.com/learn-use-netstat-with-examples/作者：Shusain 译者：lujun9972 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
在之前的文章中，我提到过 ss，它是 iproute2 包附带的另一个工具，允许你查询 socket 的有关统计信息。可以完成 netstat 同样的任务，但是，ss 稍微快一点而且命令更简短。直接输入 ss，默认会显示与 netstat 同样的内容，并且输入类似的参数可以获取你想要的类似输出。例如：$ ss -t State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 127.0.0.1:postgresql 127.0.0.1:48154 ESTAB 0 0 192.168.0.136:35296 192.168.0.120:8009 ESTAB 0 0 192.168.0.136:47574 173.194.74.189:https […]ss -t 只显示 TCP 连接。ss -u 用于显示 UDP 连接，-l 参数只会显示监听的端口，而且可以进一步过滤到任何想要的信息。我并没有测试所有可用参数，但是你甚至可以使用 -K 强制关闭 socket。ss 真正耀眼的地方是其内置的过滤能力。让我们列出所有端口为 22（ssh）的连接：$ ss state all sport = :ssh Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp LISTEN 0 128 *:ssh *:* tcp ESTAB 0 0 192.168.0.136:ssh 192.168.0.102:46540 tcp LISTEN 0 128 :::ssh :::*如果只想看已建立的 socket（排除了 listening 和 closed ）：$ ss state connected sport = :ssh Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp ESTAB 0 0 192.168.0.136:ssh 192.168.0.102:46540类似的，可以列出指定的 host 或者 ip 段。例如，列出到达 74.125.0.0/16 子网的连接，这个子网属于 Google：$ ss state all dst 74.125.0.0/16 Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp ESTAB 0 0 192.168.0.136:33616 74.125.142.189:https tcp ESTAB 0 0 192.168.0.136:42034 74.125.70.189:https tcp ESTAB 0 0 192.168.0.136:57408 74.125.202.189:httpsss与 iptables 的语法非常相同，如果已经熟悉了其语法，ss 非常容易上手。也可以安装 iproute2-doc 包， 通过 /usr/share/doc/iproute2-doc/ss.html 获得完整文档。还不快试试! 你就可以知道它有多棒。无论如何，让我输入的字符越少我越高兴。via: https://insights.ubuntu.com/2017/07/25/ss-another-way-to-get-socket-statistics/作者：Mathieu Trudel-Lapierre 译者：VicYu 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
在 Linux 或者类 Unix 中，我该如何检查某个端口是否被占用？我又该如何验证 Linux 服务器中有哪些端口处于监听状态？验证哪些端口在服务器的网络接口上处于监听状态是非常重要的。你需要注意那些开放端口来检测网络入侵。除了网络入侵，为了排除故障，确认服务器上的某个端口是否被其他应用程序占用也是必要的。比方说，你可能会在同一个系统中安装了 Apache 和 Nginx 服务器，所以了解是 Apache 还是 Nginx 占用了 # 80/443 TCP 端口真的很重要。这篇快速教程会介绍使用 netstat 、 nmap 和 lsof 命令来检查端口使用信息并找出哪些程序正在使用这些端口。如何检查 Linux 中的程序和监听的端口1、 打开一个终端，如 shell 命令窗口。 2、 运行以下任意一行命令：sudo lsof -i -P -n | grep LISTEN sudo netstat -tulpn | grep LISTEN sudo nmap -sTU -O IP地址 下面我们看看这些命令和它们的详细输出内容：方式 1：lsof 命令语法如下：$ sudo lsof -i -P -n $ sudo lsof -i -P -n | grep LISTEN $ doas lsof -i -P -n | grep LISTEN ### OpenBSD 输出如下：图 1：使用 lsof 命令检查监听端口和程序仔细看上面输出的最后一行：sshd 85379 root 3u IPv4 0xffff80000039e000 0t0 TCP 10.86.128.138:22 (LISTEN) sshd 是程序的名称10.86.128.138 是 sshd 程序绑定 (LISTEN) 的 IP 地址22 是被使用 (LISTEN) 的 TCP 端口85379 是 sshd 任务的进程 ID (PID)方式 2：netstat 命令你可以如下面所示使用 netstat 来检查监听的端口和程序。Linux 中 netstat 语法$ netstat -tulpn | grep LISTEN FreeBSD/MacOS X 中 netstat 语法$ netstat -anp tcp | grep LISTEN $ netstat -anp udp | grep LISTEN OpenBSD 中 netstat 语法$ netstat -na -f inet | grep LISTEN $ netstat -nat | grep LISTEN 方式 3：nmap 命令语法如下：$ sudo nmap -sT -O localhost $ sudo nmap -sU -O 192.168.2.13 ### 列出打开的 UDP 端口 $ sudo nmap -sT -O 192.168.2.13 ### 列出打开的 TCP 端口 示例输出如下：图 2：使用 nmap 探测哪些端口监听 TCP 连接你可以用一句命令合并 TCP/UDP 扫描：$ sudo nmap -sTU -O 192.168.2.13 赠品：对于 Windows 用户在 windows 系统下可以使用下面的命令检查端口使用情况：netstat -bano | more netstat -bano | grep LISTENING netstat -bano | findstr /R /C:"[LISTING]" via: https://www.cyberciti.biz/faq/unix-linux-check-if-port-is-in-use-command/作者：VIVEK GITE 译者：GHLandy 校对：oska874本文由 LCTT 原创编译，Linux中国 荣誉推出
在Linux中的使用 ss 命令检查套接字/网络连接
ss是iproute2包的一部分（控制TCP/IP网络和流量的工具）。iproute2的目标是替代先前用于配置网络接口、路由表和管理ARP表的标准Unix网络工具套装（通常称之为“net-tools”）。ss工具用于导出套接字统计，它可以显示与netstat类似的信息，且可以显示更多的TCP和状态信息。因为它直接从内核空间获取信息，所以会更快。ss的操作和netstat很像，所以这让它可以很容易就可以取代netstat。使用和常见选项ss和netstat很像，默认它会显示已经建立连接的开放的非监听TCP套接字列表。并且你可以用下面的选项过滤输出：-n - 不要尝试解析服务名。-r - 尝试解析数字的地址/端口。-a - 显示所有套接字。-l - 显示监听套接字。-p - 显示使用该套接字的进程。-s - 打印统计数据-t - 只显示TCP套接字。-u - 只显示UDP套接字。-d - 只显示DCCP套接字-w - 只显示RAW套接字。-x - 只显示Unix域套接字-f FAMILY - 显示FAMILY套接字的类型。目前支持下面这些族：unix、inet、inet6、link、netlink。-A QUERY - 指定要列出的套接字列表，通过逗号分隔。可以识别下面的标识符：all、inet、tcp、udp、raw、unix、packet、netlink、unixdgram、unixstream、packetraw、packetdgram。-o STATUS - 列出指定状态的套接字ss 命令示例1. 显示所有的的TCP端口和使用它们的进程：# ss -tnap 2. 你可以使用-4 标志来显示IPv4链接，-6标志来显示IPv6链接，比如：# ss -tnap6 3. 跟上面的行为一样，你只需用u代替t就会显示所有开放的UDP端口。# ss -unap 4. 你可以使用-s标志来打印各种有用的统计数据：# ss -s 5. 你可以使用-o标志来检查所有不同状态下的链接，比如显示所有已经建立的连接。# ss -tn -o state established -p via: http://linoxide.com/linux-command/ss-sockets-network-connection/作者：Adrian Dinu 译者：geekpi 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
如今很多系统管理员依然通过组合使用诸如ifconfig、route、arp和netstat等命令行工具（统称为net-tools）来配置网络功能，解决网络故障。net-tools起源于BSD的TCP/IP工具箱，后来成为老版本Linux内核中配置网络功能的工具。但自2001年起，Linux社区已经对其停止维护。同时，一些Linux发行版比如Arch Linux和CentOS/RHEL 7则已经完全抛弃了net-tools，只支持iproute2。作为网络配置工具的一份子，iproute2的出现旨在从功能上取代net-tools。net-tools通过procfs(/proc)和ioctl系统调用去访问和改变内核网络配置，而iproute2则通过netlink套接字接口与内核通讯。抛开性能而言，iproute2的用户接口比net-tools显得更加直观。比如，各种网络资源（如link、IP地址、路由和隧道等）均使用合适的对象抽象去定义，使得用户可使用一致的语法去管理不同的对象。更重要的是，到目前为止，iproute2仍处在持续开发中。如果你仍在使用net-tools，而且尤其需要跟上新版Linux内核中的最新最重要的网络特性的话，那么是时候转到iproute2的阵营了。原因就在于使用iproute2可以做很多net-tools无法做到的事情。对于那些想要转到使用iproute2的用户，有必要了解下面有关net-tools和iproute2的众多对比。显示所有已连接的网络接口下面的命令显示出所有可用网络接口的列表（无论接口是否激活）。使用net-tools：$ ifconfig -a 使用iproute2：$ ip link show 激活或停用网络接口使用这些命令来激活或停用某个指定的网络接口。使用net-tools：$ sudo ifconfig eth1 up $ sudo ifconfig eth1 down 使用iproute2：$ sudo ip link set down eth1 $ sudo ip link set up eth1 为网络接口分配IPv4地址使用这些命令配置网络接口的IPv4地址。使用net-tools：$ sudo ifconfig eth1 10.0.0.1/24 使用iproute2：$ sudo ip addr add 10.0.0.1/24 dev eth1 值得注意的是，可以使用iproute2给同一个接口分配多个IP地址，ifconfig则无法这么做。使用ifconfig的变通方案是使用IP别名。$ sudo ip addr add 10.0.0.1/24 broadcast 10.0.0.255 dev eth1 $ sudo ip addr add 10.0.0.2/24 broadcast 10.0.0.255 dev eth1 $ sudo ip addr add 10.0.0.3/24 broadcast 10.0.0.255 dev eth1 移除网络接口的IPv4地址就IP地址的移除而言，除了给接口分配全0地址外，net-tools没有提供任何合适的方法来移除网络接口的IPv4地址。相反，iproute2则能很好地完全。使用net-tools：$ sudo ifconfig eth1 0 使用iproute2：$ sudo ip addr del 10.0.0.1/24 dev eth1 显示网络接口的IPv4地址按照如下操作可查看某个指定网络接口的IPv4地址。使用net-tools：$ ifconfig eth1 使用iproute2：$ ip addr show dev eth1 同样，如果接口分配了多个IP地址，iproute2会显示出所有地址，而net-tools只能显示一个IP地址。为网络接口分配IPv6地址使用这些命令为网络接口添加IPv6地址。net-tools和iproute2都允许用户为一个接口添加多个IPv6地址。使用net-tools：$ sudo ifconfig eth1 inet6 add 2002:0db5:0:f102::1/64 $ sudo ifconfig eth1 inet6 add 2003:0db5:0:f102::1/64 使用iproute2：$ sudo ip -6 addr add 2002:0db5:0:f102::1/64 dev eth1 $ sudo ip -6 addr add 2003:0db5:0:f102::1/64 dev eth1 显示网络接口的IPv6地址按照如下操作可显示某个指定网络接口的IPv6地址。net-tools和iproute2都可以显示出所有已分配的IPv6地址。使用net-tools：$ ifconfig eth1 使用iproute2：$ ip -6 addr show dev eth1 移除网络设备的IPv6地址使用这些命令可移除接口中不必要的IPv6地址。使用net-tools：$ sudo ifconfig eth1 inet6 del 2002:0db5:0:f102::1/64 使用iproute2：$ sudo ip -6 addr del 2002:0db5:0:f102::1/64 dev eth1 改变网络接口的MAC地址使用下面的命令可篡改网络接口的MAC地址，请注意在更改MAC地址前，需要停用接口。使用net-tools：$ sudo ifconfig eth1 hw ether 08:00:27:75:2a:66 使用iproute2：$ sudo ip link set dev eth1 address 08:00:27:75:2a:67 查看IP路由表net-tools中有两个选择来显示内核的IP路由表：route和netstat。在iproute2中，使用命令ip route。使用net-tools：$ route -n $ netstat -rn 使用iproute2：$ ip route show 添加和修改默认路由这里的命令用来添加或修改内核IP路由表中的默认路由规则。请注意在net-tools中可通过添加新的默认路由、删除旧的默认路由来实现修改默认路由。在iproute2使用ip route命令来代替。使用net-tools：$ sudo route add default gw 192.168.1.2 eth0 $ sudo route del default gw 192.168.1.1 eth0 使用iproute2:$ sudo ip route add default via 192.168.1.2 dev eth0 $ sudo ip route replace default via 192.168.1.2 dev eth0 添加和移除静态路由使用下面命令添加或移除一个静态路由。使用net-tools：$ sudo route add -net 172.16.32.0/24 gw 192.168.1.1 dev eth0 $ sudo route del -net 172.16.32.0/24 使用iproute2：$ sudo ip route add 172.16.32.0/24 via 192.168.1.1 dev eth0 $ sudo ip route del 172.16.32.0/24 查看套接字统计信息这里的命令用来查看套接字统计信息（比如活跃或监听状态的TCP/UDP套接字）。使用net-tools：$ netstat $ netstat -l 使用iproute2：$ ss $ ss -l 查看ARP表使用这些命令显示内核的ARP表。使用net-tools:$ arp -an 使用iproute2:$ ip neigh 添加或删除静态ARP项按照如下操作在本地ARP表中添加或删除一个静态ARP项。使用net-tools：$ sudo arp -s 192.168.1.100 00:0c:29:c0:5a:ef $ sudo arp -d 192.168.1.100 使用iproute2：$ sudo ip neigh add 192.168.1.100 lladdr 00:0c:29:c0:5a:ef dev eth0 $ sudo ip neigh del 192.168.1.100 dev eth0 添加、删除或查看多播地址使用下面的命令配置或查看网络接口上的多播地址。使用net-tools:$ sudo ipmaddr add 33:44:00:00:00:01 dev eth0 $ sudo ipmaddr del 33:44:00:00:00:01 dev eth0 $ ipmaddr show dev eth0 $ netstat -g 使用iproute2：$ sudo ip maddr add 33:44:00:00:00:01 dev eth0 $ sudo ip maddr del 33:44:00:00:00:01 dev eth0 $ ip maddr list dev eth0 via: http://xmodulo.com/2014/09/linux-tcpip-networking-net-tools-iproute2.html作者：Dan Nanni 译者：KayGuoWhu 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
大家好，我是邪恶君子！今天，邪恶就给大家分享一下，使用小小的一个netstat命令，就能让你检测出系统是否处于安全状态！！！这篇文档，复杂°：简单；难易°：易。坚决让小白都看得懂，学得会，掌握牢，上手快！好，废话不多说，看招：大家都知道，Linux上的web服务每天都要面临成千上万的连接，这些连接都是要遵循TCP协议的，这都是众所周知的（至于TCP协议，这里就不在过多的介绍，不懂的同学可以自己搜索，友好多）。既然都是TCP协议连接，那就不得不面临一个网路最大的安全问题，DOS攻击及DDOS攻击，这些攻击是没有办法抹除的，因为这是针对TCP协议本身的一个设计缺陷儿造成的。所以，这就要求运维人员，时刻监测系统安全，是否处于被DOS攻击状态。那么是怎么监测及检测的呢？这就要用到我一开始就要提到的netstat命令。先简单的介绍一下netstat命令的主要作用：可以查看系统当前的连接状态，不管是TCP连接还是udp协议连接，以及每个连接的进程号、是哪个应用程序、连接所用的端口号，这些都可以陈列出来。是不是很强大。在讲监测检测之前，先给大家在普及一个知识，那就是TCP连接的状态，TCP进行3次握手，其过程有很多状态，不同的连接状态，都有想对应的状态码，看下面列表：LISTEN：侦听来自远方的TCP端口的连接请求SYN-SENT：再发送连接请求后等待匹配的连接请求SYN-RECEIVED：再收到和发送一个连接请求后等待对方对连接请求的确认ESTABLISHED：代表一个打开的连接FIN-WAIT-1：等待远程TCP连接中断请求，或先前的连接中断请求的确认FIN-WAIT-2：从远程TCP等待连接中断请求CLOSE-WAIT：等待从本地用户发来的连接中断请求CLOSING：等待远程TCP对连接中断的确认LAST-ACK：等待原来的发向远程TCP的连接中断请求的确认TIME-WAIT：等待足够的时间以确保远程TCP接收到连接中断请求的确认CLOSED：没有任何连接状态大家最好一定要记住这些状态，因为运维人员在监控系统并发连接状态时，监控系统返回的也是这些状态码！了解完这些后，还要再了解一个Linux系统的脚本中的一个小知识点，那就是“|”管道符，管道符的作用就不多说了，这里就简单提一下，因为下面的例子要用到。好了，终于可以进入正题了，是不是都有点心急了呢 ？嘿嘿以下这条命令将会显示出netstat的帮助信息，不懂的以及不太了解这个命令有哪些参数可用的都可以在这个命令的返回信息中看到：#netstat --help显示当前所有活动的网络连接：#netstat -na显示出所有处于监听状态的应用程序及进程号和端口号：#netstat -aultnp如果想对一个单一的进行查询，只需要在命令后面再加上“| grep $”。这里就用到了管道符，以及grep筛选命令，$代表参数，也就是你要查询的那个。如要显示所有80端口的网络连接：#netstat -aultnp | grep 80如果还想对返回的连接列表进行排序，这就要用到sort命令了，命令如下：#netstat -aultnp | grep :80 | sort当然，如果还想进行统计的话，就可以再往后面加wc命令。如：#netstat -aultnp | grep :80 | wc -l其实，要想监测出系统连接是否安全，要进行多状态的查询，以及要分析，总结，还有就是经验。总的下来，才可以判断出连接是否处于安全状态。下面就给大家再举一些例子，让大家彻底的明白，及彻底的理解这个命令的用处，使其发挥出最大功能。#netstat -n -p|grep SYN_REC | wc -l这个命令可以查找出当前服务器有多少个活动的 SYNC\_REC 连接。正常来说这个值很小，最好小于5。 当有Dos攻击或者邮件炸弹的时候，这个值相当的高。尽管如此，这个值和系统有很大关系，有的服务器值就很高，也是正常现象。#netstat -n -p | grep SYN_REC | sort -u列出所有连接过的IP地址。#netstat -n -p | grep SYN_REC | awk '{print $5}' | awk -F: '{print $1}'列出所有发送SYN\_REC连接节点的IP地址。#netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n使用netstat命令计算每个主机连接到本机的连接数。#netstat -anp |grep 'tcp|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n列出所有连接到本机的UDP或者TCP连接的IP数量。#netstat -ntu | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr检查 ESTABLISHED 连接并且列出每个IP地址的连接数量。#netstat -plan|grep :80|awk {'print $5'}|cut -d: -f 1|sort|uniq -c|sort -nk 1列出所有连接到本机80端口的IP地址和其连接数。80端口一般是用来处理HTTP网页请求。怎么样，是否能弄懂上面的这些命令及作用？在这儿呢，邪恶负责的说一句话：如果你能把上面的这些都彻底的理解消化了，能举一反三了，那么，恭喜您，您在Linux系统网络检测这一小块已经是一个高手了，不在是菜鸟或者小白了，为自己鼓鼓掌吧！！！说明一点：命令及参数是死的，但是人是活的，要想发挥出其最大的功能，还需要自己去摸索，自己去理解及配合其他命令一起使用。同时，netstat -an在Windows上也管用哦！那么，如果真的发现有大量的假连接了，那么也不要慌，要先找出一些“另类的IP地址”，怎么解释呢，因为在进行Dos攻击时，会为造出大量的假IP去连接服务器，进行3次握手，所以，这就要根据经验去找出假IP，然后通过防火墙规则，添加一个规则拒接这个假IP的网段连接。例如：#iptables -A INPUT 1 -s $IPADRESS -j DROP/REJECT注意，你需将$IPADRESS 替换成需要拒绝连接的IP地址。执行完iptables 后呢，要重启一下web服务。好了，今天的学习呢，到这儿就结束了，至于能掌握多少，这就要因人而异了，但我相信：天道酬勤！！！最后，如果哪里有不对的地方，希望大家多多交流！！！
Netstat 简介Netstat 是一款命令行工具，可用于列出系统上所有的网络套接字连接情况，包括 tcp, udp 以及 unix 套接字，另外它还能列出处于监听状态（即等待接入请求）的套接字。如果你想确认系统上的 Web 服务有没有起来，你可以查看80端口有没有打开。以上功能使 netstat 成为网管和系统管理员的必备利器。在这篇教程中，我会列出几个例子，教大家如何使用 netstat 去查找网络连接信息和系统开启的端口号。以下的简单介绍来自 netstat 的 man 手册：netstat - 打印网络连接、路由表、连接的数据统计、伪装连接以及广播域成员。1. 列出所有连接第一个要介绍的，是最简单的命令：列出所有当前的连接。使用 -a 选项即可。$ netstat -a Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 enlightened:domain *:* LISTEN tcp 0 0 localhost:ipp *:* LISTEN tcp 0 0 enlightened.local:54750 li240-5.members.li:http ESTABLISHED tcp 0 0 enlightened.local:49980 del01s07-in-f14.1:https ESTABLISHED tcp6 0 0 ip6-localhost:ipp [::]:* LISTEN udp 0 0 enlightened:domain *:* udp 0 0 *:bootpc *:* udp 0 0 enlightened.local:ntp *:* udp 0 0 localhost:ntp *:* udp 0 0 *:ntp *:* udp 0 0 *:58570 *:* udp 0 0 *:mdns *:* udp 0 0 *:49459 *:* udp6 0 0 fe80::216:36ff:fef8:ntp [::]:* udp6 0 0 ip6-localhost:ntp [::]:* udp6 0 0 [::]:ntp [::]:* udp6 0 0 [::]:mdns [::]:* udp6 0 0 [::]:63811 [::]:* udp6 0 0 [::]:54952 [::]:* Active UNIX domain sockets (servers and established) Proto RefCnt Flags Type State I-Node Path unix 2 [ ACC ] STREAM LISTENING 12403 @/tmp/dbus-IDgfj3UGXX unix 2 [ ACC ] STREAM LISTENING 40202 @/dbus-vfs-daemon/socket-6nUC6CCx 上述命令列出 tcp, udp 和 unix 协议下所有套接字的所有连接。然而这些信息还不够详细，管理员往往需要查看某个协议或端口的具体连接情况。2. 只列出 TCP 或 UDP 协议的连接使用 -t 选项列出 TCP 协议的连接：$ netstat -at Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 enlightened:domain *:* LISTEN tcp 0 0 localhost:ipp *:* LISTEN tcp 0 0 enlightened.local:36310 del01s07-in-f24.1:https ESTABLISHED tcp 0 0 enlightened.local:45038 a96-17-181-10.depl:http ESTABLISHED tcp 0 0 enlightened.local:37892 ABTS-North-Static-:http ESTABLISHED ..... 使用 -u 选项列出 UDP 协议的连接：$ netstat -au Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State udp 0 0 *:34660 *:* udp 0 0 enlightened:domain *:* udp 0 0 *:bootpc *:* udp 0 0 enlightened.local:ntp *:* udp 0 0 localhost:ntp *:* udp 0 0 *:ntp *:* udp6 0 0 fe80::216:36ff:fef8:ntp [::]:* udp6 0 0 ip6-localhost:ntp [::]:* udp6 0 0 [::]:ntp [::]:* 上面同时显示了 IPv4 和 IPv6 的连接。3. 禁用反向域名解析，加快查询速度默认情况下 netstat 会通过反向域名解析技术查找每个 IP 地址对应的主机名。这会降低查找速度。如果你觉得 IP 地址已经足够，而没有必要知道主机名，就使用 -n 选项禁用域名解析功能。$ netstat -ant Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 127.0.1.1:53 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN tcp 0 0 192.168.1.2:49058 173.255.230.5:80 ESTABLISHED tcp 0 0 192.168.1.2:33324 173.194.36.117:443 ESTABLISHED tcp6 0 0 ::1:631 :::* LISTEN 上述命令列出所有 TCP 协议的连接，没有使用域名解析技术。So easy ? 非常好。4. 只列出监听中的连接任何网络服务的后台进程都会打开一个端口，用于监听接入的请求。这些正在监听的套接字也和连接的套接字一样，也能被 netstat 列出来。使用 -l 选项列出正在监听的套接字。$ netstat -tnl Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 127.0.1.1:53 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN tcp6 0 0 ::1:631 :::* LISTEN 现在我们可以看到处于监听状态的 TCP 端口和连接。如果你查看所有监听端口，去掉 -t 选项。如果你只想查看 UDP 端口，使用 -u 选项，代替 -t 选项。注意：不要使用 -a 选项，否则 netstat 会列出所有连接，而不仅仅是监听端口。5. 获取进程名、进程号以及用户 ID查看端口和连接的信息时，能查看到它们对应的进程名和进程号对系统管理员来说是非常有帮助的。举个栗子，Apache 的 httpd 服务开启80端口，如果你要查看 http 服务是否已经启动，或者 http 服务是由 apache 还是 nginx 启动的，这时候你可以看看进程名。使用 -p 选项查看进程信息。~$ sudo netstat -nlpt Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.1.1:53 0.0.0.0:* LISTEN 1144/dnsmasq tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 661/cupsd tcp6 0 0 ::1:631 :::* LISTEN 661/cupsd 使用 -p 选项时，netstat 必须运行在 root 权限之下，不然它就不能得到运行在 root 权限下的进程名，而很多服务包括 http 和 ftp 都运行在 root 权限之下。相比进程名和进程号而言，查看进程的拥有者会更有用。使用 -ep 选项可以同时查看进程名和用户名。$ sudo netstat -ltpe Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name tcp 0 0 enlightened:domain *:* LISTEN root 11090 1144/dnsmasq tcp 0 0 localhost:ipp *:* LISTEN root 9755 661/cupsd tcp6 0 0 ip6-localhost:ipp [::]:* LISTEN root 9754 661/cupsd 上面列出 TCP 协议下的监听套接字，同时显示进程信息和一些额外信息。这些额外的信息包括用户名和进程的索引节点号。这个命令对网管来说很有用。注意 - 假如你将 -n 和 -e 选项一起使用，User 列的属性就是用户的 ID 号，而不是用户名。6. 打印统计数据netstat 可以打印出网络统计数据，包括某个协议下的收发包数量。下面列出所有网络包的统计情况：$ netstat -s Ip: 32797 total packets received 0 forwarded 0 incoming packets discarded 32795 incoming packets delivered 29115 requests sent out 60 outgoing packets dropped Icmp: 125 ICMP messages received 0 input ICMP message failed. ICMP input histogram: destination unreachable: 125 125 ICMP messages sent 0 ICMP messages failed ICMP output histogram: destination unreachable: 125 ... OUTPUT TRUNCATED ... 如果想只打印出 TCP 或 UDP 协议的统计数据，只要加上对应的选项（-t 和 -u）即可，so easy。7. 显示内核路由信息使用 -r 选项打印内核路由信息。打印出来的信息与 route 命令输出的信息一样。我们也可以使用 -n 选项禁止域名解析。$ netstat -rn 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 eth0 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 8. 打印网络接口netstat 也能打印网络接口信息，-i 选项就是为这个功能而生。$ netstat -i Kernel Interface table Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg eth0 1500 0 31611 0 0 0 27503 0 0 0 BMRU lo 65536 0 2913 0 0 0 2913 0 0 0 LRU 上面输出的信息比较原始。我们将 -e 选项和 -i 选项搭配使用，可以输出用户友好的信息。$ netstat -ie Kernel Interface table eth0 Link encap:Ethernet HWaddr 00:16:36:f8:b2:64 inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::216:36ff:fef8:b264/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:31682 errors:0 dropped:0 overruns:0 frame:0 TX packets:27573 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:29637117 (29.6 MB) TX bytes:4590583 (4.5 MB) Interrupt:18 Memory:da000000-da020000 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:2921 errors:0 dropped:0 overruns:0 frame:0 TX packets:2921 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:305297 (305.2 KB) TX bytes:305297 (305.2 KB) 上面的输出信息与 ifconfig 输出的信息一样。9. netstat 持续输出我们可以使用 netstat 的 -c 选项持续输出信息。$ netstat -ct 这个命令可持续输出 TCP 协议信息。10. 显示多播组信息选项 -g 会输出 IPv4 和 IPv6 的多播组信息。$ netstat -g IPv6/IPv4 Group Memberships Interface RefCnt Group --------------- ------ --------------------- lo 1 all-systems.mcast.net eth0 1 224.0.0.251 eth0 1 all-systems.mcast.net lo 1 ip6-allnodes lo 1 ff01::1 eth0 1 ff02::fb eth0 1 ff02::1:fff8:b264 eth0 1 ip6-allnodes eth0 1 ff01::1 wlan0 1 ip6-allnodes wlan0 1 ff01::1 更多用法目前为止我们列出了 netstat 的基本用法，现在让我们一起来 geek 吧～打印 active 状态的连接active 状态的套接字连接用 "ESTABLISHED" 字段表示，所以我们可以使用 grep 命令获得 active 状态的连接：$ netstat -atnp | grep ESTA (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) tcp 0 0 192.168.1.2:49156 173.255.230.5:80 ESTABLISHED 1691/chrome tcp 0 0 192.168.1.2:33324 173.194.36.117:443 ESTABLISHED 1691/chrome 配合 watch 命令监视 active 状态的连接：$ watch -d -n0 "netstat -atnp | grep ESTA" 查看服务是否在运行如果你想看看 http,smtp 或 ntp 服务是否在运行，使用 grep。$ sudo netstat -aple | grep ntp udp 0 0 enlightened.local:ntp *:* root 17430 1789/ntpd udp 0 0 localhost:ntp *:* root 17429 1789/ntpd udp 0 0 *:ntp *:* root 17422 1789/ntpd udp6 0 0 fe80::216:36ff:fef8:ntp [::]:* root 17432 1789/ntpd udp6 0 0 ip6-localhost:ntp [::]:* root 17431 1789/ntpd udp6 0 0 [::]:ntp [::]:* root 17423 1789/ntpd unix 2 [ ] DGRAM 17418 1789/ntpd 从这里可以看到 ntp 服务正在运行。使用 grep 命令你可以查看 http 或 smtp 或其它任何你想查看的服务。好了，netstat 的大部分功能都介绍过了，如果你想知道 netstat 更高级的功能，阅读它的手册吧（man netstat）。欢迎在下面留下你的反馈和建议。via: http://www.binarytides.com/linux-netstat-command-examples/译者：bazz2 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出