การใช้คำสั่ง netstat บน Linux

เผยแพร่แล้ว: 2015-02-15

เรียนรู้ว่าคำสั่ง netstat และตัวอย่างแบบเรียลไทม์คืออะไร

netstat (สถิติเครือข่าย) เป็นเครื่องมือบรรทัดคำสั่งที่แสดงการเชื่อมต่อเครือข่าย (ทั้งขาเข้าและขาออก) ตารางเส้นทาง และสถิติอินเทอร์เฟซเครือข่ายจำนวนหนึ่ง

มีอยู่ในระบบปฏิบัติการ Linux, Unix-like และ Windows netstat มีประสิทธิภาพและสามารถเป็นเครื่องมือที่มีประโยชน์ในการแก้ไขปัญหาที่เกี่ยวข้องกับเครือข่ายและตรวจสอบสถิติการเชื่อมต่อ

หากคุณพิมพ์ netstat -help คุณจะได้รับคำแนะนำการใช้งานดังต่อไปนี้

 [root@lab ~]# netstat -help usage: netstat [-vWeenNcCF] [<Af>] -r netstat {-V|--version|-h|--help} netstat [-vWnNcaeol] [<Socket> ...] netstat { [-vWeenNac] -I[<Iface>] | [-veenNac] -i | [-cnNe] -M | -s [-6tuw] } [delay] -r, --route display routing table -I, --interfaces=<Iface> display interface table for <Iface> -i, --interfaces display interface table -g, --groups display multicast group memberships -s, --statistics display networking statistics (like SNMP) -M, --masquerade display masqueraded connections -v, --verbose be verbose -W, --wide don't truncate IP addresses -n, --numeric don't resolve names --numeric-hosts don't resolve host names --numeric-ports don't resolve port names --numeric-users don't resolve user names -N, --symbolic resolve hardware names -e, --extend display other/more information -p, --programs display PID/Program name for sockets -o, --timers display timers -c, --continuous continuous listing -l, --listening display listening server sockets -a, --all display all sockets (default: connected) -F, --fib display Forwarding Information Base (default) -C, --cache display routing cache instead of FIB -Z, --context display SELinux security context for sockets <Socket>={-t|--tcp} {-u|--udp} {-U|--udplite} {-S|--sctp} {-w|--raw} {-x|--unix} --ax25 --ipx --netrom <AF>=Use '-6|-4' or '-A <af>' or '--<af>'; default: inet List of possible address families (which support routing): inet (DARPA Internet) inet6 (IPv6) ax25 (AMPR AX.25) netrom (AMPR NET/ROM) ipx (Novell IPX) ddp (Appletalk DDP) x25 (CCITT X.25) [root@lab ~]#

ให้ฉันแสดงตัวอย่างบางส่วนของคำสั่ง สิ่งต่อไปนี้ได้รับการทดสอบบน RHEL/CentOS แต่ฉันไม่เห็นเหตุผลที่จะไม่ทำงานกับ distro อื่นเช่น Ubuntu

ก่อตั้งการเชื่อมต่อ

หากคุณกำลังมองหาการเชื่อมต่อที่สร้างขึ้นทั้งหมดจากเซิร์ฟเวอร์

 [root@lab ~]# netstat -natu | grep 'ESTABLISHED' tcp 0 21 68.183.37.102:22 222.186.31.135:21714 ESTABLISHED tcp 0 36 68.183.37.102:22 52.148.155.182:49859 ESTABLISHED tcp 0 0 68.183.37.102:22 61.177.142.158:55481 ESTABLISHED [root@lab ~]#

หากคุณมีคนรู้จักจำนวนมากและสนใจที่จะค้นหาหนึ่งใน IP คุณสามารถใช้ grep อื่นได้

 [root@lab ~]# netstat -natu | grep 'ESTABLISHED' | grep 61.177.142.158 tcp 0 1280 68.183.37.102:22 61.177.142.158:33932 ESTABLISHED [root@lab ~]#

