- é¢é£è¨äº
- æ¦è¦
- ã¤ã³ã¹ãã¼ã«
- 試ãã¦ã¿ã
- ãªãã¸ããª
- åèæ å ±
- Goã®ããããæ¸ç±
é¢é£è¨äº
Goメモ-306 (go-packetメモ-01)(ネットワークインターフェースを表示) - いろいろ備忘録日記
GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ
æ¦è¦
以ä¸ãèªåç¨ã®ã¡ã¢ã§ããå¿ããªããã¡ã«ã¡ã¢ã¡ã¢ããã
Goã§WireSharkãtcpdumpã®ããã«ãã±ãããç´æ¥è¦ããã¨ããªã©ã«å©ç¨ã§ããã©ã¤ãã©ãªã«
ã¨ããã®ãããã¾ãã
ä»ã¾ã§ä½¿ã£ããã¨ç¡ãã£ãã®ã§ããã使ãã¨é¢ç½ãã£ãã®ã§èªåç¨ã®ã¡ã¢ä»£ããã«ã¡ããã¡ããæ®ãã¦ãããã¨æãã¾ãã
Linux (Ubuntu) ä¸ã§éãã§ãã¾ãã®ã§ãWindowsã®å ´åã¯WinPcap (WireSharkãã¤ã³ã¹ãã¼ã«ããã¨ãã«ã¤ãã§ã«ã¤ã³ã¹ãã¼ã«ã§ããã¯ãï¼ãå¿ è¦ã«ãªãã¨æãã¾ãã
ã¤ã³ã¹ãã¼ã«
libpcap
ãå¿
è¦ã§ãã®ã§ã以ä¸ã§ã¤ã³ã¹ãã¼ã«ãã¾ãã
$ sudo apt install libpcap-dev
ãã¨ãtcpdumpãå ¥ã£ã¦ããªãå ´åã¯ä»¥ä¸ãã¤ãã§ã«å ¥ãã¦ããã¾ããï¼ããã¯ãªãã·ã§ãã«ã§ãï¼
$ sudo apt install tcpdump
試ãã¦ã¿ã
ä½¿ãæ¹ã«é¢ãã¦ã¯ãä¸ã«æãã¦ãã go-packet ã® godoc ã®æ¹ã«è©³ããæ¸ããã¦ãã¾ãã
ä»åã¯ã仿µãã¦ãããã±ããããã£ããã£ãã¦ã¿ã¾ãã
pcap.OpenLive
颿°ã使ãã¾ãã
// Package main is the example of pcap.OpenLive() package main import ( "fmt" "log" "os" "os/signal" "time" "github.com/google/gopacket" "github.com/google/gopacket/pcap" ) var ( appLog = log.New(os.Stderr, "", 0) ) func main() { if err := run(); err != nil { panic(err) } } func run() error { const ( device = "eth0" filter = "" snapshotLen = int32(1600) promiscuous = false timeout = 1 * time.Second ) defer func() { appLog.Println("DONE") }() // -------------------------------------- // Open capture handle // -------------------------------------- var ( handle *pcap.Handle err error ) handle, err = pcap.OpenLive(device, snapshotLen, promiscuous, timeout) if err != nil { return fmt.Errorf("error open handle: %w", err) } defer handle.Close() // -------------------------------------- // Apply capture filter (optional) // -------------------------------------- if filter != "" { err = handle.SetBPFFilter(filter) if err != nil { return fmt.Errorf("error apply filter: %w", err) } } // -------------------------------------- // Set signal handler // -------------------------------------- var ( sigCh = make(chan os.Signal, 1) ) signal.Notify(sigCh, os.Interrupt) // -------------------------------------- // Make packet source and display. // -------------------------------------- var ( dataSource gopacket.PacketDataSource = handle decoder gopacket.Decoder = handle.LinkType() packetSource *gopacket.PacketSource = gopacket.NewPacketSource(dataSource, decoder) packetCh <-chan gopacket.Packet = packetSource.Packets() ) appLog.Println("START") LOOP: for { select { case <-sigCh: break LOOP case p, ok := <-packetCh: if !ok { break LOOP } appLog.Println(p) } } return nil }
以ä¸ãGitpodä¸ã§å®è¡ãã¦ã¿ãçµæã§ãã
gitpod /workspace/go-gopacket-example (main) $ task openlive task: [openlive] go build task: [openlive] sudo ./openlive START PACKET: 92 bytes, wire length 92 cap length 92 @ 2023-04-10 23:28:25.323176 +0000 UTC - Layer 1 (14 bytes) = Ethernet {Contents=[..14..] Payload=[..78..] SrcMAC=c6:fa:60:01:56:7f DstMAC=ce:39:d9:53:80:6c EthernetType=IPv4 Length=0} - Layer 2 (20 bytes) = IPv4 {Contents=[..20..] Payload=[..58..] Version=4 IHL=5 TOS=0 Length=78 Id=31324 Flags=DF FragOffset=0 TTL=64 Protocol=TCP Checksum=24663 SrcIP=10.0.5.2 DstIP=192.168.144.76 Options=[] Padding=[]} - Layer 3 (32 bytes) = TCP {Contents=[..32..] Payload=[..26..] SrcPort=23000(inovaport1) DstPort=47282 Seq=2748083048 Ack=3081863157 DataOffset=8 FIN=false SYN=false RST=false PSH=true ACK=true URG=false ECE=false CWR=false NS=false Window=3674 Checksum=24631 Urgent=0 Options=[TCPOption(NOP:), TCPOption(NOP:), TCPOption(Timestamps:3131574629/3872003262 0xbaa80965e6ca14be)] Padding=[]} - Layer 4 (26 bytes) = Payload 26 byte(s) PACKET: 66 bytes, wire length 66 cap length 66 @ 2023-04-10 23:28:25.323983 +0000 UTC - Layer 1 (14 bytes) = Ethernet {Contents=[..14..] Payload=[..52..] SrcMAC=ce:39:d9:53:80:6c DstMAC=c6:fa:60:01:56:7f EthernetType=IPv4 Length=0} - Layer 2 (20 bytes) = IPv4 {Contents=[..20..] Payload=[..32..] Version=4 IHL=5 TOS=0 Length=52 Id=49813 Flags=DF FragOffset=0 TTL=61 Protocol=TCP Checksum=6968 SrcIP=192.168.144.76 DstIP=10.0.5.2 Options=[] Padding=[]} - Layer 3 (32 bytes) = TCP {Contents=[..32..] Payload=[] SrcPort=47282 DstPort=23000(inovaport1) Seq=3081863157 Ack=2748083074 DataOffset=8 FIN=false SYN=false RST=false PSH=false ACK=true URG=false ECE=false CWR=false NS=false Window=331 Checksum=64571 Urgent=0 Options=[TCPOption(NOP:), TCPOption(NOP:), TCPOption(Timestamps:3872003302/3131574629 0xe6ca14e6baa80965)] Padding=[]} [ãã±ãããã£ããã£ã沢山表示ããã¾ã] ^Ctask: Signal received: "interrupt" DONE
å®è¡ããã¨ãã¯ã¼ã£ã¨è¡¨ç¤ºããã¾ããCtrl-Cã§æ¢ãã¾ããå®è¡ããã«ã¯ root権é ãå¿ è¦ãªã®ã§ sudo ãã¦å®è¡ãã¾ãã
ä¸ã®ããã°ã©ã ã® filter 夿°ã« BPFãã£ã«ã¿ã¼ãè¨å®ããã¨è¡¨ç¤ºãããã±ãããçµãè¾¼ããã¨ãåºæ¥ã¾ãã
ãªãã¸ããª
ä¸ã®ãµã³ãã«ãªã©ã¯ã以ä¸ã®ãªãã¸ããªã§ã¢ãããã¦ãã¾ãããåèã¾ã§ã«ã
åèæ å ±
Goã®ããããæ¸ç±
éå»ã®è¨äºã«ã¤ãã¦ã¯ã以ä¸ã®ãã¼ã¸ãããåç §ä¸ããã
ãµã³ãã«ã³ã¼ãã¯ã以ä¸ã®å ´æã§å ¬éãã¦ãã¾ãã