рдЕрддрд┐рдерд┐ рд╣реЙрдЯрд╕реНрдкреЙрдЯ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рдХрдард┐рдирд╛рдЗрдпрд╛рдБред рдЕрднреНрдпрд╛рд╕ (рднрд╛рдЧ 2)

рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рдЗрд╕ рдпреЛрдЬрдирд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЕрдм isc-dhcpd рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреАред

рдЕрддреНрдпрдзрд┐рдХ рд▓реЛрдб рд╡рд╛рд▓реЗ рдЕрддрд┐рдерд┐ рд╡рд╛рдИ-рдлрд╛рдИ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдЙрди рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдФрд░ рдЬреЛрдбрд╝рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдмрд╛рд╣рд░реА рд╕реЗрд╡рд╛рдУрдВ рддрдХ рдЙрдиреНрдирдд рдкрд╣реБрдВрдЪ рд╣реЛрддреА рд╣реИред рдореИрдХ рдкрддреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдЕрднрд┐рдЧрдо рдирд┐рдпрдВрддреНрд░рдг рд╣реИ (dhcpd.conf рдореЗрдВ рдкрддреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рджрд░реНрдЬ рдХрд░рдирд╛), рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдЕрднреНрдпрд╛рд╕ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рдпрд╣ рдХрд╛рдлреА рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдФрд░ рдЙрдирдХреЗ рдСрдкрд░реЗрд╢рди рдореЗрдВ рджрд░реНрдЬ рдореЗрдЬрдмрд╛рдиреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдХрд╛рд░рдг, рдкрдЯреНрдЯреЗ рдХреА рдЕрд╡рдзрд┐ рдХреЛ рдХрдо рдХрд░рдиреЗ рдпрд╛ рдЬрд╛рд░реА рдХрд┐рдП рдЧрдП рдЖрдИрдкреА рдкрддреЗ рдХреА рд╕реАрдорд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рдореЗрдЬрдмрд╛рди рдХреЗ рд▓рд┐рдП рдзреАрдореА рдЦреЛрдЬ рд╣реЛрддреА рд╣реИред рдореИрдХ рдкрддреЗ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдирд╛ рдФрд░ рд╕реНрдереИрддрд┐рдХ рдкрддреЗ рдЬрд╛рд░реА рдХрд░рдиреЗ рд╕реЗ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреА рдХрдВрдкрдиреА рдореЗрдВ 2 рд╡рд╛рдИ-рдлрд╛рдИ рд╕рдмрдиреЗрдЯ рд╣реИрдВ, рдЬреЛ рджреЛ рд╡рд░реНрдЪреБрдЕрд▓ рдиреЗрдЯрд╡рд░реНрдХ (рд╡реАрдПрд▓рдПрдПрди) рд╣реИрдВ рдЬреЛ рдорд▓реНрдЯреА-рдПрдХреНрд╕реЗрд╕ рдкреЙрдЗрдВрдЯ рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рд╡рд╛рдИ-рдлрд╛рдИ рдиреЗрдЯрд╡рд░реНрдХ рдЦреБрд▓рд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдкрд╛рд╕рд╡рд░реНрдб рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИред
рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдореИрдХ рдПрдбреНрд░реЗрд╕ рдХреЛ рдПрдХ рд╕рд╛рде 2 рдкреВрд▓ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рдкреНрд░рд╢рд╛рд╕рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рднреНрд░рдо рд╣реЛрддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЖрдЧреЗ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдкрд╛рдардХ рдХреЛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рд╕рдордЭ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкреАрдПрдл, рд╕реНрдХреНрд╡реАрдб, рдЖрдИрдПрд╕рд╕реА- dhcpd рдФрд░ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред


рд░рд╛рд╕реНрддрд╛ рдХреНрдпрд╛ рд╣реИ?