การเชื่อมต่อการฟัง

สมมุติว่าคุณได้เริ่มบริการบางอย่างแล้ว และนั่นก็ควรจะฟังบน IP:Port เฉพาะ ซึ่งจะสะดวกในการตรวจสอบ

 [root@lab ~]# netstat -an | grep 'LISTEN' tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp6 0 0 :::111 :::* LISTEN tcp6 0 0 :::80 :::* LISTEN tcp6 0 0 :::22 :::* LISTEN [root@lab ~]#

หรือคุณสามารถใช้อาร์กิวเมนต์ -l เพื่อแสดงซ็อกเก็ตการฟังทั้งหมด

 [root@lab ~]# netstat -l Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:sunrpc 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN tcp6 0 0 [::]:sunrpc [::]:* LISTEN tcp6 0 0 [::]:webcache [::]:* LISTEN tcp6 0 0 [::]:ssh [::]:* LISTEN udp 0 0 0.0.0.0:805 0.0.0.0:* udp 0 0 0.0.0.0:sunrpc 0.0.0.0:* udp 0 0 localhost:323 0.0.0.0:* udp6 0 0 [::]:805 [::]:* udp6 0 0 [::]:sunrpc [::]:* udp6 0 0 ip6-localhost:323 [::]:* Active UNIX domain sockets (only servers) Proto RefCnt Flags Type State I-Node Path unix 2 [ ACC ] STREAM LISTENING 15108 /run/dbus/system_bus_socket unix 2 [ ACC ] STREAM LISTENING 8202 /run/systemd/journal/stdout unix 2 [ ACC ] SEQPACKET LISTENING 12813 /run/udev/control unix 2 [ ACC ] STREAM LISTENING 17542 public/pickup unix 2 [ ACC ] STREAM LISTENING 15165 /var/run/rpcbind.sock unix 2 [ ACC ] STREAM LISTENING 17546 public/cleanup unix 2 [ ACC ] STREAM LISTENING 15605 /var/lib/gssproxy/default.sock unix 2 [ ACC ] STREAM LISTENING 12706 /run/systemd/private unix 2 [ ACC ] STREAM LISTENING 17549 public/qmgr unix 2 [ ACC ] STREAM LISTENING 17571 public/flush unix 2 [ ACC ] STREAM LISTENING 17553 private/tlsmgr unix 2 [ ACC ] STREAM LISTENING 17586 public/showq unix 2 [ ACC ] STREAM LISTENING 17556 private/rewrite unix 2 [ ACC ] STREAM LISTENING 17559 private/bounce unix 2 [ ACC ] STREAM LISTENING 17562 private/defer unix 2 [ ACC ] STREAM LISTENING 17565 private/trace unix 2 [ ACC ] STREAM LISTENING 17568 private/verify unix 2 [ ACC ] STREAM LISTENING 17574 private/proxymap unix 2 [ ACC ] STREAM LISTENING 17577 private/proxywrite unix 2 [ ACC ] STREAM LISTENING 17580 private/smtp unix 2 [ ACC ] STREAM LISTENING 17583 private/relay unix 2 [ ACC ] STREAM LISTENING 17589 private/error unix 2 [ ACC ] STREAM LISTENING 17592 private/retry unix 2 [ ACC ] STREAM LISTENING 17595 private/discard unix 2 [ ACC ] STREAM LISTENING 17598 private/local unix 2 [ ACC ] STREAM LISTENING 17601 private/virtual unix 2 [ ACC ] STREAM LISTENING 17604 private/lmtp unix 2 [ ACC ] STREAM LISTENING 17607 private/anvil unix 2 [ ACC ] STREAM LISTENING 17610 private/scache unix 2 [ ACC ] STREAM LISTENING 15606 /run/gssproxy.sock [root@lab ~]#

ใช้ประโยชน์จาก grep เพื่อกรองผลลัพธ์

