我想知道当我运行以下命令时从我自己的服务器 IP 获得许多连接是否正常:
netstat -tn 2>/dev/null | grep :80 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head
命令解释可以在这里找到:http://www.mkyong.com/linux/list-all-ip-addresses-connected-to-your-server/(在我在这里提问之前,我在谷歌搜索了一段时间后发布了找到该命令的链接,并且该博客上有很多关于该命令实际作用的解释。但不知何故,我缺乏经验,需要更多有关这个问题的信息。我恳请您的帮助和耐心)。
我懂了:
223 MY OWN SERVER IP
6 36.83.145.0
6 141.0.11.183
6 118.96.107.46
5 114.121.128.224
4 139.194.112.178
4 125.162.210.152
3 114.121.130.92
2 82.145.211.30
1 95.128.246.45
感谢您花时间查看并回复。如果您不想帮助我,请忽略这个问题,这对我来说比给出无用的评论然后做出自己的假设更有意义,因为它会导致“思维构建”,其他人可能会认为我根本不明白或没有谷歌搜索过。非常感谢您的好意!
答案1
正如 Tero Kilkanen 在评论中所述:“...这完全取决于您在服务器上运行的应用程序...“。
根据你的问题,我认为不是您可以轻松获得系统的整体情况,从而确定 223 个连接是否“正常”。
为了帮助你做出决定,你需要了解确切地这个 223(我指的是数字;你提出整个问题所依据的那个数字)说明了什么。
您所执行的(...以及在您的问题中剪切粘贴的)是一个由 8 个命令组成的链,其中第 n 个命令的输出作为第 n+1 个命令的输入,唯一的例外是第一个(没有从任何地方获取输入)和最后一个(其输出显示给您)。
让我们逐一检查这些命令:
- netstat -tn 2> /dev/null:这将获取当前在系统中注册的 TCP 连接。请注意:
- 每一个TCP 连接将被匹配,无论状态如何。这意味着输出将包含以下内容:已确立的连接(因此是真实的、活跃的连接)以及时间的等待一。换句话说:不仅会显示真实、已建立的连接。详细讨论这一点远远超出了本答案的范围。在询问详细信息之前,请至少记录下自己;
复制代码:这将解析来自先前输出的每一行,并仅过滤包含文本“:80”的行。这通常意味着仅与 HTTP 相关的连接被选中。请注意:
- 有了这样的“grep”,没有区别是针对 TCP 做出的来源或者目的地端口。这意味着过滤的行将与传入TCP/80 连接(通常由本地 Web 服务器管理)和传出TCP/80 连接(您的系统是一个 HTTP 客户端,例如在升级某些软件包/操作系统或者访问某些在线服务、RSS 提要等时);
awk'{打印$5}':根据上面过滤的行,这将选择第五列。该列包含目的地IP 地址以及目的地TCP 端口,格式为 1.2.3.4:5678。请注意,根据上述内容,目标 TCP 端口将不是必然是80;
剪切-d: -f1:这将拆分上面的对(:)并提取第一部分(IP 地址);
种类:这将获取上述命令的输出并产生按字典顺序排列的输出;
uniq-c:这将对传入的行(已排序)进行分组,并计算每组出现的次数,并将该数字(计数)添加到每组的值前面;
排序-nr:这将根据每行最开始的数字对值进行数字排序。顺序也是相反的(从最高到最低);
头:这将(在输出中)仅显示输入的前 10 行。
综上所述,应该清楚的是:“当你启动上述命令时,在你的 TCP/stacks 中有 223 个套接字,处于各种状态,包括 ESTABLISHED 状态,指的是两个都具有源端口 80 或目标端口 80 的传入和传出 TCP 连接。”
这是否正常……”...完全取决于您在服务器上运行的应用程序...“。
最后说明一下:
请注意,鉴于 AJAX/异步 HTTP 请求的当前趋势,对于单身的网页,打开并保持打开到同一目标 IP 的多个并发 TCP/连接;
单个传出(或传入)DOS 攻击可以产生大量的 IP(包括 TCP 或 UDP)套接字。
附言:您在一条评论中写道:“如果我在错误的地方问了这个问题,请告诉我,我很抱歉“。我确实认为这个地方是对的。但是,我也认为你对 TCP/IP 堆栈和一般网络及系统管理的掌握程度如此之高……我可能在浪费时间写这个答案 :-)
希望您能喜欢这一点(...并开始花更多时间学习而不是在 ServerFault 上问这类问题)
答案2
已经过去两年了,但我认为这个 cmd 可能更像这样:
netstat -polenta | awk '{print $5}' | awk -F ":" '{print $1}' | sort | uniq -c | sort -nr | head
为了更容易理解,我只添加了另一个 awk,删除了分隔符“:”后面的所有部分。这样,您就删除了使用 1 个命令的 2 个命令( cut -d: -f1 和 grep :80 变成了 awk -F “:” '{print $1}' )。
我知道,最终结果是一样的,但我认为您在终端上至少少写了一条 cmd。