рд╕рдорд╛рдзрд╛рди рдереЛрдбрд╝рд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рд╕реНрд╡рдпрдВ dhcpd рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкрд╣реБрдВрдЪ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ?
рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ isc-dhcpd рд╣реИ, рдРрд╕реЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдкрд░ рдлрд╝рд╛рдпрд░рд╡реЙрд▓ рдкрд░ рд╕реЗрд╡рд╛рдУрдВ рддрдХ рдкрд╣реБрдБрдЪ рдЦреЛрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЬрдм рд╡реЗ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рдкрд╣реБрдБрдЪ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░ рджреЗрддреЗ рд╣реИрдВред
рд╣рдореЗрдВ рдЕрдкрдиреЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рдореИрдХ рдкрддреЗ рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрдирдХреЗ рддреНрд╡рд░рд┐рдд рдЬреЛрдбрд╝ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╡реЗрдм-рдереВрдерди, рдПрдХ рдлрд╝рд╛рдпрд░рд╡реЙрд▓ рдЬрд┐рд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рдереЛрдбрд╝рд╛ рдзреИрд░реНрдп рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рджреВрд░рд╕реНрде рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЕрдкрдирд╛ рд╕рд┐рд╕реНрдЯрдо рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдореИрдВ FreeBSD рдХрд╛ рд╕рдорд░реНрдердХ рд╣реВрдВ рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдкрд░ рд╕рднреА рдореБрдЦреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рдХрд░рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХрдИ рд╕рд┐рд╕реНрдЯрдо рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд┐рдпрдВрддреНрд░рдг рд╣реЛрддрд╛ рд╣реИред рдлрд╝рд╛рдпрд░рд╡реЙрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо pf рдФрд░ pftabled рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдкреАрдПрдл рдлрд╝рд╛рдпрд░рд╡реЙрд▓ рджреВрд╕рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреВрд▓ рд░реВрдк рд╕реЗ рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдбрд╛рдпрдирд╛рдорд┐рдХ рдЯреЗрдмрд▓ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореВрд▓ рдирд┐рдпрдореЛрдВ рдХреЛ рдЫреВрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред pftabled рдПрдХ рдбреЗрдорди рд╣реИ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрди рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЕрдиреБрдорд╛рдирд┐рдд pf.conf рд╡рд┐рдиреНрдпрд╛рд╕

int_if="em0" ext_if="em1" table <androids> table <private_nets> persist { 10.0.0.0/8, 172.16.0.0/16, 192.168.0.0/16 } # nat      ! nat on $ext_if from { <private_nets> } to { !<private_nets> } -> ($ext_if) #     .        <androids>    squid  transparent . no rdr on $int_if from <androids> to any #       apache      wpad.dat rdr on $int_if from ($int_if:network) to { any, !($int_if) } port { 80,8080 } -> 127.0.0.1 port 3129 # Allow DHCP pass in on $int_if proto udp from any port bootpc to any port bootps pass out on $int_if proto udp from any port bootps to any port bootpc # Allow DNS pass in on $int_if proto udp from ($int_if:network) to ($int_if) port domain keep state pass out on $int_if proto udp from ($int_if) to ($int_if:network) port domain # Allow Proxy access pass in on $int_if proto tcp from ($int_if:network) to ($int_if) port 3128 flags S/SA keep state pass in on $int_if proto tcp from ($int_if:network) to 127.0.0.1 port 3129 flags S/SA keep state # Allow access to local HTTP Server pass in on $int_if proto tcp from ($int_if:network) to ($int_if) port 80 flags S/SA keep state # Allow access from <androids> to any services pass in from <androids> to any keep state pass out on $ext_if from ($ext_if) to any keep state pass out on $ext_if proto icmp from any to any keep state 


рд╡рд░реНрдгрд┐рдд рд╡рд┐рдиреНрдпрд╛рд╕ рд╣рдореЗрдВ рдХреНрдпрд╛ рджреЗрддрд╛ рд╣реИ?