หมายเลขพอร์ตที่ใช้โดย PID

คุณรู้ว่าแอปพลิเคชันของคุณเริ่มต้นและรับรู้ PID (ตัวระบุกระบวนการ) แต่ไม่แน่ใจว่าใช้หมายเลขพอร์ตใด ตัวอย่างด้านล่างสำหรับ PID 3937

 [root@lab ~]# netstat -anlp |grep 3937 tcp6 0 0 :::80 :::* LISTEN 3937/httpd unix 3 [ ] STREAM CONNECTED 2442387 3937/httpd [root@lab ~]#

อย่างที่คุณเห็น กำลังใช้พอร์ต 80 สำหรับ PID 3937

สถิติโปรโตคอลทั้งหมด

มีการตัดการเชื่อมต่อบ่อยครั้งเนื่องจากการละทิ้งแพ็กเก็ต? อาร์กิวเมนต์ -s จะแสดงสถิติโดยรวมซึ่งคุณสามารถให้ความสนใจกับข้อความที่ถูกทิ้งในแพ็กเก็ต

 [root@lab ~]# netstat -s Ip: 731422 total packets received 0 forwarded 0 incoming packets discarded 731399 incoming packets delivered 787732 requests sent out 16 dropped because of missing route Icmp: 5277 ICMP messages received 120 input ICMP message failed. InCsumErrors: 6 ICMP input histogram: destination unreachable: 193 timeout in transit: 16 echo requests: 5060 echo replies: 2 9355 ICMP messages sent 0 ICMP messages failed ICMP output histogram: destination unreachable: 4295 echo replies: 5060 IcmpMsg: InType0: 2 InType3: 193 InType8: 5060 InType11: 16 OutType0: 5060 OutType3: 4295 Tcp: 42 active connections openings 35226 passive connection openings 1693 failed connection attempts 645 connection resets received 2 connections established 646705 segments received 648037 segments send out 99463 segments retransmited 27377 bad segments received. 150893 resets sent InCsumErrors: 27377 Udp: 74547 packets received 4814 packets to unknown port received. 56 packet receive errors 74584 packets sent 0 receive buffer errors 0 send buffer errors InCsumErrors: 56 UdpLite: TcpExt: 177 invalid SYN cookies received 1693 resets received for embryonic SYN_RECV sockets 316 TCP sockets finished time wait in fast timer 3 packets rejects in established connections because of timestamp 70248 delayed acks sent 6 delayed acks further delayed because of locked socket Quick ack mode was activated 3082 times 17 SYNs to LISTEN sockets dropped 28179 packets directly queued to recvmsg prequeue. 9802 bytes directly received in process context from prequeue 72106 packet headers predicted 94182 acknowledgments not containing data payload received 40094 predicted acknowledgments 332 times recovered from packet loss by selective acknowledgements 8 congestion windows recovered without slow start by DSACK 1173 congestion windows recovered without slow start after partial ack 1029 timeouts after SACK recovery 8 timeouts in loss state 329 fast retransmits 3 forward retransmits 32 retransmits in slow start 44785 other TCP timeouts TCPLossProbes: 9763 TCPLossProbeRecovery: 1732 54 SACK retransmits failed 3144 DSACKs sent for old packets 4 DSACKs sent for out of order packets 695 DSACKs received 1 DSACKs for out of order packets received 44 connections reset due to unexpected data 76 connections reset due to early user close 6079 connections aborted due to timeout TCPDSACKIgnoredNoUndo: 448 TCPSpuriousRTOs: 5 TCPSackShiftFallback: 465 IPReversePathFilter: 11 TCPRcvCoalesce: 32369 TCPOFOQueue: 4313 TCPOFOMerge: 4 TCPChallengeACK: 2 TCPSynRetrans: 43670 TCPOrigDataSent: 208010 TCPACKSkippedSeq: 12 IpExt: InNoRoutes: 12 InOctets: 133789295 OutOctets: 151093769 InNoECTPkts: 731338 InECT1Pkts: 3 InECT0Pkts: 1568 InCEPkts: 108 [root@lab ~]#

