Upgrade to Pro — share decks privately, control downloads, hide ads and more …

enginnerday.pdf

kobatako
September 22, 2018
33

 enginnerday.pdf

kobatako

September 22, 2018
Tweet

Transcript

  1. ErlangͰιϑτ΢ΣΞ
    ϧʔλΛ࡞ͬͯΔ࿩
    FUKUOKA Enginners Day 2018 ~Autumn~
    2018/9/22ʢ౔ʣ
    খݪɹਸ׮

    View Slide

  2. ࣗݾ঺հ
    • ໊લɿখݪɹਸ׮
    • ॴଐɿגࣜձࣾFusic
    • ڵຯ͝ͱɿωοτϫʔΫɺ

    ErlangɺElixir
    • Twitterɿ@kobatako_

    View Slide

  3. ࿩͢͜ͱ
    • ErlangͰͷ࣮૷ʹ͍ͭͯ
    • ࣮૷ͨ͠಺༰
    • ·ͱΊ

    View Slide

  4. ErlangͰͷ࣮૷ʹ͍ͭͯ

    View Slide

  5. Erlangͱ͸
    • ؔ਺ܕݴޠ
    • ߴ͍Մ༻ੑͱεέʔϥϏϦςΟΛ࣋ͭ
    • ి࿩ަ׵ػͰ࢖ΘΕͯͨ
    • ฒྻॲཧʹ޲͍ͯΔ

    View Slide

  6. ͳͥErlangͰ࣮૷ͨ͠ͷ͔

    View Slide

  7. bitstring

    View Slide

  8. bitstring
    • όΠτྻʹରͯ͠Ϗοτ୯ҐͰΞΫηεɺૢ
    ࡞͢Δ͜ͱ͕Ͱ͖Δ
    % bitstring
    <<69,16,0,60,227,255,64,0,63,6,255,108,172,31,0,2,172,17,0,13,198,22,31,64,
    73,33,85,221,0,0,0,0,160,2,114,16,88,110,0,0,2,4,5,180,4,2,8,10,8,17,182,34
    ,0,0,0,0,1,3,3,7>>
    % Ϗοτ୯ҐͰม਺ʹଋറ͢Δ
    <> = Buf,
    % Ϗοτ୯ҐͰ֤ม਺ΛbitstringͷҰ෦ͱͯ͠ม਺ʹଋറ͢Δ
    SendData = <16, Flg:3, Offset:13, CountTTL, Protocol, SourceIp:32, DestIp:32>>,

    View Slide

  9. ύλʔϯϚον

    View Slide

  10. ύλʔϯϚον
    • ӈลΛධՁ͠ɺࠨลͱҰக͍ͯ͠Δ͔Λௐ΂Δ
    1> N = 9. % NΛ9Ͱଋറ
    9
    2> N.
    9
    3> N = 0. % ӈลͱࠨล͕౳͘͠ແ͍ͨΊΤϥʔ
    ** exception error: no match of right hand side value 0
    4> 9 = N. % ӈลͱࠨล͕౳͍ͨ͠Ίਖ਼ৗ
    9
    5> {N, M} = {9, 0}. % ӈลͷ9ͱࠨลͷN͕౳͍ͨ͠ΊMʹ0Λଋറͤ͞Δ
    {9,0}
    6> {N, L} = {0, 8}. % ӈลͷ9ͱࠨลͷN͕౳͘͠ແ͍ͨΊΤϥʔ
    ** exception error: no match of right hand side value {0,8}

    View Slide

  11. ύλʔϯϚον
    • ؔ਺ͷҾ਺ͱͯ͠΋ѻ͑Δ
    • ઌ಄͔ΒॱʹධՁ͍͖ͯ͠ɺҰ൪࠷ॳʹϚονͨؔ͠਺Λ࣮ߦ͢Δ
    handle_event(Buf, Fd) ->
    <<_:48, SourceMacAddr:48, Type:16, Data/bitstring>> = Buf,
    ɾɾɾ
    ethernet_type(Type, Data);
    ɾɾɾ
    % IP Protocol
    ethernet_type(16#0800, Data) -> % Type͕16ਐ਺Ͱ0800ͷ৔߹ʹݺ͹ΕΔؔ਺
    ip:packet(Data);
    % ARP Protocol
    ethernet_type(16#0806, Data) -> % Type͕16ਐ਺Ͱ0806ͷ৔߹ʹݺ͹ΕΔؔ਺
    arp:packet(Data);
    ethernet_type(_Type, _Data) -> % _͸શͯʹϚον͢Δม਺ʹͳΔͷͰɺશͯʹϚον͢Δ
    false;

    View Slide

  12. ύλʔϯϚον
    • bitstringΛҾ਺ͱͯ͠౉͠ɺύλʔϯϚονͰ࣮ߦ͢
    Δؔ਺Λม͑Δ
    % IP check sump
    % ୈҰҾ਺͕͔ΒͷbitstringʹͳͬͨΒ஋Λฦ͢
    checksum(<<>>, Sum) ->
    Sum bxor 16#FFFF;
    % ୈҰҾ਺͕16bitҎ্͋Δͱ͖
    checksum(<>, Sum) ->
    Check = A + Sum,
    Res = (Check band 16#FFFF) + (Check bsr 16),
    checksum(Other, Res).

    View Slide

  13. ·ͩ·ͩڧྗͳػೳ͕͍ͬͺ
    ͍͋Γ·͢!!!
    http://erlang.org/doc/reference_manual/
    introduction.html

    View Slide

  14. ࣮૷ͨ͠಺༰

    View Slide

  15. ࣮૷ͨ͠಺༰
    • ARP ςʔϒϧ
    • ϧʔςΟϯάςʔϒϧ
    • ϧʔςΟϯά

    View Slide

  16. ARP ςʔϒϧ

    View Slide

  17. ARP ςʔϒϧ
    • ARPͷϦΫΤετͱϦϓϥΠͷ৘ใΛอଘ͠
    ͓ͯ͘
    • ૹΓઌͷIPΞυϨεͱMacΞυϨεΛඥ͚ͮ
    Δ

    View Slide

  18. ARP ςʔϒϧͷ৘ใ
    % source_ip_addrɿࣗ෼ͷΠϯλʔϑΣΠεͷIPΞυϨε
    % dest_ip_addrɿ૬खઌͷIPΞυϨε
    % dest_mac_addrɿ૬खઌͷMacΞυϨε
    % typeɿΠϯλʔϑΣΠεͷλΠϓ
    -record(arp_table, {
    source_ip_addr,
    dest_ip_addr,
    dest_mac_addr,
    type
    }).

    View Slide

  19. ϧʔςΟϯάςʔϒϧ

    View Slide

  20. ϧʔςΟϯάςʔϒϧ
    • ύέοτͷૹ৴ઌͱͳΔܦ࿏৘ใ
    • ૹ৴͢Δࡍͷ༏ઌ౓΍Ͳ͏͍ͬͨํ๏Ͱܦ࿏
    ৘ใΛऔಘ͔ͨ͠ͳͲ͕ه࿥͞Ε͍ͯΔ

    View Slide

  21. % source_routeɿͲ͔͜Βܦ࿏৘ใΛऔಘ͔ͨ͠
    % dest_routeɿͲ͜ʹૹΔࡍͷܦ࿏৘ใͳͷ͔ʢྫɿ{192.168.100.0}ʣ
    % dest_route_intɿdest_routeΛ਺ྻʹͨ͠΋ͷɻϩϯήετϚονͰ࢖͏
    % subnetmaskɿdest_routeͷαϒωοτϚεΫʢྫɿ{255, 255, 255, 0}ʣ
    % subnetmask_intɿsubnetmaskΛ਺ྻʹͨ͠΋ͷɻϩϯήετϚονʹ࢖͏
    -record(routing_table, {
    source_route,
    dest_route,
    dest_route_int,
    subnetmask,
    subnetmask_int,
    ad,
    metric,
    nexthop,
    age,
    out_interface
    }).
    ϧʔςΟϯάςʔϒϧͷ৘ใ

    View Slide

  22. % adɿΞυϛχετϨʔςΟϒσΟελϯε஋
    % metricɿܦ࿏৘ใͷϝτϦοΫ஋
    % nexthopɿdest_routeʹૹΔͨΊ࣍ʹૹ৴͢ΔϧʔλͷIPΞυϨε
    % ageɿܦ࿏৘ใΛऔಘ͔ͯ͠ΒͲΕ͙Β͍ܦա͔ͨ͠
    % out_interfaceɿͲͷΠϯλʔϑΣΠεͷܦ࿏৘ใͳͷ͔
    -record(routing_table, {
    source_route,
    dest_route,
    dest_route_int,
    subnetmask,
    subnetmask_int,
    ad,
    metric,
    nexthop,
    age,
    out_interface
    }).
    ϧʔςΟϯάςʔϒϧͷ৘ใ

    View Slide

  23. ϧʔςΟϯάςʔϒϧͷAD஋
    σϑΥϧτͷ"%஋
    ઀ଓ͞Ε͍ͯΔΠϯλʔϑΣΠε
    ελςΟοΫϧʔςΟϯά
    αϚϦʔϧʔτ
    ֎෦#(1
    ಺෦&*(31
    *(31
    041'
    *4*4
    3*1
    &(1
    003
    ֎෦&*(31
    ಺෦#(1
    ෆ໌
    Ciscoαϙʔτର৅ϓϩτίϧͷAD஋

    View Slide

  24. ϧʔςΟϯά

    View Slide

  25. ϧʔςΟϯά
    • ϧʔςΟϯάςʔϒϧΛجʹૹ৴ઌʹ޲͚ͯ
    Ͳͷܦ࿏ͰૹΔ͔Λܾఆ͢Δ
    • ෳ਺ͷܦ࿏͕͋Δ৔߹͸࠷దͳܦ࿏͔ΒૹΔ
    Α͏ʹ͢Δ
    A
    B
    C D
    E

    View Slide

  26. ϧʔςΟϯάͷܦ࿏બ୒
    • ܦ࿏બ୒ͷ༏ઌ౓
    • ϩϯήετϚον
    • AD஋
    • ϝτϦοΫ

    View Slide

  27. ϧʔςΟϯάͷܦ࿏બ୒
    • ϩϯήετϚον
    • ૹ৴ઌͱͳΔIPͱdest_route͕Ұ൪౳͘͠
    ͳ͍ͬͯΔ΋ͷΛ༏ઌ͢Δ
    ૹ৴ઌɿ
    ܦ࿏৘ใᶃɿEFTU@SPVUFTVCOFUNBTL
    ·Ͱ͸౳͍͠ܦ࿏৘ใ
    ܦ࿏৘ใᶄɿEFTU@SPVUFTVCOFUNBTL
    ·Ͱ͕౳͍͠ܦ࿏৘ใ
    ᶄ͕༏ઌ͞ΕΔ

    View Slide

  28. ϧʔςΟϯάͷܦ࿏બ୒
    • AD஋
    • ܦ࿏৘ใͷऔಘํ๏͝ͱ
    • ϝτϦοΫ
    • औಘํ๏͝ͱͷ༏ઌ౓ʢRIPͰ͸ϗοϓ਺ɺ
    OSPFͰ͸ίετʣ

    View Slide

  29. ϧʔςΟϯάͷྲྀΕ
    1. ૹ৴ઌͷnexthopΛϧʔςΟϯάςʔϒϧ͔Βऔಘ
    2. nexthopͷMacΞυϨεΛARPςʔϒϧʹཁٻ
    3. ʢARPςʔϒϧʹແ͍৔߹ʣARPϦΫΤετΛૹΓɺARPςʔϒϧΛߋ৽͢Δ
    4. ʢIPϓϩτίϧͷ৔߹ʣTTLΛҰͭݮΒ͠ɺνΣοΫαϜΛ࠶ܭࢉ
    5. ARPςʔϒϧ͔Βऔಘͨ͠MacΞυϨεΛ࣍ͷૹ৴ઌMacΞυϨεͱͯ͠Ѽઌ
    MacΞυϨεʹೖΕΔ
    6. ૹ৴ݩͷMacΞυϨεΛࣗ਎ͷΠϯλʔϑΣΠεͷMacΞυϨεʹஔ͖׵͑Δ
    7. ૹ৴

    View Slide

  30. ͜͜·Ͱ࣮૷͢Ε͹ͻͱ·ͣ
    ping͕௨Δ

    View Slide

  31. ݱࡏͷ՝୊

    View Slide

  32. ݱࡏͷ՝୊
    • L3·Ͱͷύέοτ͸ૹ৴Ͱ͖Δ͕L4Ҏ্ʹͳ
    ΔͱϨεϙϯε͕ฦͬͯ͜ͳ͘ͳΔ
    • ελςΟοΫϧʔςΟϯάͷ࣮૷
    • μΠφϛοΫϧʔςΟϯάͷ࣮૷
    • ICMPͷ࣮૷

    View Slide

  33. ΍Βͳͱ͍͚ͳ͍͜ͱ͕·ͩ
    ·ͩ͋Δ

    View Slide

  34. ࠓޙ࣮૷͍ͨ͠΋ͷ

    View Slide

  35. ࠓޙ࣮૷͍ͨ͠΋ͷ
    • ύΠϓϥΠϯॲཧ
    • Firewall
    • Load Balancer
    • ΧΦεϞϯΩʔ

    View Slide

  36. ·ͱΊ

    View Slide

  37. ·ͱΊ
    • ࣮ߦ଎౓͕·ͩ·ͩ஗͍ͷͰվળ͍͖͍ͯͨ͠
    ʢpingͰ1msҎ্͔͔Δʣ
    • ωοτϫʔΫͷ஌͕ࣝਂ·ͬͯΔʢؾ͕͢Δʣ
    • ύέοτ͕ʢงғؾʣಡΊΔΑ͏ʹͳ͖ͬͯͨ
    • ໨grepྗ͕ߴ·Δʢ໨͕ർΕΔʣ

    View Slide

  38. ·ͱΊ
    • όάͬͯΔ࣌͸͜ΜͳͷͱʹΒΊͬ͜Ͱ͢















    View Slide

  39. Έͳ͞Μ΋

    ιϑτ΢ΣΞϧʔλ

    ࡞ͬͯΈͯ͸Ͳ͏Ͱ͔͢

    View Slide

  40. ͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠

    View Slide