Slide 1

Slide 1 text

ʙय़ͩʂ౦ژͩʂʂʂ߹ίϯͩʂʂʂʂ̍̍ʙ QZBNB(.01FQBCP *OD (P$POGFSFODF4QSJOH (PMBOHͰ࡞Δ '51ϓϩΩγαʔό

Slide 2

Slide 2 text

ϗεςΟϯάࣄۀ෦νʔϑςΫχΧϧϦʔυ ࢁԼ࿨඙!QZBNB

Slide 3

Slide 3 text

-JOVYͷ౷߹Ϣʔβʔ؅ཧ 50.-ܗࣜ )551+40/ -%"1΍%#ͷ؅ཧͷӡ༻ෛՙ ѻ͍΍͍͢ϑΥʔϚοτ ൚༻ੑɾ֦ுੑ

Slide 4

Slide 4 text

ϖύϘ෱Ԭ

Slide 5

Slide 5 text

ࠓ೔࿩͢͜ͱ wࠓɺ೥य़ɺ'51͕೤͍ w'51ϓϩΩγαʔόΛ։ൃͨ͠ͱ͖ͷ5JQT

Slide 6

Slide 6 text

ͳͥࠓ'51͕೤͍ͷ͔ʁ

Slide 7

Slide 7 text

4,:4

Slide 8

Slide 8 text

4,:

Slide 9

Slide 9 text

4 ੈքతͳ , ج४Ͱ : Ϡό͍

Slide 10

Slide 10 text

4 ੈքతͳ , ج४Ͱ : Ϡό͍ 4FSWFS 4FSWJDF 4ZOD

Slide 11

Slide 11 text

4 ੈքతͳ , ج४Ͱ : Ϡό͍ 4FSWFS 4FSWJDF 4ZOD

Slide 12

Slide 12 text

Ϩϯαόͷߏ੒্ͷ՝୊ 44) '51 VTFS VTFSDPOUFOUT ෺ཧαʔό

Slide 13

Slide 13 text

Ϩϯαόͷߏ੒্ͷ՝୊ VTFSDPOUFOUT 44) '51 VTFS VTFSDPOUFOUT 44) '51 ౰ࣾϨϯλϧαʔόαʔϏε͓͍ͯ͸෺ཧαʔόʹ͓٬༷ͷίϯςϯπ͕഑ஔ͞Ε͓ͯΓɺ ෛՙঢ়گͳͲΛؑΈͯɺαʔόҠઃ͢Δࡍʹɺ͓٬༷ͷ'51΍44)ͷ઀ଓઌ͕ มΘͬͯ͠·͏ߏ੒্ͷ՝୊͕͋Δ Ҡઃ

Slide 14

Slide 14 text

44)͸طʹ044͕ଘࡏ͢Δ wIUUQTHJUIVCDPNUHTTIQJQFS wϢʔβʔ໊ϕʔεͷ44)ϓϩΩγ VTFS" VTFS# TTIQJQFS 4FSWFS" 4FSWFS# Ϣʔβʔ໊ʹԠͯ͡ɺ઀ଓઌΛมߋ

Slide 15

Slide 15 text

QGUQΛόʔϯ࡞Δ͜ͱͰطଘͷ՝୊Λղܾ wIUUQTHJUIVCDPNQZBNBQGUQ wಈత'51ϓϩΩγ VTFS" VTFS# QGUQ 4FSWFS" 4FSWFS# ೚ҙͷϛυϧ΢ΣΞΛར༻ͯ͠઀ଓઌΛมߋ "1* .JEEMFXBSF-BZFS

Slide 16

Slide 16 text

'51 'JMF5SBOTGFS1SPUPDPM wฏจςΩετͷίϚϯυૢ࡞ % ftp 127.0.0.1 2121 Connected to 127.0.0.1. 220 Welcome on ftpserver Name (127.0.0.1:yamashitakazuhiko): test 331 OK Password: 230 Password ok, continue ftp> ls 227 Entering Passive Mode (127,0,0,1,224,164) 150 Using transfer connection drw-rw-rw- 1 ftp ftp 4096 Mar 28 06:38 virtual 226 Closing transfer connection

Slide 17

Slide 17 text

QGUQ͕໨ࢦ͢ੈք QGUQ PSJHJO DMJFOU 64&3 64&3 0, 0, QGUQ͸֤ίϚϯυʹॲཧΛϑοΫͭͭ͠ɺϓϩΩγ ṖϑοΫ

Slide 18

Slide 18 text