ข้อมูลการกำหนดเส้นทางเคอร์เนล

มีปัญหาเรื่องเส้นทาง? หรือการเชื่อมต่อไม่ทำงานตามที่คาดไว้เนื่องจากการเชื่อมต่อกำลังเดินทางผ่านเส้นทางอื่น?

ตรวจสอบตารางเส้นทางอย่างรวดเร็ว

 [root@lab ~]# netstat -r Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface default gateway 0.0.0.0 UG 0 0 0 eth0 10.16.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0 68.183.32.0 0.0.0.0 255.255.240.0 U 0 0 0 eth0 link-local 0.0.0.0 255.255.0.0 U 0 0 0 eth0 [root@lab ~]#

PID ที่ใช้โดยหมายเลขพอร์ต

มีประโยชน์มากในการแก้ไขปัญหาข้อขัดแย้งของพอร์ต สมมติว่าคุณกำลังพยายามเริ่มเซิร์ฟเวอร์ Apache หรือ Nginx ซึ่งรับฟังบนพอร์ต 80 แต่ไม่สามารถทำได้เนื่องจากกระบวนการอื่นใช้พอร์ต 80 อยู่แล้ว

 [root@lab ~]# netstat -anlp |grep 80 | grep LISTEN tcp6 0 0 :::80 :::* LISTEN 3937/httpd [root@lab ~]#

และคุณจะเห็นว่า PID 3937 กำลังใช้พอร์ตนั้นอยู่

หากคุณกำลังใช้ AIX ดังนั้น

 netstat -Aan | grep $portnumber

ซึ่งจะแสดงที่อยู่ของ Protocol Control Block เป็นเลขฐานสิบหก

เมื่อคุณมีเลขฐานสิบหกแล้ว คุณสามารถดำเนินการด้านล่างเพื่อรับกระบวนการที่มีหมายเลขพอร์ต

 rmsock $address_of_pcb tcpcb

รายการอินเทอร์เฟซเครือข่าย

มีอินเทอร์เฟซอีเทอร์เน็ตหลายตัว? หรือไม่แน่ใจและอยากทราบ?

 [root@lab ~]# netstat -i Kernel Interface table Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg eth0 1500 793026 0 0 0 849443 0 0 0 BMRU lo 65536 6 0 0 0 6 0 0 0 LRU [root@lab ~]#

การฟังอย่างต่อเนื่อง

ตัวเลือกที่ยอดเยี่ยมในการแก้ไขปัญหาที่เกี่ยวข้องกับบริการขัดข้อง สมมติว่าแอปพลิเคชันหยุดทำงานแบบสุ่มทุกๆ สองสามนาที แต่ไม่แน่ใจว่าเมื่อไหร่ คุณสามารถใช้อาร์กิวเมนต์ -c ซึ่งจะแสดงผลอย่างต่อเนื่อง

 [root@lab ~]# netstat -anlpc |grep 8080 tcp6 0 0 :::8080 :::* LISTEN 11766/httpd tcp6 0 0 :::8080 :::* LISTEN 11766/httpd tcp6 0 0 :::8080 :::* LISTEN 11766/httpd tcp6 0 0 :::8080 :::* LISTEN 11766/httpd

เมื่อหยุดอัปเดต คุณจะรู้ว่าระบบขัดข้อง

บทสรุป

netstat เป็นหนึ่งในคำสั่งที่ใช้กันอย่างแพร่หลายโดย sysadmin และฉันหวังว่าตัวอย่างข้างต้นจะช่วยให้คุณมีแนวคิดเกี่ยวกับสิ่งที่คุณสามารถทำได้ หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการดูแลระบบ Linux ลองดูหลักสูตร Udemy นี้