рд╣рдо рдХреЗрд╡рд▓ рдкреЛрд░реНрдЯ 80.8080 рдХреА рдЕрдиреБрдорддрд┐ рдХреНрдпреЛрдВ рджреЗрддреЗ рд╣реИрдВ? рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдп рдкреЛрд░реНрдЯ рдЦреЛрд▓рдиреЗ рд╕реЗ, рд╣рдо рдЕрдкрдиреЗ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдЦреЛ рджреЗрддреЗ рд╣реИрдВред
рд╕рд░реНрдХрд┐рдЯ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реНрдерд╛рдиреАрдп wpad рд╕реЗрд╡рд╛ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ dns рд╕рд░реНрд╡рд░ рдореЗрдВ IN A рд░рд┐рдХреЙрд░реНрдб рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ IP рдкрддреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЖрдкрдХреЗ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХрд╛ рдкрддрд╛ рд╣реИред рдиреАрдЪреЗ wpad.dat рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЗ рдореВрд▓ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
 function FindProxyForURL(url, host) { if( isPlainHostName(host) || dnsDomainIs(host, ".conf.local") || localHostOrDomainIs(host, "127.0.0.1") ){ return "DIRECT"; } if ( isInNet(host, "172.16.0.0", "255.255.0.0") || isInNet(host, "192.168.0.0", "255.255.0.0") || isInNet(host, "10.0.0.0", "255.0.0.0") || isInNet(host, "127.0.0.0", "255.255.255.0") ){ return "DIRECT"; } if ( isInNet(myIpAddress(), "192.168.0.0", "255.255.0.0")) return "PROXY 192.168.0.1:3128"; else return "DIRECT"; } 

рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдкрдврд╝реЗрдВ:

рдкрд╛рд░рджрд░реНрд╢реА рдореЛрдб рдореЗрдВ рд╕реНрдХреНрд╡реАрдб рдХреЛ рдХреИрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ, рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ ред

рдЦреИрд░, рддреИрдпрд╛рд░реА рдкреВрд░реА рд╣реЛ рдЧрдИ рд╣реИред рдЕрдЧрд▓рд╛, рдЖрдк рд╕рд┐рд╕реНрдЯрдо рдХрд░реНрдиреЗрд▓ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдЧрд░ dhcpd рдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╣реЛрд╕реНрдЯ рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рджреА рд╣реИрдВ, рддреЛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде "рдкреНрд░реЙрдХреНрд╕реА рд╕рд░реНрд╡рд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрддрд╛ рд▓рдЧрд╛рдирд╛" рд╕рдХреНрд╖рдо рд╣реИ, рдмреНрд░рд╛рдЙрдЬрд╝рд░ wpad.dat рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдЧрд╛ рдФрд░ рдкреНрд░реЙрдХреНрд╕реА рд╕рд░реНрд╡рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдиреЗ рд╕рднреА рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдЧрд╛ред рдпрджрд┐ рдЖрдк рд╣реЛрд╕реНрдЯ рдХреЛ рдПрдВрдбреНрд░реЙрдЗрдб рдЯреЗрдмрд▓ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╕рднреА рдЯреНрд░реИрдлрд╝рд┐рдХ рдкреНрд░реЙрдХреНрд╕реА рд╕рд░реНрд╡рд░ рд╕реЗ рдЖрдЧреЗ рдирд┐рдХрд▓ рдЬрд╛рдПрдВрдЧреЗред

рд╣рдо рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рддреЗ рд╣реИрдВ


рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рдФрд░ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╡рд┐рдХрд▓реНрдк рдЬрд╛рд░реА рдХрд┐рдП рдЧрдП рдкрддреЛрдВ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╣рд╛рдИ-рд╕реНрдкреАрдб рдПрдХреНрд╕реЗрд╕ рдХреЗ рд╕рд╛рде рд╕реБрд▓рдн рд╕реНрдерд╛рди рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╣реИред рдореЗрдордХреЗрдЪреНрдб рдореЗрд░реЗ рд▓рд┐рдП рдРрд╕реА рдЬрдЧрд╣ рд╣реИред рдЖрдк рдбреЗрдЯрд╛рдмреЗрд╕, рдлрд╝рд╛рдЗрд▓ рд╕реНрдЯреЛрд░реЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, рдЬреЛ рднреА рдЖрдкрдХрд╛ рджрд┐рд▓ рдЪрд╛рд╣рддрд╛ рд╣реИред рдЦрд╕рдЦрд╕ рдкрддреЗ рдХреЗ рд╕реНрдерд╛рдиреАрдп рдЖрдзрд╛рд░ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдирд┐рдпрдорд┐рдд рдореЛрддреА рдмрд╛рд░ DB_File рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред

рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдкреЛрд╕реНрдЯ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдЬрд╛рд░реА рдХрд┐рдП рдЧрдП рдкрддреЛрдВ рдХрд╛ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ dhcpd рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдиреАрдЪреЗ рдореЗрд░реЗ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдкрд╛рда рд╣реИред
 #!/usr/bin/perl use strict; use warnings; use DB_File; use IO::Socket; use Digest::HMAC_SHA1 qw(hmac_sha1); use Cache::Memcached::Fast; use Sys::Syslog; use vars qw/ $keyfile $key $lease_base $pftabled %macs/; use constant PFTBLPORT => 56789; use constant pfip => "127.0.0.1"; use constant PFTBLVERSION => 2; use constant PFTABLED_CMD_ADD => 1; use constant PFTABLED_CMD_DEL => 2; use constant PFTABLED_CMD_FLUSH => 3; use constant PFTBLCOMMAND => 1; use constant PFTBLMASK => 32; use constant SHA1_DIGEST_LENGTH => 20; use constant PFTBLNAME => "androids"; my $command = shift; my $ip = shift; my $mac = shift; my $pid = fork(); if($pid == 0) { $pftabled = IO::Socket::INET->new(Proto => 'udp', PeerPort => PFTBLPORT, PeerAddr => pfip) or die "Creating socket: $!\n"; openlog("publish-ip-mac","ndelay"); &load_key; &open_memcached; if($command eq 'commit') { &commit_address; } elsif($command eq 'release') { &release_address; } elsif($command eq 'expiry') { &release_address; } elsif($command eq 'hostname') { &commit_hostname; } else { syslog("info|local6","Unknown operation $command for $ip and $mac"); #print STDERR "Unknown operation $command for $ip and $mac\n"; } closelog; } exit(0); sub commit_address { $mac = join(":",map { sprintf("%02s",$_); } split(":",$mac)); #print STDERR "Host ".$ip." with MAC ".$mac." is alive\n"; syslog("info|local6","Host ".$ip." with MAC ".$mac." is alive"); $lease_base->set('ip/'.$mac,$ip,19200); $lease_base->set('mac/'.$ip,$mac,19200); $lease_base->set('lease_start/'.$ip,time(),19200); $lease_base->set('lease_end/'.$ip,time()+19200,19200); tie %macs, 'DB_File', '/var/db/macs.db', O_RDONLY, 0666, $DB_HASH or die "Cannot open file '/var/db/macs.db': $!\n"; syslog("info|local6","Mac: $mac Table Mac: $macs{$mac}"); if(exists $macs{$mac}) { syslog("info|local6","IP $ip put to pftable"); &pftabled_operations(PFTABLED_CMD_ADD,$ip); } untie %macs; } sub commit_hostname { $lease_base->set('name/'.$ip,$mac,19200); } sub release_address { if($mac = $lease_base->get('mac/'.$ip)) { syslog("info|local6","Host ".$ip." with MAC ".$mac." released or expired"); # print STDERR "Host ".$ip." with MAC ".$mac." released or expired\n"; $lease_base->delete('ip/'.$mac); $lease_base->delete('mac/'.$ip); $lease_base->delete('name/'.$ip); $lease_base->delete('lease_start/'.$ip); $lease_base->delete('lease_end/'.$ip); } else { # print STDERR "Host ".$ip." without MAC info released or expired\n"; syslog("info|local6","Host ".$ip." without MAC info released or expired"); } &pftabled_operations(PFTABLED_CMD_DEL,$ip); } sub check_access_table { } sub pftabled_operations { my $command = shift; my $iparray = shift; #print @iparray; foreach my $addip (split("\0",$iparray)) { my $addr = inet_aton($addip); my $time = time(); my $block = pack("C1 S1 C1",PFTBLVERSION,$command,PFTBLMASK).$addr.pack("a32 N*",PFTBLNAME,$time); my $digest = hmac_sha1($block, $key); $block .= $digest; $pftabled->send($block); } } sub load_key { my $keyfile = "/usr/local/etc/pftabled.key"; if (! -r $keyfile) { print STDERR "Cannot Read KeyFile $keyfile\n"; exit 1; } open(KEY, "<$keyfile"); sysread KEY, $key, SHA1_DIGEST_LENGTH; close KEY; } sub open_memcached { $lease_base = new Cache::Memcached::Fast({ servers => [ { address => 'localhost:11211', noreply => 1 } ], }); } 


