Share
Embed
Transcript
84 slides
-
ࣗݾհ • ໊લ : খݪ ਸʢ͜Δ ͔ͨͻΖʣ • ॴଐ :
גࣜձࣾFusic • ࣄ : PHPɺGolangɺAWS • झຯ : ElixirɺErlangɺΠϯϑϥ͍Ζ͍Ζ • Twitter : kobatako_ -
ϧʔςΟϯάʹؔ͢Δͷ • ϧʔςΟϯάςʔϒϧ • ϧʔτใ͕อଘ͞Ε͍ͯΔςʔϒϧ • ελςΟοΫϧʔςΟϯά • ཧऀ͕ઃఆͨ͠ϧʔτใ •
μΠφϛοΫϧʔςΟϯά • ϧʔςΟϯάϓϩτίϧ͔Βऔಘͨ͠ϧʔτใ -
ϧʔςΟϯάʹؔ͢Δͷ • ϧʔςΟϯάςʔϒϧͷྫ ใݯ Ѽઌϧʔτ αϒωοτϚεΫ AD ϝτϦοΫ ωΫετϗοϓ ग़ྗIF
C 192.168.0.0 255.255.255.0 0 0 - Eth0 C 192.168.10.0 255.255.255.0 0 0 - Eth1 S 192.168.30.0 255.255.255.0 1 0 192.168.10.1 Eth1 R 192.168.40.0 255.255.255.0 120 1 192.168.0.1 Eth0 R 192.168.40.0 255.255.255.0 120 4 192.168.10.1 Eth1 -
ॲཧϑϩʔ ύέοτͷड৴ -͕*1͔֬ೝ νΣοΫαϜͷ֬ೝ 55-Λ 55-͕͔Ͳ͏͔֬ೝ νΣοΫαϜͷ࠶ܭࢉ ωΫετϗοϓͷ."$ ΞυϨεͷऔಘ -ͷϔομʔΛ࡞
ύέοτΛૹ৴ -ͷॲཧ ※ϧʔςΟϯάॲཧΛఆ ϧʔςΟϯάςʔϒϧ ͔ΒϧʔτใΛऔಘ -
ॲཧϑϩʔ ύέοτͷड৴ -͕*1͔֬ೝ νΣοΫαϜͷ֬ೝ 55-Λ 55-͕͔Ͳ͏͔֬ೝ νΣοΫαϜͷ࠶ܭࢉ ωΫετϗοϓͷ."$ ΞυϨεͷऔಘ -ͷϔομʔΛ࡞
ύέοτΛૹ৴ -ͷॲཧ ※ϧʔςΟϯάॲཧΛఆ ϧʔςΟϯάςʔϒϧ ͔ΒϧʔτใΛऔಘ -
ܾΊΔͱ͖ͷ༏ઌॱ • ϩϯήετϚονͷྫ • ૹ৴ઌ͕192.168.10.1ʹରͯ͠ϧʔςΟϯάςʔϒϧ͕ Լهͷ߹ • ѼઌωοτϫʔΫ : 192.168.0.0/16
• ѼઌωοτϫʔΫ : 192.168.10.0/24 -> 192.168.10.0ͷѼઌϧʔτΛ࣋ͭϧʔτใ͕ ࢀর͞ΕΔ ใݯ Ѽઌϧʔτ αϒωοτϚεΫ AD ϝτϦοΫ ωΫετϗοϓ ग़ྗIF S 192.168.0.0 255.255.0.0 1 0 192.168.0.1 Eth0 R 192.168.10.0 255.255.255.0 120 0 192.168.10.1 Eth1 -
ܾΊΔͱ͖ͷ༏ઌॱ • ྫɿCiscoػثʹ͓͚ΔσϑΥϧτͷAD ߴ ใݯ σϑΥϧτͷAD ଓ͞Ε͍ͯΔΠϯλʔϑΣΠε 0 ελςΟοΫϧʔςΟϯά
1 αϚϦʔϧʔτ 5 ֎෦BGP 20 IGRP 100 OSPF 110 RIP 120 EGP 140 ෦BGP 200 ෆ໌ 255 -
ใݯ Ѽઌϧʔτ αϒωοτϚεΫ AD ϝτϦοΫ ωΫετϗοϓ ग़ྗIF C 192.168.0.0 255.255.255.0
0 0 - Eth0 C 192.168.10.0 255.255.255.0 0 0 - Eth1 S 192.168.30.0 255.255.255.0 1 0 192.168.10.1 Eth1 R 192.168.40.0 255.255.255.0 120 1 192.168.0.1 Eth0 R 192.168.40.0 255.255.255.0 120 4 192.168.10.1 Eth1 ܾΊΔͱ͖ͷ༏ઌॱ 1. ϩϯήετϚον -
ใݯ Ѽઌϧʔτ αϒωοτϚεΫ AD ϝτϦοΫ ωΫετϗοϓ ग़ྗIF C 192.168.0.0 255.255.255.0
0 0 - Eth0 C 192.168.10.0 255.255.255.0 0 0 - Eth1 S 192.168.30.0 255.255.255.0 1 0 192.168.10.1 Eth1 R 192.168.40.0 255.255.255.0 120 1 192.168.0.1 Eth0 R 192.168.40.0 255.255.255.0 120 4 192.168.10.1 Eth1 ܾΊΔͱ͖ͷ༏ઌॱ 2. ADΛൺֱ -
ใݯ Ѽઌϧʔτ αϒωοτϚεΫ AD ϝτϦοΫ ωΫετϗοϓ ग़ྗIF C 192.168.0.0 255.255.255.0
0 0 - Eth0 C 192.168.10.0 255.255.255.0 0 0 - Eth1 S 192.168.30.0 255.255.255.0 1 0 192.168.10.1 Eth1 R 192.168.40.0 255.255.255.0 120 1 192.168.0.1 Eth0 R 192.168.40.0 255.255.255.0 120 4 192.168.10.1 Eth1 ܾΊΔͱ͖ͷ༏ઌॱ 3. ϝτϦοΫͷൺֱ -
ϧʔςΟϯάॲཧ • ྫɿύέοτͷૹ৴ઌ͕192.168.10.1ͷ߹ʹ ɹɹͯ·Δϧʔτใ Ѽઌϧʔτ αϒωοτϚεΫ ݁Ռ 192.168.0.0 255.255.0.0 ͯ·Δ
192.168.10.0 255.255.255.0 ͯ·Δ 192.168.20.0 255.255.255.0 ͯ·Βͳ͍ -
ϧʔςΟϯάॲཧ ૹ৴ઌIP͕ϧʔςΟϯάςʔϒϧͷѼઌϧʔτʹ ͯ·ͬͯΔͷͷϦετΛऔಘ % ୈҰҾ : ϧʔςΟϯάςʔϒϧͷશϦετʢarrayʣ % ୈೋҾ :
ѼઌͷIPʢintegerʣ % ୈࡾҾ : ૹ৴ઌީิʢѼઌͱஅ͞Εͨʣͷϧʔτใʢarrayʣ match_dest_ip([], _, List) -> List; match_dest_ip([{_, _, _, Ip, _, Subnetmask, Ad, Metric, Nexthop, _, If}| Tail], DestIp, List) when is_integer(DestIp) -> case DestIp band Subnetmask of Ip -> match_dest_ip(Tail, DestIp, [{If, Nexthop, Subnetmask, Ad, Metric}|List]); _ -> match_dest_ip(Tail, DestIp, List) end. -
ϧʔςΟϯάॲཧ % ୈҰҾ : ϧʔςΟϯάςʔϒϧͷશϦετʢarrayʣ % ୈೋҾ : ѼઌͷIPʢintegerʣ %
ୈࡾҾ : ૹ৴ઌީิʢѼઌͱஅ͞Εͨʣͷϧʔτใʢarrayʣ match_dest_ip([], _, List) -> List; match_dest_ip([{_, _, _, Ip, _, Subnetmask, Ad, Metric, Nexthop, _, If}| Tail], DestIp, List) when is_integer(DestIp) -> case DestIp band Subnetmask of Ip -> match_dest_ip(Tail, DestIp, [{If, Nexthop, Subnetmask, Ad, Metric}|List]); _ -> match_dest_ip(Tail, DestIp, List) end. 1. ѼઌIPͱαϒωοτϚεΫͷandॲཧ ૹ৴ઌIP͕ϧʔςΟϯάςʔϒϧͷѼઌϧʔτʹ ͯ·ͬͯΔͷͷϦετΛऔಘ -
ϧʔςΟϯάॲཧ % ୈҰҾ : ϧʔςΟϯάςʔϒϧͷશϦετʢarrayʣ % ୈೋҾ : ѼઌͷIPʢintegerʣ %
ୈࡾҾ : ૹ৴ઌީิʢѼઌͱஅ͞Εͨʣͷϧʔτใʢarrayʣ match_dest_ip([], _, List) -> List; match_dest_ip([{_, _, _, Ip, _, Subnetmask, Ad, Metric, Nexthop, _, If}| Tail], DestIp, List) when is_integer(DestIp) -> case DestIp band Subnetmask of Ip -> match_dest_ip(Tail, DestIp, [{If, Nexthop, Subnetmask, Ad, Metric}|List]); _ -> match_dest_ip(Tail, DestIp, List) end. 2. 1ͷ݁ՌͱIp͕͍͔͠Ͳ͏͔ ૹ৴ઌIP͕ϧʔςΟϯάςʔϒϧͷѼઌϧʔτʹ ͯ·ͬͯΔͷͷϦετΛऔಘ -
ϧʔςΟϯάॲཧ • ѼઌͱͳΔϧʔτใΛ࠶ؼॲཧʹͯऔಘɺͦͷ࣌ͷ༏ઌ 1. ૹ৴ઌIP͕ܨ͕͍ͬͯΔωοτϫʔΫʹؚ·Ε͍ͯΔͷ 2. αϒωοτϚεΫʢϓϨϑΟοΫεʣ͕Ұ൪͍ͷ 3. αϒωοτϚεΫ͕͘͠ AD͕খ͍͞ͷ
4. αϒωοτϚεΫɺAD͕͘͠ɺϝτϦοΫ͕খ͍͞ͷ -
ϧʔςΟϯάॲཧ ѼઌIP͕ܨ͕͍ͬͯΔωοτϫʔΫʹؚ·Ε͍ͯΔͷ ϧʔτใͷѼઌ͕ʮNEXTHOP_DIRECTʯͷ߹ܨ͕͍ͬͯΔωοτϫʔΫʹ ଐ͍ͯ͠Δʢใݯ͕ʮCʯͷͷʣ AD͕0ͷ߹ܨ͕͍ͬͯΔωοτϫʔΫʹଐ͍ͯ͠Δʢใݯ͕ʮCʯͷͷʣ %% fetch to destination route
% ୈҰҾ : ϧʔτใʢarrayʣ % ୈೋҾ : ݱࡏͷҰ൪༏ઌ͕ߴ͍ϧʔτใ fetch_dest_route([{_, ?NEXTHOP_DIRECT, _, _, _}=Route| _], _) -> Route; % ad 0 fetch_dest_route([{_, _, _, 0, _}=Route| _], _) -> Route; ܨ͕͍ͬͯΔωοτϫʔΫ -
ϧʔςΟϯάॲཧ ݱࡏͷϧʔτใΑΓαϒωοτϚεΫ͕͍ϧʔτใ͕ ͋Δ߹ɺҰ൪༏ઌ͕ߴ͍ͷͱ͢Δ %% fetch to destination route % ୈҰҾ
: ϧʔτใʢarrayʣ % ୈೋҾ : ݱࡏͷҰ൪༏ઌ͕ߴ͍ϧʔτใ fetch_dest_route([{_, _, Subnet, _, _}=Route| Tail],{_, _, NowSubnet, _, _}) when Subnet > NowSubnet -> fetch_dest_route(Tail, Route); αϒωοτϚεΫͷൺֱ -
ϧʔςΟϯάॲཧ ݱࡏͷϧʔτใͱൺֱ͠αϒωοτϚεΫ͕͘͠ AD͕খ͍͞߹Ұ൪༏ઌ͕ߴ͍ͷͱ͢Δ %% fetch to destination route % ୈҰҾ
: ϧʔτใʢarrayʣ % ୈೋҾ : ݱࡏͷҰ൪༏ઌ͕ߴ͍ϧʔτใ fetch_dest_route([{_, _, Subnet, Ad, _}=Route| Tail], {_, _, Subnet, NowAd, _}) when Ad < NowAd -> fetch_dest_route(Tail, Route); ADΛൺֱ -
ϧʔςΟϯάॲཧ ݱࡏͷϧʔτใͱൺֱ͠αϒωοτϚεΫͱAD͕͘͠ ϝτϦοΫ͕খ͍͞߹Ұ൪༏ઌ͕ߴ͍ͷͱ͢Δ %% fetch to destination route % ୈҰҾ
: ϧʔτใʢarrayʣ % ୈೋҾ : ݱࡏͷҰ൪༏ઌ͕ߴ͍ϧʔτใ fetch_dest_route([{_, _, Subnet, Ad, Metric}=Route| Tail],{_, _, Subnet, Ad, NowMetric}) when Metric < NowMetric -> fetch_dest_route(Tail, Route); ϝτϦοΫΛൺֱ -
ϧʔςΟϯάॲཧ ARPςʔϒϧ͔ΒωΫετϗοϓͷIPʹඥͮ͘ɺMACΞυϨεΛ औಘ͢Δ get_mac_addr({_, Nexthop}) -> % ARPςʔϒϧ͔ΒωΫετϗοϓʹඥͮ͘MACΞυϨεΛऔಘ case brook_arp_table:fetch_dest_mac_addr(Nexthop,
false) of % ଘࡏͯ͠ͳ͍߹ɺʮundefinedʯΛฦ͢ [] -> undefined; % ଘࡏͯ͠Δ߹ɺMACΞυϨεΛฦ͢ [{arp_table, _, _, DestMac, _}| _] -> DestMac end. -
ϧʔςΟϯάॲཧ L2ϔομʔͷૹ৴ઌMACΞυϨεΛωΫετϗοϓɺ ૹ৴ݩMACΞυϨεΛࣗࣗʢΠϯλʔϑΣΠεʣͱ ॻ͖͑Δ ip_request(FD, #{source_mac := SourceMac, dest_mac :=
DestMac}=Opt, Data) -> Ethernet = ethernet_to_binary(#ethernet_header{ source_mac_addr=tuple_to_list(SourceMac), dest_mac_addr=DestMac, type=?TYPE_IP} ), request(FD, <<Ethernet/bitstring, Data/bitstring>>, Opt) L2ͷύέοτϔομʔΛ࡞ -
Pipelineॲཧͷॴ ύέοτͷड৴ -͕*1͔֬ೝ νΣοΫαϜͷ֬ೝ 55-Λ 55-͕͔Ͳ͏͔֬ೝ νΣοΫαϜͷ࠶ܭࢉ ωΫετϗοϓͷ."$ ΞυϨεͷऔಘ -ͷϔομʔΛ࡞
ύέοτΛૹ৴ -ͷॲཧ ϧʔςΟϯάςʔϒϧ ͔ΒϧʔτใΛऔಘ -
FirewallϞδϡʔϧ ύέοτͷड৴ -͕*1͔֬ೝ νΣοΫαϜͷ֬ೝ 55-Λ 55-͕͔Ͳ͏͔֬ೝ νΣοΫαϜͷ࠶ܭࢉ ωΫετϗοϓͷ."$ ΞυϨεͷऔಘ -ͷϔομʔΛ࡞
ύέοτΛૹ৴ -ͷॲཧ ϧʔςΟϯάςʔϒϧ ͔ΒϧʔτใΛऔಘ ͜͜ʹFirewallͷॲཧΛPipelineͱͯ͠Ճ͢Δ -
FirewallϞδϡʔϧ • ४උɿErlangଆͰPipelineॲཧΛ࣮ߦͰ͖ΔΑ͏ʹ͢Δ save_before_ip_pipeline(Func) when is_function(Func, 2) -> mnesia:transaction(fun() ->
mnesia:write(pipeline, #pipeline{type=?BEFORE_IP, module=undefined, func=Func}, write) end) before_ip_pipeline(Data, Opt) -> Filter = mnesia:dirty_match_object(pipeline, {'_', ?BEFORE_IP, '$1', '$2'} ), pipeline(Filter, Data, Opt) pipeline([#pipeline{module=undefined, func=Func}| Tail], Data0, Opt0) -> case apply(Func, [Data0, Opt0]) of {error, Msg} -> {error, Msg}; {ok, Data, Opt} -> pipeline(Tail, Data, Opt) end; -
FirewallϞδϡʔϧ • ४උɿErlangଆͰPipelineॲཧΛ࣮ߦͰ͖ΔΑ͏ʹ͢Δ save_before_ip_pipeline(Func) when is_function(Func, 2) -> mnesia:transaction(fun() ->
mnesia:write(pipeline, #pipeline{type=?BEFORE_IP, module=undefined, func=Func}, write) end) before_ip_pipeline(Data, Opt) -> Filter = mnesia:dirty_match_object(pipeline, {'_', ?BEFORE_IP, '$1', '$2'} ), pipeline(Filter, Data, Opt) pipeline([#pipeline{module=undefined, func=Func}| Tail], Data0, Opt0) -> case apply(Func, [Data0, Opt0]) of {error, Msg} -> {error, Msg}; {ok, Data, Opt} -> pipeline(Tail, Data, Opt) end; PipelineʹॲཧΛొ -
FirewallϞδϡʔϧ • ४උɿErlangଆͰPipelineॲཧΛ࣮ߦͰ͖ΔΑ͏ʹ͢Δ save_before_ip_pipeline(Func) when is_function(Func, 2) -> mnesia:transaction(fun() ->
mnesia:write(pipeline, #pipeline{type=?BEFORE_IP, module=undefined, func=Func}, write) end) before_ip_pipeline(Data, Opt) -> Filter = mnesia:dirty_match_object(pipeline, {'_', ?BEFORE_IP, '$1', '$2'} ), pipeline(Filter, Data, Opt) pipeline([#pipeline{module=undefined, func=Func}| Tail], Data0, Opt0) -> case apply(Func, [Data0, Opt0]) of {error, Msg} -> {error, Msg}; {ok, Data, Opt} -> pipeline(Tail, Data, Opt) end; Pipelineͷ࣮ߦ -
FirewallϞδϡʔϧ • ४උɿErlangଆͰPipelineॲཧΛ࣮ߦͰ͖ΔΑ͏ʹ͢Δ save_before_ip_pipeline(Func) when is_function(Func, 2) -> mnesia:transaction(fun() ->
mnesia:write(pipeline, #pipeline{type=?BEFORE_IP, module=undefined, func=Func}, write) end) before_ip_pipeline(Data, Opt) -> Filter = mnesia:dirty_match_object(pipeline, {'_', ?BEFORE_IP, '$1', '$2'} ), pipeline(Filter, Data, Opt) pipeline([#pipeline{module=undefined, func=Func}| Tail], Data0, Opt0) -> case apply(Func, [Data0, Opt0]) of {error, Msg} -> {error, Msg}; {ok, Data, Opt} -> pipeline(Tail, Data, Opt) end; Pipelineʹొͨ͠ॲཧΛ࣮ߦ͍ͯ͘͠ -
FirewallϞδϡʔϧ • ४උɿErlangଆͰPipelineॲཧΛ࣮ߦͰ͖ΔΑ͏ʹ͢Δ save_before_ip_pipeline(Func) when is_function(Func, 2) -> mnesia:transaction(fun() ->
mnesia:write(pipeline, #pipeline{type=?BEFORE_IP, module=undefined, func=Func}, write) end) before_ip_pipeline(Data, Opt) -> Filter = mnesia:dirty_match_object(pipeline, {'_', ?BEFORE_IP, '$1', '$2'} ), pipeline(Filter, Data, Opt) pipeline([#pipeline{module=undefined, func=Func}| Tail], Data0, Opt0) -> case apply(Func, [Data0, Opt0]) of {error, Msg} -> {error, Msg}; {ok, Data, Opt} -> pipeline(Tail, Data, Opt) end; FuncʢϝιουʣΛ [Data0, Opt0] ͷҾͰ࣮ߦ͢Δ -
FirewallϞδϡʔϧ • ४උɿErlangଆͰPipelineॲཧΛ࣮ߦͰ͖ΔΑ͏ʹ͢Δ save_before_ip_pipeline(Func) when is_function(Func, 2) -> mnesia:transaction(fun() ->
mnesia:write(pipeline, #pipeline{type=?BEFORE_IP, module=undefined, func=Func}, write) end) before_ip_pipeline(Data, Opt) -> Filter = mnesia:dirty_match_object(pipeline, {'_', ?BEFORE_IP, '$1', '$2'} ), pipeline(Filter, Data, Opt) pipeline([#pipeline{module=undefined, func=Func}| Tail], Data0, Opt0) -> case apply(Func, [Data0, Opt0]) of {error, Msg} -> {error, Msg}; {ok, Data, Opt} -> pipeline(Tail, Data, Opt) end; Τϥʔͷ߹ΤϥʔͱͳΓɺύέοτͷ ϧʔςΟϯάΛߦΘͳ͍ ਖ਼ৗͷ߹ɺ࣍ͷPipelineॲཧΛ࣮ߦ -
FirewallϞδϡʔϧ • Firewallͷ݅ΛϝλϓϩάϥϜͰ࣮ firewall :default do allow( source_ip: {192, 168,
20, 0}, source_netmask: {255, 255, 255, 0}, protocol: :ip ) allow( source_ip: {192, 168, 40, 0}, source_netmask: {255, 255, 255, 0}, protocol: :tcp ) deny() end -
FirewallϞδϡʔϧ • Firewallͷ݅ΛϝλϓϩάϥϜͰ࣮ firewall :default do allow( source_ip: {192, 168,
20, 0}, source_netmask: {255, 255, 255, 0}, protocol: :ip ) allow( source_ip: {192, 168, 40, 0}, source_netmask: {255, 255, 255, 0}, protocol: :tcp ) deny() end ڐՄ͢Δύέοτใ ʢૹ৴ݩIPͱ͔ϓϩτίϧͱ͔ʣ -
FirewallϞδϡʔϧ • Firewallͷ݅ΛϝλϓϩάϥϜͰ࣮ firewall :default do allow( source_ip: {192, 168,
20, 0}, source_netmask: {255, 255, 255, 0}, protocol: :ip ) allow( source_ip: {192, 168, 40, 0}, source_netmask: {255, 255, 255, 0}, protocol: :tcp ) deny() end શͯͷύέοτΛڋ൱͢Δ -
FirewallϞδϡʔϧ • Firewallॲཧͷొ defmacro firewall_through(identifier) do quote do identifier =
unquote(identifier) :brook_pipeline.save_before_ip_pipeline(Eshe.Firewall.firewall_filter(identifier)) end end def firewall_filter(identifier) do filter = fetch_filter(Eshe.Supervisor.route_firewall(), identifier) fn data, option -> case is_allow_filter(filter, data) do :ok -> {:ok, data, option} error -> {:error, error} end end end -
FirewallϞδϡʔϧ • Firewallॲཧͷొ defmacro firewall_through(identifier) do quote do identifier =
unquote(identifier) :brook_pipeline.save_before_ip_pipeline(Eshe.Firewall.firewall_filter(identifier)) end end def firewall_filter(identifier) do filter = fetch_filter(Eshe.Supervisor.route_firewall(), identifier) fn data, option -> case is_allow_filter(filter, data) do :ok -> {:ok, data, option} error -> {:error, error} end end end firewall_filterΛొ͢Δ -
FirewallϞδϡʔϧ • Firewallॲཧͷొ defmacro firewall_through(identifier) do quote do identifier =
unquote(identifier) :brook_pipeline.save_before_ip_pipeline(Eshe.Firewall.firewall_filter(identifier)) end end def firewall_filter(identifier) do filter = fetch_filter(Eshe.Supervisor.route_firewall(), identifier) fn data, option -> case is_allow_filter(filter, data) do :ok -> {:ok, data, option} error -> {:error, error} end end end ErlangଆॲཧΛฦ͠ɺΤϥʔͷ߹ ύέοτͷॲཧΛऴྃͤ͞Δ -
FirewallϞδϡʔϧ • Firewallͷఆॲཧ def match( %{protocol: protocol} = record, <<version::size(4),
len::size(4), _head::size(88), source_ip::size(32), dest_ip::size(32), other::binary>> ) when protocol in [:tcp, :udp] do {source_port, dest_port} = fetch_port(len, other) with res <- match_ip([], record[:dest_ip], record[:dest_netmask], dest_ip), res <- match_ip(res, record[:source_ip], record[:source_netmask], source_ip), res <- match_port(res, record[:source_port], source_port), res <- match_port(res, record[:dest_port], dest_port), res <- Enum.filter(res, &(&1 != nil)), {:ok, _value} <- Enum.fetch(res, 0) do Enum.all?(res, fn r -> r == true end) else _ -> false end end -
FirewallϞδϡʔϧ • Firewallͷఆॲཧ def match( %{protocol: protocol} = record, <<version::size(4),
len::size(4), _head::size(88), source_ip::size(32), dest_ip::size(32), other::binary>> ) when protocol in [:tcp, :udp] do {source_port, dest_port} = fetch_port(len, other) with res <- match_ip([], record[:dest_ip], record[:dest_netmask], dest_ip), res <- match_ip(res, record[:source_ip], record[:source_netmask], source_ip), res <- match_port(res, record[:source_port], source_port), res <- match_port(res, record[:dest_port], dest_port), res <- Enum.filter(res, &(&1 != nil)), {:ok, _value} <- Enum.fetch(res, 0) do Enum.all?(res, fn r -> r == true end) else _ -> false end end ૹ৴ݩͱૹ৴ઌͷIP ૹ৴ݩͱૹ৴ઌͷϙʔτ -
FirewallϞδϡʔϧ • Firewallͷఆॲཧ def match( %{protocol: protocol} = record, <<version::size(4),
len::size(4), _head::size(88), source_ip::size(32), dest_ip::size(32), other::binary>> ) when protocol in [:tcp, :udp] do {source_port, dest_port} = fetch_port(len, other) with res <- match_ip([], record[:dest_ip], record[:dest_netmask], dest_ip), res <- match_ip(res, record[:source_ip], record[:source_netmask], source_ip), res <- match_port(res, record[:source_port], source_port), res <- match_port(res, record[:dest_port], dest_port), res <- Enum.filter(res, &(&1 != nil)), {:ok, _value} <- Enum.fetch(res, 0) do Enum.all?(res, fn r -> r == true end) else _ -> false end end શͯͷൺֱ݁Ռ͕͍͠߹ͷΈtrueʹ