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.7k
Design and implementation of "Markdown to Google Slides" / phpconfuk 2025
k1low
1
1k
analysis パッケージの仕組みの上でMulti linter with configを実現する / Go Conference 2025
k1low
1
840
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.4k
Parsing HCL/CUE / Fukuoka.go #21
k1low
0
11k
実践 net/http Middleware パターン / Kizuku.go Vol.1
k1low
2
470
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
도구에서 동료까지: 10년차 AI 스타트업의 AI 적응기
inureyes
PRO
1
330
あなたの知らないバージョン命名規則
sat
PRO
2
110
Invisible to AI? Making TYPO3 Sites Quotable by AI Search Systems
wolfgangwagner
0
240
長期運営で肥大化したExcelマスターデータの解消に向けた移行事例
gree_tech
PRO
0
100
【Aiming】共通基盤なのに「共通化しない」課金・認証基盤「LINK」が選び取ったシングルテナント戦略と運用の秘訣
saikeda
0
140
SmartHR Engineering Team Deck
smarthr
1
3.4k
Genie Codeハンズオン応用編
taka_aki
0
140
生成 AI の基礎 〜 サンプル実装で学ぶ基本原理
enakai00
7
4.6k
属人化を叩き割れ!「制作加速」と「安定化」の矛盾を打破する:8年目プロダクトが辿り着いた「ミスが起こり得ない」アセット制作フローの全貌
gree_tech
PRO
0
120
dbt in Microsoft Fabric
ryomaru0825
0
120
トークンマネジメントでAIにとって働きやすい環境を実現する
hikaruegashira
0
140
Kiro Crew で始める マルチエージェント開発
miu_crescent
PRO
0
160
Featured
See All Featured
A better future with KSS
kneath
240
18k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
350
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.8k
Optimizing for Happiness
mojombo
378
71k
Prompt Engineering for Job Search
mfonobong
0
410
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
660
sira's awesome portfolio website redesign presentation
elsirapls
0
340
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
900
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Paper Plane (Part 1)
katiecoart
PRO
1
10k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
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