рдлрд╝рд╛рдЗрд▓ /usr/local/etc/pftabled.key рдореЗрдВ рдПрдХ рдХреБрдВрдЬреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ pftabled рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред
/Var/db/macs.db рдлрд╝рд╛рдЗрд▓ рдореЗрдВ DB_File HASH рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдХ рдкрддреЛрдВ рдХрд╛ рдЖрдзрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЬрдм dhcpd рд╕реЗ рдХрдорд┐рдЯ рдХрдорд╛рдВрдб рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ - рдкреНрд░рд╛рдкреНрдд рдореИрдХ рдПрдбреНрд░реЗрд╕ рдХреЛ рдПрдбреНрд░реЗрд╕ рдмреЗрд╕ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдЧрд░ рдпрд╣ рд╡рд╣рд╛рдВ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдПрдХ рдкреИрдХреЗрдЯ рдХреЛ pftabled рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдореИрдХ рдХреЗ рдЕрдиреБрд░реВрдк рдПрдВрдбреНрд░реЙрдЗрдб рдЯреЗрдмрд▓ рдкрд░ рдЖрдИрдкреА рдПрдбреНрд░реЗрд╕ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЬрдм рд░рд┐рд▓реАрдЬрд╝ рдпрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ - рдЖрдИрдкреА рдХрдорд╛рдВрдб рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рддреЛ рдПрдВрдбреНрд░реЙрдЗрдб рдЯреЗрдмрд▓ рд╕реЗ рдЖрдИрдкреА рдкрддрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореЗрдореНрдХреЗрдЪреНрдб рдФрд░ рдкрдлрдЯреЗрдмрд▓ рдореЗрдВ рдбреЗрдЯрд╛ рд▓рд╛рдЗрдлрдЯрд╛рдЗрдо 19200 рд╕реЗрдХрдВрдб (рд▓рдЧрднрдЧ 5 рдШрдВрдЯреЗ) рдкрд░ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ, рд╡рд╣реА рд╕рдордп рдЕрдзрд┐рдХрддрдо-рд▓реАрдЬ-рдЯрд╛рдЗрдо рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ dhcpd.conf рдХреЙрдиреНрдлрд┐рдЧрд░ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдореЗрдЬрдмрд╛рдиреЛрдВ рдФрд░ рдкреАрдПрдл рдореЗрдВ рдореЗрдЬрдмрд╛рди рдЦреЛ рдирд╣реАрдВ рд░рд╣реЗ рд╣реИрдВред

pftabled рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
pftabled_flags = "- d -a 127.0.0.1 -k /usr/local/etc/pftabled.key -t 19200"
Crontab рдореЗрдВ рдЖрдкрдХреЛ рдирд┐рдореНрди рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
* * 5 * * * * / sbin / pfctl -t androids -T expire 19200> / dev / null 2> & 1

