Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
GoでTCPパケットを読む / Fukuoka.go #12
Search
Ken’ichiro Oyama
October 07, 2018
Technology
1.4k
14
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
GoでTCPパケットを読む / Fukuoka.go #12
Fukuoka.go #12
Ken’ichiro Oyama
October 07, 2018
More Decks by Ken’ichiro Oyama
See All by Ken’ichiro Oyama
Introducing RFC9111 / YAPC::Fukuoka 2025
k1low
2
5.6k
Design and implementation of "Markdown to Google Slides" / phpconfuk 2025
k1low
1
1k
analysis パッケージの仕組みの上でMulti linter with configを実現する / Go Conference 2025
k1low
1
810
Flight recorder at the application layer (NOT the FlightRecoder newly added at Go 1.25) / Fukuoka.go #22
k1low
0
190
ソフトウェア開発におけるインターフェイスという考え方 / PHPerKaigi 2025
k1low
12
6.3k
Parsing HCL/CUE / Fukuoka.go #21
k1low
0
11k
実践 net/http Middleware パターン / Kizuku.go Vol.1
k1low
2
460
Cleanup handling in Go / Go Conference 2024
k1low
7
4.2k
CI/CDがあたりまえの今の時代にAPIテスティングツールに求められていること / CI/CD Test Night #7
k1low
18
12k
Other Decks in Technology
See All in Technology
信頼できるテスティングAIをどう育てるか?
odan611
0
150
検索技術知識0のエンジニアが広告検索システムを内製化して運用するまで
lycorptech_jp
PRO
0
110
13年運用タイトルのサーバーサイドが辿り着いた現在地 ― モンスターストライクにおける技術・組織・AI活用から得た知見
mixi_engineers
PRO
1
270
AI Agent を本番環境へ―― Microsoft Foundry × Azure Serverless で作る Enterprise-Ready な基盤
shibayan
PRO
1
640
データ活用研修 問いの発見と仮説構築【MIXI 26新卒技術研修】
mixi_engineers
PRO
1
580
QA・ソフトウェアテスト研修【MIXI 26新卒技術研修】
mixi_engineers
PRO
3
1.6k
事業成長とAI活用を止めないデータ基盤アーキテクチャの設計思想
hiracky16
0
760
AI時代におけるエンジニアの新たな役割──FDEとクオリアの探求/登壇資料(戸井田 裕貴)
hacobu
PRO
0
620
AIエージェントがあれば技術書なんてすぐ書けるでしょ→無理でした
watany
6
1.1k
Power Automateアップデート情報
miyakemito
0
270
AI工学特論: MLOps・継続的評価
asei
11
2.9k
セキュリティ研修【MIXI 26新卒技術研修】
mixi_engineers
PRO
29
23k
Featured
See All Featured
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
780
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
230
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
640
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
230
Automating Front-end Workflow
addyosmani
1370
210k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
HDC tutorial
michielstock
2
760
The Cult of Friendly URLs
andyhume
79
7k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
Transcript
খࢁ݈Ұ(.01FQBCP *OD 'VLVPLBHP (PͰ5$1ύέοτΛಡΉ
γχΞΤϯδχΞ খࢁ݈Ұ!L-P8 ϗεςΟϯάࣄۀ෦ϗεςΟϯάάϧʔϓϚωʔδυΫϥυνʔϜ IUUQTHJUIVCDPNL-P8
UDQEVNQ
UDQEVNQͱɺίϚϯυϥΠϯ্Ͱར༻͢Δ Ұൠతͳܭࢉػωο τϫʔΫௐࠪ πʔϧͰ͋ΔɻUDQEVNQʹΑΓɺར༻ऀίϚϯ υΛ࣮ߦͨ͠ܭࢉػ͕ͭͳ͕͍ͬͯΔωοτϫʔΫ্ΛྲྀΕΔ5$1*1ͳ ͲͷύέοτΛԣऔͬͯɺදࣔͤ͞Δ͜ͱ͕ग़དྷΔɻ͜ͷϓϩάϥϜ ։ൃ࣌ʹϩʔϨϯεɾόʔΫϦʔݚڀॴωοτϫʔΫݚڀάϧʔϓʹॴ ଐ͍ͯͨ͠όϯɾδΣΠίϒιϯɺ$SBJH-FSFTɺ4UFWFO.D$BOOFʹ Αͬͯॻ͔Εͨɻ ग़యϑϦʔඦՊࣄయʰΟΩϖσΟΞʢ8JLJQFEJBʣʱ
ҰൠతͳπʔϧͰ͋Δ
None
UDQEVNQͱΘͨ͠ wશͬͨ͘͜ͱ͋Γ·ͤΜͰͨ͠ wʮϦΫΤετΛ͛ΕϨεϙϯε͕ฦͬͯ͘Δ͠ɺ ΫΤϦΛ͛Ε݁Ռ͕ฦͬͯ͘Δʯͦ͏ࢥ͍ͬͯͨ ࣌ظ͕ࢲʹ͋Γ·ͨ͠ʢ͍ͭ࠷ۙ·Ͱʣ wࠓͰ·ͱʹ͑ͳ͍Ͱ͢ wҰํɺνʔϜϝϯόʔۭؾͷΑ͏ʹ͍·͢
5$1ύέοτͱ͔όΠφϦΛ ಡΉͳΜͯ SZ
IUUQTTQFBLFSEFDLDPNFEWBLGHPUFIBJOBSJXPEVNVQMVTB
None
None
͍ʂʂʂ
ͦΕͰ ؆୯ͳUDQEVNQΛ ࡞ͬͯΈ·͠ΐ͏
ࠓճ࣮͢ΔUDQEVNQͷίϚϯυ $ tcpdump -X -i eth0 tcp and port 80
ࠓճ࣮͢ΔUDQEVNQͷίϚϯυ $ tcpdump -X -i eth0 tcp and port 80
ग़ྗϑΥʔϚοτ ωοτϫʔΫΠϯλʔϑΣʔεͷࢦఆ ϑΟϧλϦϯά
ग़ྗ͜Μͳײ͡
Ͱ࡞͍͖ͬͯ·͠ΐ͏
·ͣϓϩδΣΫτσΟϨΫτϦΛ࡞ $ go version go version go1.11 darwin/amd64 $ mkdir
mydump $ cd mydump/ $ echo 'module "github.com/k1LoW/mydump"' > go.mod
NBJOHP 1 package main 2 3 import ( 4 "encoding/hex"
5 "fmt" 6 "log" 7 8 "github.com/google/gopacket" 9 "github.com/google/gopacket/pcap" 10 ) 11 12 func main() { 13 device := "eth0" 14 filter := "tcp and port 80" 15 16 handle, err := pcap.OpenLive( 17 device, int32(0xFFFF), true, pcap.BlockForever, 18 ) 19 if err != nil { 20 log.Fatal(err) 21 } 22 defer handle.Close() 23 if err := handle.SetBPFFilter(filter); err != nil { 24 log.Fatal(err) 25 } 26 27 packetSource := gopacket.NewPacketSource(handle, handle.LinkType()) 28 for packet := range packetSource.Packets() { 29 fmt.Printf(“%s\n", packet) 30 fmt.Printf("%s", hex.Dump(packet.Data())) 31 } 32 }
࣮ߦ $ sudo go run main.go
Ͱ͖ͨ
Ͱ͖ͨ
Ͱ͖ͨ
ιʔείʔυղઆ
NBJOHP- 1 package main 2 3 import ( 4 "encoding/hex"
5 "fmt" 6 "log" 7 8 "github.com/google/gopacket" 9 "github.com/google/gopacket/pcap" 10 )
HPPHMFHPQBDLFU
HPPHMFHPQBDLFU w(PPHMFͷύέοτॲཧ༻ͷϥΠϒϥϦ wIUUQTHJUIVCDPNHPPHMFHPQBDLFU wύέοτ͕ಡΊΔͷ͜ͷϥΠϒϥϦͷ͓͔͛ wQDBQϑΝΠϧͷಡΈࠐΈՄೳʹͳΔ wMJCQDBQΛར༻͍ͯ͠ΔDHP
NBJOHP- 12 func main() { 13 device := "eth0" 14
filter := "tcp and port 80" 15 16 handle, err := pcap.OpenLive( 17 device, int32(0xFFFF), true, pcap.BlockForever, 18 ) 19 if err != nil { 20 log.Fatal(err) 21 } 22 defer handle.Close() ࠓճݻఆɻҾͰ༩͑ΒΕΔΑ͏ʹͳͬͨΒ ΑΓUDQEVNQͬΆ͍ ΠϯλʔϑΣʔεʹΞλον
NBJOHP- 23 if err := handle.SetBPFFilter(filter); err != nil {
24 log.Fatal(err) 25 } #1' #FSLFMFZ1BDLFU'JMUFS Λઃఆ
#1'
IUUQTTQFBLFSEFDLDPNUBLVNBLVNFFCQGHFUUJOHTUBSUFE
NBJOHP- 27 packetSource := gopacket.NewPacketSource( handle, handle.LinkType()) 28 for packet
:= range packetSource.Packets() { 29 fmt.Printf(“%s\n", packet) 30 fmt.Printf("%s", hex.Dump(packet.Data())) 31 } 32 } ύέοτ͕νϟϯωϧΛ௨ͯͬͯ͘͡ΔͷͰGPSͰड͚औΔ ग़ྗ
ιʔείʔυղઆऴྃ
fmt.Printf(“%s\n", packet)
PACKET: 450 bytes, wire length 450 cap length 450 @
2018-10-04 19:02:36.200155 +0900 JST - Layer 1 (14 bytes) = Ethernet {Contents=[..14..] Payload=[..436..] SrcMAC=8c:85:90:ae:ae:c2 DstMAC=2c:33:11:ca:c8:be EthernetType=IPv4 Length=0} - Layer 2 (20 bytes) = IPv4 {Contents=[..20..] Payload=[..416..] Version=4 IHL=5 TOS=0 Length=436 Id=0 Flags=DF FragOffset=0 TTL=64 Protocol=TCP Checksum=24376 SrcIP=192.168.75.96 DstIP=108.177.97.82 Options=[] Padding=[]} - Layer 3 (32 bytes) = TCP {Contents=[..32..] Payload=[..384..] SrcPort=51190 DstPort=80(http) Seq=1867296718 Ack=2345355645 DataOffset=8 FIN=false SYN=false RST=false PSH=true ACK=true URG=false ECE=false CWR=false NS=false Window= 4096 Checksum=19074 Urgent=0 Options=[TCPOption(NOP:), TCPOption(NOP:), TCPOption(Timestamps:958590780/3024242800 0x3922ef3cb4424870)] Padding=[]} - Layer 4 (384 bytes) ^C1 63 69 6e 74 6f 73 |la/5.0 (Macintos|
PACKET: 450 bytes, wire length 450 cap length 450 @
2018-10-04 19:02:36.200155 +0900 JST - Layer 1 (14 bytes) = Ethernet {Contents=[..14..] Payload=[..436..] SrcMAC=8c:85:90:ae:ae:c2 DstMAC=2c:33:11:ca:c8:be EthernetType=IPv4 Length=0} - Layer 2 (20 bytes) = IPv4 {Contents=[..20..] Payload=[..416..] Version=4 IHL=5 TOS=0 Length=436 Id=0 Flags=DF FragOffset=0 TTL=64 Protocol=TCP Checksum=24376 SrcIP=192.168.75.96 DstIP=108.177.97.82 Options=[] Padding=[]} - Layer 3 (32 bytes) = TCP {Contents=[..32..] Payload=[..384..] SrcPort=51190 DstPort=80(http) Seq=1867296718 Ack=2345355645 DataOffset=8 FIN=false SYN=false RST=false PSH=true ACK=true URG=false ECE=false CWR=false NS=false Window= 4096 Checksum=19074 Urgent=0 Options=[TCPOption(NOP:), TCPOption(NOP:), TCPOption(Timestamps:958590780/3024242800 0x3922ef3cb4424870)] Padding=[]} - Layer 4 (384 bytes) ^C1 63 69 6e 74 6f 73 |la/5.0 (Macintos|
None
4USJOHFS͕ઃఆ͞Ε͍ͯΔͧʂ func(* p) String()͕ఆٛ͞Ε͍ͯΔ
࣮ମQBDLFUFBHFS1BDLFUͳͷͰ HJUIVCDPNHPPHMFHPQBDLFUQBDLFUHP- ͔ΒίʔυΛ८ΕΔ
ͭ·Γ HPPHMFHPQBDLFUͷ͍ํ͕ Θ͔Δ
ੋඇ͓͏ͪͰಡΜͰΈ͍ͯͩ͘͞
HPPHMFHPQBDLFUͰ 5$1ύέοτΛಡΉ
5$1ύέοτͬ͘͟Γ &UIFSOFU CZUF *1ϔομ CZUF 5$1ϔομ CZUF Γ 5$1Φϓγϣϯ /CZUF
σʔλ ྫ͑)551.Z42-ͷϓϩτίϧ͔͜͜Β ελʔτ͍ͯ͠Δ
HPPHMFHPQBDLFU
HPPHMFHPQBDLFU &UIFSOFU CZUF *1ϔομ CZUF 5$1ϔομ CZUF Γ 5$1Φϓγϣϯ /CZUF
σʔλ -BZFS -BZFS*1W -BZFS5$1 -BZFS1BZMPBE
-BZFS1BZMPBE ΛಡΊ͍͍ͷͰศར tcpLayer := packet.Layer(layers.LayerTypeTCP) data := tcpLayer.LayerPayload() fmt.Printf(“%s”, hex.Dump(data))
w)551.Z42-1PTUHSF42-͔͜͜ΒCZUFͮͭ ղੳ͢Ε·ͣ0,
͜ΕͰ҆৺ͯ͠ 5$1ύέοτղੳΛ͡ΊΒΕ·͢Ͷʂ
࠷ۙΘͨ͠ 5$1ύέοτղੳΛ͡Ί·ͨ͠
(PͰ5$1ύέοτղੳΛͯ͠Έ·͠ΐ͏ʂ ίʔυʹམͱ͠ࠐΊͨΒͬͪ͜ͷͷʂ
Έͳ͞Μੋඇ 5$1ύέοτΛCZUFͮͭಡΜͰ ʮͳΜͰ͜ͷόΠτྻ͕͋ΔΜͩΑʜʯ ʮ)551ͩͱ͜Μͳ͜ͱͳ͍ͷʹʜʯ ͱϯϯ͏ͳΓ·͠ΐ͏
5IBOLZPV ࠷৽ͷ࠾༻ใΛνΣοΫˠ !QC@SFDSVJU