动态端口
<h1>报警描述</h1>
<p>业务[XX业务],虚拟机[X.X.X.X]系统端口|动态端口使用率提醒,使用率为91.40%</p>
<h1>说明</h1>
<p>进程创建时,服务于进程网络通信的不固定端口号的端口为动态端口。
当两个进程进行TCP协议通信时,将通信的两端分别定义为服务端和客户端。服务端为了能够让客户端更方便的寻址,所以采用“静态”端口,而客户端为了更为灵活的规划端口资源,因此采用“动态”端口。
然而对于操作系统而言,动态端口资源是有限的。每当客户端向服务端发起连接请求时,客户端都会占用一个动态端口号。操作系统预留了最大65535个端口供客户端使用(依照不同类型、版本的操作系统,预留动态端口数有所不同)。当动态端口用尽时,系统将无法再以客户端的身份连接服务端。</p>
<p>动态端口使用率,是通过已经使用且尚未回收的动态端口与系统提供的总动态端口数计算比率得到的。当该比率超过报警阈值,则产生报警。</p>
<h1>监控对象</h1>
<p>Windows、Linux</p>
<h1>监控方式</h1>
<h2>Windows</h2>
<p>通过如下命令获取动态端口信息:</p>
<pre><code>sysmonitor.exe -counter netstat</code></pre>
<p>输出示例</p>
<pre><code>Established:10
TimeWait:0
CloseWait:0
Total:10
In-Ports Statistics
Port:1972,From:X.X.X.1,Qty:11
Port:1972,From:X.X.X.2,Qty:6
Port:3343,From:X.X.X.X,Qty:1
Out-Ports Statistics
To:X.X.X.X,Port:5672,Qty:2
To:X.X.X.X,Port:135,Qty:1
To:X.X.X.X,Port:49155,Qty:1
To:X.X.X.X,Port:1972,Qty:6</code></pre>
<p>原理与机制:</p>
<p>通过 iphlpapi.dll 的 GetExtendedTCPTable 函数获取相关信息。函数定义:</p>
<pre><code>IPHLPAPI_DLL_LINKAGE DWORD GetExtendedTcpTable(
[out] PVOID pTcpTable,
[in, out] PDWORD pdwSize,
[in] BOOL bOrder,
[in] ULONG ulAf,
[in] TCP_TABLE_CLASS TableClass,
[in] ULONG Reserved
);</code></pre>
<p>通过如下命令获取动态端口范围:</p>
<pre><code>for /f "skip=2 tokens=2 delims=:" %%a in ('netsh int ipv4 show dynamicportrange tcp') do @echo %%a</code></pre>
<p>输出示例:</p>
<pre><code>49152
16384</code></pre>
<p>上述两个数值的含义:
第一个是动态端口的起始端口号,这里是49152
第二个是动态端口的个数,这里是16384个(计算比例时用这个数)</p>
<h2>Linux</h2>
<p>通过如下命令获取端口信息:</p>
<pre><code>./sysmonitor.bin -counter netstat</code></pre>
<p>该信息通过/proc下各个进程信息中的网络信息中读取</p>
<p>获取动态端口范围:</p>
<pre><code>cat /proc/sys/net/ipv4/ip_local_port_range |awk '{print $1"\n"$2-$1}'</code></pre>
<p>输出示例:</p>
<pre><code>32768
28231</code></pre>
<p>上述两个数值的含义:
第一个是动态端口的起始端口号,这里是32768
第二个是动态端口的个数,这里是28231个(计算比例时用这个数)</p>
<h1>规则</h1>
<p>默认规则为:</p>
<pre><code>[0<=使用率<90] 正常
[90<=使用率<95] 提醒
[95<=] 报警</code></pre>
<p>可通过报警策略进行配置。</p>