рдзреНрдпрд╛рди !!! /usr/local/etc/pftabled.key рдХрд╛ 0444 рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

рдЦреИрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдВрддрд┐рдо рднрд╛рдЧ рдПрдХ рд╡реЗрдм рдПрдХреНрд╕реЗрд╕ рдирд┐рдпрдо рд╣реИред
рдХреЛрдб рд╕рд░рд▓ рдФрд░ рд╕рд░рд▓ рд╣реИ, рдореЗрд░реЗ рдкрд╛рд╕ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЗрд╕рд▓рд┐рдП, рдмрд┐рдирд╛ рд╕рд╛рд╡рдзрд╛рдиреА рдФрд░ рддрд╛рдордЭрд╛рдо рдХреЗред

 #!/usr/bin/perl use POSIX qw(strftime); use DB_File; use strict; use IO::Socket; use Digest::HMAC_SHA1 qw(hmac_sha1); use Cache::Memcached::Fast; use vars qw/%sv %form %cookie %macs $lease_base $pftabled $key/; use constant PFTBLPORT => 56789; use constant pfip => "127.0.0.1"; use constant PFTBLVERSION => 2; use constant PFTABLED_CMD_ADD => 1; use constant PFTABLED_CMD_DEL => 2; use constant PFTABLED_CMD_FLUSH => 3; use constant PFTBLCOMMAND => 1; use constant PFTBLMASK => 32; use constant SHA1_DIGEST_LENGTH => 20; use constant PFTBLNAME => "androids"; require "functions.pm"; #BEGIN { Net::ISC::DHCPd::OMAPI::_DEBUG = sub { 1 } } $lease_base = new Cache::Memcached::Fast({ servers => [ { address => 'localhost:11211', noreply => 1 } ], }); &systeminit; tie %macs, 'DB_File', '/var/db/macs.db', O_CREAT|O_RDWR, 0666, $DB_HASH or die "Cannot open file '/var/db/macs.db': $!\n"; print "Content-Type: text/html;\r\n\r\n"; print << "[end]"; <HTML> <HEAD> <meta http-equiv="Content-Type" content="text/html;"> <TITLE>DHCP State</TITLE> <STYLE> TD { font:14px Courier; border-left:0px; border-top:0px; border-right:1px; border-bottom:1px; border-style: dashed; text-align: center;} BODY { font:14px Courier; } INPUT[type=button] { width: 100px; font: Verdana, Tahoma; } TR.red { background-color: #A0A0A0; } TR.head { background-color: #808080; } TR.green { background-color: #00C000; } TABLE { } </STYLE> </HEAD> <BODY> <script> function subm(id) { if(confirm("Really toggle access type for " + id)) { document.toggle.mac.value=id; document.toggle.submit(); } } </script> [end] #print "Macs list: ",join (",",keys %macs),"\n"; if($form{"mac"}) { &load_key; $pftabled = IO::Socket::INET->new(Proto => 'udp', PeerPort => PFTBLPORT, PeerAddr => pfip) or die "Creating socket: $!\n"; my $ip = $lease_base->get("ip/".$form{"mac"}); # print "Form list: ",join (",",keys %form),"\n"; if(defined($macs{$form{"mac"}})) { delete($macs{$form{"mac"}}); &pftabled_operations(PFTABLED_CMD_DEL,$ip); print STDERR "MAC Address ".$form{"mac"}." with IP $ip removed from full access\n"; } else { print STDERR "MAC Address ".$form{"mac"}." with IP $ip added to full access\n"; &pftabled_operations(PFTABLED_CMD_ADD,$ip); $macs{$form{"mac"}} = 'full'; } } print << "[end]"; <table width=100% border=0 cellspacing=0 cellpadding=1> <form name="toggle" method=POST> <input type=hidden name="mac" value=""> </form> [end] for(my $network=0;$network<255;$network++) { print << "[end]"; <tr><th colspan=6>Network $network</th></tr> <tr class="head"><td>IP</td><td>MAC</td><td>Access</td><td>Hostname</td><td>Last Seen/Lease Start</td><td>Planned Expire</td></tr> [end] for(my $i=0;$i<256;$i++) { my $ip_address = "192.168.$network.$i"; my $mac_address = $lease_base->get('mac/'.$ip_address) || next; #print Dumper($lease); my $hostname = $lease_base->get('name/'.$ip_address); my $checkboxvalue = ($macs{$mac_address}) ? "Back to normal" : "Switch to full"; my $style = ($macs{$mac_address}) ? "green" : "red"; my $checkboxfield = ($mac_address) ? "<input type=button name=\"".$mac_address."\" value=\"$checkboxvalue\" onclick=\"subm(this.name)\">" : " "; print "<tr class=\"$style\"><td>"; print join ("</td><td>",$ip_address,$mac_address||" ",$checkboxfield,$hostname||" ",time_expand($lease_base->get('lease_start/'.$ip_address)),time_expand($lease_base->get('lease_end/'.$ip_address))); print "</tr>\n"; } print "<tr><td colspan=6> </td></tr>\n"; } print << "[end]"; <tr><th colspan=6>Registered Mac Addresses</td></tr> [end] foreach my $mac (keys %macs) { print << "[end]"; <tr><td class="red" colspan=2>$mac -> $macs{$mac}</td><td colspan=4> </td></tr> [end] } print "</table></html></body>"; untie %macs; exit(0); sub time_expand { my $time = shift; #($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time); my $now = strftime "%a %b %e %H:%M:%S %Y", localtime($time); return($now); } sub pftabled_operations { my $command = shift; my $iparray = shift; #print @iparray; foreach my $addip (split("\0",$iparray)) { my $addr = inet_aton($addip); my $time = time(); my $block = pack("C1 S1 C1",PFTBLVERSION,$command,PFTBLMASK).$addr.pack("a32 N*",PFTBLNAME,$time); my $digest = hmac_sha1($block, $key); $block .= $digest; $pftabled->send($block); } } sub load_key { my $keyfile = "/usr/local/etc/pftabled.key"; if (! -r $keyfile) { print STDERR "Cannot Read KeyFile $keyfile\n"; exit 1; } open(KEY, "<$keyfile"); sysread KEY, $key, SHA1_DIGEST_LENGTH; close KEY; } 


