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 "$@"

最佳实践#

  1. 使用 ss 命令替代:在新版本 Linux 中,优先使用 ss 命令替代 netstat
  2. 使用数字格式:使用 -n 选项避免 DNS 解析,提高性能
  3. 定期监控:定期检查网络连接状态,及时发现异常
  4. 分析连接模式:分析连接模式,识别潜在的安全威胁
  5. 记录日志:记录重要的网络事件,便于故障排查
  6. 设置告警阈值:根据业务需求设置合理的告警阈值
  7. 结合其他工具:结合 tcpdumpwireshark 等工具进行深入分析
  8. 注意性能影响:频繁执行 netstat 可能影响系统性能

注意事项#

  • netstat 在某些 Linux 发行版中已被弃用,建议使用 ss 命令
  • 使用 -p 选项需要 root 权限
  • 频繁执行 netstat 可能消耗系统资源
  • 网络连接信息可能包含敏感数据,注意保护隐私
  • 不同操作系统的 netstat 命令选项可能有所不同
  • 在高流量环境中,netstat 输出可能非常庞大
  • 注意 TIME_WAIT 状态的连接,可能导致端口耗尽
  • 对于关键业务,建议使用专业的网络监控工具