netstat 命令详解#
netstat(network statistics)是 Linux 系统中用于显示网络连接、路由表、网络接口统计等网络信息的命令,是网络诊断和监控的重要工具。虽然在新版本 Linux 中已被 ss 命令取代,但仍然被广泛使用。
入门#
基本用法#
# 显示所有网络连接
netstat -a
# 显示所有 TCP 连接
netstat -at
# 显示所有 UDP 连接
netstat -au
# 显示监听中的套接字
netstat -l
# 显示网络接口统计
netstat -i
# 显示路由表
netstat -r常用选项#
| 选项 | 说明 |
|---|---|
-a | 显示所有连接(包括监听和非监听) |
-t | 显示 TCP 连接 |
-u | 显示 UDP 连接 |
-n | 以数字形式显示地址和端口 |
-l | 显示监听中的套接字 |
-p | 显示进程 ID 和进程名称 |
-r | 显示路由表 |
-i | 显示网络接口统计 |
-s | 显示网络统计信息 |
-c | 持续显示网络状态 |
基本示例#
# 查看所有 TCP 连接
netstat -at
# 输出示例:
# Proto Recv-Q Send-Q Local Address Foreign Address State
# tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
# tcp 0 0 192.168.1.100:54321 93.184.216.34:80 ESTABLISHED
# tcp6 0 0 :::22 :::* LISTEN
# 查看监听端口
netstat -ltn
# 输出示例:
# Proto Recv-Q Send-Q Local Address Foreign Address State
# tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
# tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN中级#
网络连接分析#
# 显示所有 TCP 连接并显示进程信息
netstat -atp
# 显示所有 UDP 连接并显示进程信息
netstat -aup
# 显示所有网络连接(包括进程)
netstat -anp
# 查看特定端口的连接
netstat -anp | grep :80
# 查看特定进程的网络连接
netstat -anp | grep nginx
# 查看特定状态的连接
netstat -anp | grep ESTABLISHED网络统计信息#
# 显示网络统计信息
netstat -s
# 显示 TCP 统计信息
netstat -s | grep -A 20 "Tcp:"
# 显示 UDP 统计信息
netstat -s | grep -A 10 "Udp:"
# 显示 IP 统计信息
netstat -s | grep -A 10 "Ip:"
# 显示 ICMP 统计信息
netstat -s | grep -A 10 "Icmp:"路由表查看#
# 显示路由表
netstat -r
# 显示路由表(不解析主机名)
netstat -rn
# 显示 IPv6 路由表
netstat -r -A inet6
# 输出示例:
# 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高级#
高级过滤#
# 查看所有 ESTABLISHED 状态的连接
netstat -an | grep ESTABLISHED | wc -l
# 查看所有 LISTEN 状态的连接
netstat -an | grep LISTEN
# 查看所有 TIME_WAIT 状态的连接
netstat -an | grep TIME_WAIT
# 查看特定端口的连接数
netstat -an | grep :80 | wc -l
# 查看连接最多的 IP 地址
netstat -an | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10网络接口统计#
# 显示网络接口统计
netstat -i
# 持续监控网络接口统计
netstat -ic
# 显示特定接口的统计
netstat -i | grep eth0
# 输出示例:
# Kernel Interface table
# Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
# eth0 1500 12345 0 0 0 6789 0 0 0 BMRU网络连接监控#
#!/bin/bash
# 网络连接监控脚本
LOG_FILE="connection_monitor.log"
while true; do
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
TOTAL_CONNECTIONS=$(netstat -an | grep ESTABLISHED | wc -l)
LISTENING_PORTS=$(netstat -an | grep LISTEN | wc -l)
echo "$TIMESTAMP - Total: $TOTAL_CONNECTIONS, Listening: $LISTENING_PORTS" >> $LOG_FILE
sleep 60
done大师#
网络连接分析#
#!/bin/bash
# 网络连接分析工具
echo "Network Connection Analysis"
echo "==========================="
# 按状态统计连接
echo -e "\nConnections by State:"
netstat -an | awk '/tcp/ {print $6}' | sort | uniq -c | sort -rn
# 按端口统计连接
echo -e "\nConnections by Port:"
netstat -an | grep ESTABLISHED | awk '{print $4}' | cut -d: -f2 | sort | uniq -c | sort -rn | head -10
# 按远程 IP 统计连接
echo -e "\nTop 10 Remote IPs:"
netstat -an | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10
# 按本地 IP 统计连接
echo -e "\nConnections by Local IP:"
netstat -an | grep ESTABLISHED | awk '{print $4}' | cut -d: -f1 | sort | uniq -c | sort -rn网络性能监控#
#!/bin/bash
# 网络性能监控工具
INTERFACE="eth0"
# 获取网络接口统计
get_interface_stats() {
netstat -i | grep $INTERFACE | awk '{print $3, $4, $7, $8}'
}
# 初始统计
STATS_1=$(get_interface_stats)
RX_OK_1=$(echo $STATS_1 | awk '{print $1}')
RX_ERR_1=$(echo $STATS_1 | awk '{print $2}')
TX_OK_1=$(echo $STATS_1 | awk '{print $3}')
TX_ERR_1=$(echo $STATS_1 | awk '{print $4}')
sleep 60
# 结束统计
STATS_2=$(get_interface_stats)
RX_OK_2=$(echo $STATS_2 | awk '{print $1}')
RX_ERR_2=$(echo $STATS_2 | awk '{print $2}')
TX_OK_2=$(echo $STATS_2 | awk '{print $3}')
TX_ERR_2=$(echo $STATS_2 | awk '{print $4}')
# 计算差值
RX_OK_DIFF=$((RX_OK_2 - RX_OK_1))
RX_ERR_DIFF=$((RX_ERR_2 - RX_ERR_1))
TX_OK_DIFF=$((TX_OK_2 - TX_OK_1))
TX_ERR_DIFF=$((TX_ERR_2 - TX_ERR_1))
echo "Network Performance for $INTERFACE"
echo "=================================="
echo "RX Packets: $RX_OK_DIFF/min, Errors: $RX_ERR_DIFF"
echo "TX Packets: $TX_OK_DIFF/min, Errors: $TX_ERR_DIFF"网络安全监控#
#!/bin/bash
# 网络安全监控脚本
ALERT_FILE="security_alerts.log"
MAX_CONNECTIONS=100
# 检查异常连接
check_suspicious_connections() {
echo "Checking for suspicious connections..."
# 检查连接数过多的 IP
netstat -an | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | while read count ip; do
if [ $count -gt $MAX_CONNECTIONS ]; then
ALERT_MSG="$(date '+%Y-%m-%d %H:%M:%S') - ALERT: High connection count from $ip: $count connections"
echo $ALERT_MSG >> $ALERT_FILE
echo $ALERT_MSG
fi
done
# 检查异常端口
echo "Checking for unusual ports..."
netstat -an | grep ESTABLISHED | awk '{print $4}' | cut -d: -f2 | sort -u | while read port; do
if [ $port -gt 1024 ] && [ $port -lt 49152 ]; then
echo "Unusual port in use: $port"
fi
done
}
# 检查网络接口状态
check_interface_status() {
echo "Checking interface status..."
netstat -i | grep -v "Iface" | while read iface mtu rx_ok rx_err rx_drp rx_ovr tx_ok tx_err tx_drp tx_ovr flags; do
if [ $rx_err -gt 0 ] || [ $tx_err -gt 0 ]; then
ALERT_MSG="$(date '+%Y-%m-%d %H:%M:%S') - ALERT: Errors on interface $iface - RX: $rx_err, TX: $tx_err"
echo $ALERT_MSG >> $ALERT_FILE
echo $ALERT_MSG
fi
done
}
# 主函数
main() {
check_suspicious_connections
check_interface_status
}
main无敌#
企业级网络监控系统#
#!/bin/bash
# 企业级网络监控系统
CONFIG_FILE="/etc/network_monitor/config.conf"
LOG_DIR="/var/log/network_monitor"
ALERT_SCRIPT="/usr/local/bin/send_alert.sh"
mkdir -p $LOG_DIR
# 加载配置
source $CONFIG_FILE
# 收集网络统计信息
collect_stats() {
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
STATS_FILE="$LOG_DIR/stats_$(date +%Y%m%d).csv"
# 连接统计
TOTAL_CONNECTIONS=$(netstat -an | grep ESTABLISHED | wc -l)
LISTENING_PORTS=$(netstat -an | grep LISTEN | wc -l)
TIME_WAIT=$(netstat -an | grep TIME_WAIT | wc -l)
# 接口统计
for INTERFACE in "${MONITOR_INTERFACES[@]}"; do
RX_PACKETS=$(netstat -i | grep $INTERFACE | awk '{print $3}')
TX_PACKETS=$(netstat -i | grep $INTERFACE | awk '{print $7}')
echo "$TIMESTAMP,$INTERFACE,$RX_PACKETS,$TX_PACKETS,$TOTAL_CONNECTIONS,$LISTENING_PORTS,$TIME_WAIT" >> $STATS_FILE
done
}
# 检查异常情况
check_anomalies() {
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
# 检查连接数
TOTAL_CONNECTIONS=$(netstat -an | grep ESTABLISHED | wc -l)
if [ $TOTAL_CONNECTIONS -gt $MAX_CONNECTIONS ]; then
$ALERT_SCRIPT "High connection count: $TOTAL_CONNECTIONS"
fi
# 检查 TIME_WAIT 连接
TIME_WAIT=$(netstat -an | grep TIME_WAIT | wc -l)
if [ $TIME_WAIT -gt $MAX_TIME_WAIT ]; then
$ALERT_SCRIPT "High TIME_WAIT count: $TIME_WAIT"
fi
# 检查异常 IP
netstat -an | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | while read count ip; do
if [ $count -gt $MAX_CONNECTIONS_PER_IP ]; then
$ALERT_SCRIPT "High connection count from $ip: $count connections"
fi
done
}
# 生成报告
generate_report() {
REPORT_FILE="$LOG_DIR/report_$(date +%Y%m%d).txt"
echo "Network Monitoring Report - $(date +%Y-%m-%d)" > $REPORT_FILE
echo "=========================================" >> $REPORT_FILE
echo "" >> $REPORT_FILE
echo "Connection Statistics:" >> $REPORT_FILE
echo "Total Connections: $(netstat -an | grep ESTABLISHED | wc -l)" >> $REPORT_FILE
echo "Listening Ports: $(netstat -an | grep LISTEN | wc -l)" >> $REPORT_FILE
echo "TIME_WAIT: $(netstat -an | grep TIME_WAIT | wc -l)" >> $REPORT_FILE
echo "" >> $REPORT_FILE
echo "Top 10 Remote IPs:" >> $REPORT_FILE
netstat -an | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10 >> $REPORT_FILE
echo "" >> $REPORT_FILE
echo "Top 10 Ports:" >> $REPORT_FILE
netstat -an | grep ESTABLISHED | awk '{print $4}' | cut -d: -f2 | sort | uniq -c | sort -rn | head -10 >> $REPORT_FILE
}
# 主监控循环
main() {
while true; do
collect_stats
check_anomalies
if [ $(date +%H) -eq 0 ] && [ $(date +%M) -eq 0 ]; then
generate_report
fi
sleep $MONITOR_INTERVAL
done
}
main网络流量分析#
#!/bin/bash
# 网络流量分析工具
ANALYSIS_DURATION=60
INTERFACE="eth0"
# 收集连接数据
collect_connection_data() {
local duration=$1
local output_file=$2
for ((i=0; i<duration; i++)); do
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
netstat -an | grep ESTABLISHED | while read proto recv_q send_q local_addr foreign_addr state; do
local_ip=$(echo $local_addr | cut -d: -f1)
local_port=$(echo $local_addr | cut -d: -f2)
remote_ip=$(echo $foreign_addr | cut -d: -f1)
remote_port=$(echo $foreign_addr | cut -d: -f2)
echo "$TIMESTAMP,$local_ip,$local_port,$remote_ip,$remote_port,$state" >> $output_file
done
sleep 1
done
}
# 分析流量模式
analyze_traffic_pattern() {
local input_file=$1
echo "Traffic Pattern Analysis"
echo "========================"
# 按时间统计连接数
echo -e "\nConnections over time:"
awk -F, '{print $1}' $input_file | sort | uniq -c
# 按本地端口统计
echo -e "\nTop 10 Local Ports:"
awk -F, '{print $3}' $input_file | sort | uniq -c | sort -rn | head -10
# 按远程端口统计
echo -e "\nTop 10 Remote Ports:"
awk -F, '{print $5}' $input_file | sort | uniq -c | sort -rn | head -10
# 按远程 IP 统计
echo -e "\nTop 10 Remote IPs:"
awk -F, '{print $4}' $input_file | sort | uniq -c | sort -rn | head -10
}
# 主函数
main() {
local data_file="/tmp/traffic_data_$(date +%Y%m%d_%H%M%S).csv"
echo "Collecting traffic data for $ANALYSIS_DURATION seconds..."
collect_connection_data $ANALYSIS_DURATION $data_file
echo "Analyzing traffic pattern..."
analyze_traffic_pattern $data_file
echo -e "\nData saved to: $data_file"
}
main网络故障诊断#
#!/bin/bash
# 网络故障诊断工具
DIAGNOSTIC_LOG="/tmp/network_diagnostic_$(date +%Y%m%d_%H%M%S).log"
# 诊断网络连接
diagnose_connections() {
echo "=== Network Connection Diagnosis ===" >> $DIAGNOSTIC_LOG
# 检查网络接口状态
echo -e "\nNetwork Interface Status:" >> $DIAGNOSTIC_LOG
netstat -i >> $DIAGNOSTIC_LOG
# 检查路由表
echo -e "\nRouting Table:" >> $DIAGNOSTIC_LOG
netstat -rn >> $DIAGNOSTIC_LOG
# 检查监听端口
echo -e "\nListening Ports:" >> $DIAGNOSTIC_LOG
netstat -ltn >> $DIAGNOSTIC_LOG
# 检查已建立连接
echo -e "\nEstablished Connections:" >> $DIAGNOSTIC_LOG
netstat -an | grep ESTABLISHED >> $DIAGNOSTIC_LOG
# 检查网络统计
echo -e "\nNetwork Statistics:" >> $DIAGNOSTIC_LOG
netstat -s >> $DIAGNOSTIC_LOG
}
# 诊断特定问题
diagnose_specific_issue() {
local issue=$1
case $issue in
"slow_network")
echo "=== Diagnosing Slow Network ===" >> $DIAGNOSTIC_LOG
netstat -i | awk '{if ($4 > 0 || $8 > 0) print "Interface errors detected"}' >> $DIAGNOSTIC_LOG
netstat -s | grep -E "retransmitted|timeout" >> $DIAGNOSTIC_LOG
;;
"high_latency")
echo "=== Diagnosing High Latency ===" >> $DIAGNOSTIC_LOG
netstat -s | grep -E "retransmitted|delayed" >> $DIAGNOSTIC_LOG
;;
"connection_refused")
echo "=== Diagnosing Connection Refused ===" >> $DIAGNOSTIC_LOG
netstat -ltn >> $DIAGNOSTIC_LOG
;;
*)
echo "Unknown issue: $issue" >> $DIAGNOSTIC_LOG
;;
esac
}
# 生成诊断报告
generate_diagnostic_report() {
echo "Network Diagnostic Report - $(date)" > $DIAGNOSTIC_LOG
echo "================================" >> $DIAGNOSTIC_LOG
echo "" >> $DIAGNOSTIC_LOG
diagnose_connections
if [ -n "$1" ]; then
diagnose_specific_issue "$1"
fi
echo -e "\nDiagnostic completed. Log saved to: $DIAGNOSTIC_LOG"
}
# 主函数
main() {
generate_diagnostic_report "$1"
}
main "$@"最佳实践#
- 使用 ss 命令替代:在新版本 Linux 中,优先使用
ss命令替代netstat - 使用数字格式:使用
-n选项避免 DNS 解析,提高性能 - 定期监控:定期检查网络连接状态,及时发现异常
- 分析连接模式:分析连接模式,识别潜在的安全威胁
- 记录日志:记录重要的网络事件,便于故障排查
- 设置告警阈值:根据业务需求设置合理的告警阈值
- 结合其他工具:结合
tcpdump、wireshark等工具进行深入分析 - 注意性能影响:频繁执行
netstat可能影响系统性能
注意事项#
netstat在某些 Linux 发行版中已被弃用,建议使用ss命令- 使用
-p选项需要 root 权限 - 频繁执行
netstat可能消耗系统资源 - 网络连接信息可能包含敏感数据,注意保护隐私
- 不同操作系统的
netstat命令选项可能有所不同 - 在高流量环境中,
netstat输出可能非常庞大 - 注意 TIME_WAIT 状态的连接,可能导致端口耗尽
- 对于关键业务,建议使用专业的网络监控工具