рдЦреИрд░, рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рд╣реИред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд░реАрдбрд┐рдВрдЧ рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреА рдФрд░ рдЖрдкрдХреА рдХрдВрдкрдиреА рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╕реБрдзрд╛рд░ рдкрд░ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдЧреАред

рдкреБрдирд╢реНрдЪ: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдпрдВ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рд╣реЙрдЯрд╕реНрдкреЙрдЯреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░реЙрдХреНрд╕реА рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдХреЛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рд╡реЗрдм рд╕рд░реНрд╡рд░ рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдХреЗ рд╕рд╛рде рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ рд╕реЗ рдПрдХ рд╣реЛрд╕реНрдЯ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ isc-dhcpd рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ pftabled рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛред
PPS: рдЕрдВрддрд┐рдо рдлрд╝рд╛рдЗрд▓ рдореЗрдВ "functions.pm" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдлреЙрд░реНрдо рдФрд░ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХрд╛ рдЗрдирдкреБрдЯ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣реИред рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЬрд╛рдБрдЪ рдХреЛ CGI рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬреЛ рд▓реЛрдЧ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдореИрдВ рдореЙрдбреНрдпреВрд▓ "рдлрдВрдХреНрд╢рдиреНрд╕ .pm" рдХреЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдФрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рд▓реЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реВрдВ

рдЕрдмреЙрд░реНрдЪреЗ 2011

Source: https://habr.com/ru/post/In134154/


All Articles