5$1ίωΫγϣϯΛ ॲཧ͢Δ

Slide 19

Slide 19 text

OFU-JTUFOͰίωΫγϣϯΛ͏͚Δ OFU-JTUFOFS HPSPVUJOF IBOEMFS HPSPVUJOF IBOEMFS HPSPVUJOF IBOEMFS DPOO DPOO DPOO listener, _ := net.Listen(“tcp”,”127.0.0.1:21") for { connection, _ := listener.Accept() ɹ // ίωΫγϣϯΛgroutine΁ }

Slide 20

Slide 20 text

ίωΫγϣϯ͝ͱʹίϚϯυΛಡΈࠐΈॲཧ reader = bufio.NewReader(connection) line, err := reader.ReadString('\n') => line: USER test ftp> open 127.0.0.1 2121 ftp> user test CVpP3FBEFSΛར༻͢Δ͜ͱͰ ιέοτ͔Βͷಡࠐ͕ศརʹ

Slide 21

Slide 21 text

ಉ࣌઀ଓ਺؅ཧ͢Δ OFU-JTUFOFS HPSPVUJOF IBOEMFS HPSPVUJOF IBOEMFS HPSPVUJOF IBOEMFS DPOO DPOO DPOO HPSPVUJOF։࢝࣌ʹΧ΢ϯτΞοϓ͠ɺ HPSPVUJOFͷऴྃ࣌ʹΧ΢ϯτμ΢ϯ͢Δ͜ͱͰ ಉ࣌઀ଓ਺Λ؅ཧ

Slide 22

Slide 22 text

*EMFλΠϜΞ΢τΛઃ͚Δ͜ͱͰࣗಈ੾அ OFU-JTUFOFS HPSPVUJOF IBOEMFS HPSPVUJOF IBOEMFS HPSPVUJOF IBOEMFS DPOO DPOO DPOO OFU$POO4FU%FBEMJOFΛར༻͠ɺૢ࡞ͷͳ͍ΫϥΠΞϯτΛ λΠϜΞ΢τॲཧ

Slide 23

Slide 23 text

OFU$POO4FU%FBEMJOF for { connection.SetDeadline( ɹɹɹtime.Now().Add( ɹɹɹtime.Duration(time.Second.Nanoseconds() * int64(idleTimeout))) ɹ ) // 1ߦͣͭಡΉ line, err := reader.ReadString('\n') // ड͚औͬͨίϚϯυͷॲཧ } %FBEMJOF౸ୡͨ͠৔߹ɺJPUJNFPVU

Slide 24

Slide 24 text

'51ϓϩΩγ OFU-JTUFOFS HPSPVUJOF IBOEMFS HPSPVUJOF IBOEMFS HPSPVUJOF IBOEMFS DPOO DPOO DPOO PSJHJO PSJHJO PSJHJO $0.."/% $0.."/% $0.."/% $0.."/% $0.."/% $0.."/% HPSPVUJOF୯ҐͰϓϩΩγίωΫγϣϯΛுΔ

Slide 25

Slide 25 text

'51ίϚϯυΛॲཧ͢Δ

Slide 26

Slide 26 text

'51ʹ͸ଟ͘ͷίϚϯυ͕ଘࡏ w64&3ίϚϯυϨεϙϯε w'&"5ίϚϯυ/Ϩεϙϯε w1"47ίϚϯυϨεϙϯείωΫγϣϯʂʂʂ̍ ίϚϯυ͝ͱͷڍಈͷҧ͍͔ΒϓϩΩγͳͷʹ ϓϩτίϧͷཧղ͕ඞཁ

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

'51͸ίωΫγϣϯར༻͢Δ w'51͸ίϚϯυͷ΍ΓऔΓΛ͢Δ੍ޚίωΫγϣϯͱɺσʔλͷసૹ Λߦ͏సૹίωΫγϣϯͷ̎ͭΛར༻͢Δ QGUQ PSJHJO DMJFOU -*45 -*45 ίϚϯυૢ࡞Ҏ֎ΛσʔλసૹίωΫγϣϯͰߦ͏ EBUBDPOFDUJPO DPOUSPMDPOOFDUJPO pMFUYU pMFUYU

Slide 29

Slide 29 text

'51ͷσʔλసૹํࣜ͸ͭ w"DWJWFํࣜαʔό͔ΒσʔλసૹίωΫγϣϯΛுΔ w1BTTJWFํࣜΫϥΠΞϯτ͔ΒσʔλసૹίωΫγϣϯΛுΔ wͲͷϙʔτͰαʔό͕-JTUFOͯ͠Δ͔Λ1BTTJWFํࣜͷ৔߹͸ɺ1"47 ίϚϯυͰ௨஌͢Δ DMJFOU QGUQ EBUBDPOFDUJPO DMJFOU QGUQ EBUBDPOFDUJPO "DUJWFํࣜ 1BTTJWFํࣜ

Slide 30

Slide 30 text

1"47ίϚϯυ͸த਎Λॻ͖׵͑Δ &OUFSJOH1BTTJWF.PEF º QGUQ PSJHJO DMJFOU 1"47 1"47

Slide 31

Slide 31 text

σʔλίωΫγϣϯͷϓϩΩγ QGUQ PSJHJO DMJFOU σʔλίωΫγϣϯཁٻ

Slide 32

Slide 32 text

σʔλίωΫγϣϯͷϓϩΩγ QGUQ PSJHJO DMJFOU σʔλίωΫγϣϯཁٻ σʔλίωΫγϣϯཁٻ

Slide 33

Slide 33 text

σʔλίωΫγϣϯͷϓϩΩγ QGUQ PSJHJO DMJFOU σʔλίωΫγϣϯཁٻ σʔλίωΫγϣϯཁٻ 999Ͱ-JTUFO։࢝

Slide 34

Slide 34 text

σʔλίωΫγϣϯͷϓϩΩγ QGUQ PSJHJO DMJFOU σʔλίωΫγϣϯཁٻ σʔλίωΫγϣϯཁٻ 999Ͱ-JTUFO։࢝ :::Ͱ-JTUFO։࢝

Slide 35

Slide 35 text

σʔλίωΫγϣϯͷϓϩΩγ QGUQ PSJHJO DMJFOU σʔλίωΫγϣϯཁٻ σʔλίωΫγϣϯཁٻ 999Ͱ-JTUFO։࢝ :::Ͱ-JTUFO։࢝ ϑΝΠϧసૹཁٻ

Slide 36

Slide 36 text

σʔλίωΫγϣϯͷϓϩΩγ QGUQ PSJHJO DMJFOU σʔλίωΫγϣϯཁٻ σʔλίωΫγϣϯཁٻ 999Ͱ-JTUFO։࢝ :::Ͱ-JTUFO։࢝ ϑΝΠϧసૹཁٻ ϑΝΠϧసૹཁٻ

Slide 37

Slide 37 text

σʔλίωΫγϣϯͷϓϩΩγ QGUQ PSJHJO DMJFOU σʔλίωΫγϣϯཁٻ EBUBDPOFDUJPO σʔλίωΫγϣϯཁٻ 999Ͱ-JTUFO։࢝ :::Ͱ-JTUFO։࢝ 999UPQGUQ΁σʔλసૹ։࢝ ϑΝΠϧసૹཁٻ ϑΝΠϧసૹཁٻ

Slide 38

Slide 38 text

σʔλίωΫγϣϯͷϓϩΩγ QGUQ PSJHJO DMJFOU σʔλίωΫγϣϯཁٻ DMJFOU͔Βݟͨ৔߹ɺQGUQ͸αʔόɺ ΦϦδϯ͔Βݟͨ৔߹ɺQGUQ͸ΫϥΠΞϯτͷڍಈ͕ٻΊΒΕΔ EBUBDPOFDUJPO EBUBDPOFDUJPO σʔλίωΫγϣϯཁٻ 999Ͱ-JTUFO։࢝ :::Ͱ-JTUFO։࢝ :::UPDMJFOU΁σʔλసૹ։࢝ 999UPQGUQ΁σʔλసૹ։࢝ ϑΝΠϧసૹཁٻ ϑΝΠϧసૹཁٻ

Slide 39

Slide 39 text

ɹɹEPXOMPBEHPSPVUJOF func proxy() { … // ϦϨʔ༻ͷgoroutineΛىಈ eg.Go(func() error { return relay(ctx, server, client) }) eg.Go(func() error { return relay(ctx, client, server) }) // ׬ྃ·Ͱ଴ͪ߹ΘͤΔ if err := eg.Wait(); err != nil { return err } } HSPVUJOFͰϓϩΩγ PSJHJO DMJFOU ɹɹVQMPBEHPSPVUJOF QGUQ

Slide 40

Slide 40 text

ී௨ʹ΍Δͱ͏·͍͔͘ͳ͍ func relay(from, to net.Conn) error { buff := make([]byte, BUFFER_SIZE) for { select { case <-ctx.Done(): return ctx.Err() default: if err := from.Read(buff); err != nil { return errr } if err := to.Write(b); err != nil { return errr } } } } Ξοϓϩʔυɺ΋͘͠͸μ΢ϯϩʔυͷऴྃͰ ྆ํίωΫγϣϯΛऴ͍ྃͨ͠ DUY%POF Ͱ΋ऴྃ͠ͳ͍

Slide 41

Slide 41 text

ɹɹEPXOMPBEHPSPVUJOF ϑΝΠϧΞοϓϩʔυͷॲཧ PSJHJO DMJFOU ɹɹVQMPBEHPSPVUJOF QGUQ 3FBE 8SJUF 3FBE 8SJUF Ξοϓϩʔυ࣌ɺVQMPBEHSPVUJOF͸3FBE͕ൃੜ͢Δ͕ɺ EPXOMPBEHSPVUOF͸3FBE͕ൃੜ͠ͳ͍

Slide 42

Slide 42 text

3FBE͸ϒϩοΩϯά func relay(from, to net.Conn) error { buff := make([]byte, BUFFER_SIZE) for { select { case <-ctx.Done(): return ctx.Err() default: if err := from.Read(buff); err != nil { return errr } if err := to.Write(b); err != nil { return errr } } } } 3FBEͰϒϩοΩϯά͞ΕΔ͕Ώ͑ʹɺ ࣍ͷϧʔϓ΁͍͔ͳ͍

Slide 43

Slide 43 text

ϊϯϒϩοΩϯά3FBE for { select { case <-ctx.Done(): return ctx.Err() case err := <-errChan: return err // ಡࠐgoroutineΛىಈ͠ɺඇಉظͰಡΈࠐΉ case b := <-read: _, err := to.Write(b) if err != nil { return err } } } νϟϯωϧܦ༝ͰಡΈࠐΉ͜ͱʹΑΓ ϊϯϒϩοΩϯά΁

Slide 44

Slide 44 text

-FBLDPOUFYU8JUI$BODFM NBJO HPSPVUJOF HPSPVUJOF SFUVSO DUY%POF ctx, done := context.WithCancel(context.Background()) defer done() eg, ctx := errgroup.WithContext(ctx) // ϦϨʔ༻ͷgoroutineΛىಈ eg.Go(func() error { return p.relay(ctx, server, client) }) eg.Go(func() error { return p.relay(ctx, client, server }) // ׬ྃ·Ͱ଴ͪ߹ΘͤΔ if err := eg.Wait(); err != nil { return err } EPOF

Slide 45

Slide 45 text

-FBLDPOOFDUJPO$MPTF HPGVOD \ GPS\ O FSSGSPN3FBE CV⒎ JGFSSOJM\ FSS$IBOFSS SFUVSO ^ SFBECV⒎<O> ^ ^ ίωΫγϣϯΤϥʔ͕ൃੜɺ ϒϩοΫ͕ղআ͞ΕΔ for { select { case <-ctx.Done(): from.Close() case err := <-errChan: return err case b := <-read: _, err := to.Write(b) if err != nil { return err } } } ૬ํͷసૹ͕ऴΘΓ࣍ୈ ίωΫγϣϯΛ Ϋϩʔζ Τϥʔνϟϯωϧܦ༝ Ͱॲཧऴྃ

Slide 46

Slide 46 text

࣮૷ґଘ

Slide 47

Slide 47 text

ϓϩτίϧʹ͸࣮૷ґଘ͕͖ͭ΋ͷ w3'$ͷղऍͷҧ͍ʹΑΓɺඍົʹ࣮૷͕ҟͳΔ wओཁͳαʔόɺΫϥΠΞϯτͷ࠷௿ݶͷಈ࡞ςετ͸͢΂͖

Slide 48

Slide 48 text

·ͱΊ

Slide 49

Slide 49 text

4 ੈքతͳ , ج४Ͱ : ΍͹͍

Slide 50

Slide 50 text

ϓϩτίϧαʔό͸ϓϩτίϧ࣮૷ɺ 3'$Λͻͨ͢Β ಡΉͱ࡞ΕΔ

Slide 51

Slide 51 text

σʔλసૹϓϩτίϧ͸ ϊϯϒϩοΩϯά໋

Slide 52

Slide 52 text

HPSPVUJOFϦʔΫͤͪ͞ΌͩΊɺ ໿ଋͩΑʁ

Slide 53

Slide 53 text

5IBOLZPV ࠷৽ͷ࠾༻৘ใΛνΣοΫˠ !QC@SFDSVJU