Linux рдореЗрдВ рддреЗрдЬрд╝ рд░реВрдЯрд┐рдВрдЧ рдФрд░ NAT

рдЬреИрд╕реЗ рд╣реА IPv4 рдкрддреЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдХрдИ рджреВрд░рд╕рдВрдЪрд╛рд░ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЕрдкрдиреЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдПрдбреНрд░реЗрд╕ рдЯреНрд░рд╛рдВрд╕рд▓реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдиреЗрдЯрд╡рд░реНрдХ рдПрдХреНрд╕реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЖрдк рдХрдореЛрдбрд┐рдЯреА рд╕рд░реНрд╡рд░ рдкрд░ рдХреИрд░рд┐рдпрд░ рдЧреНрд░реЗрдб NAT рдкреНрд░рджрд░реНрд╢рди рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЗрддрд┐рд╣рд╛рд╕

IPv4 рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рдХреА рдХрдореА рдХрд╛ рд╡рд┐рд╖рдп рдЕрдм рдирдпрд╛ рдирд╣реАрдВ рд╣реИред рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕реВрдЪреА RIPE рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреА, рдлрд┐рд░ рдПрдХреНрд╕рдЪреЗрдВрдЬ рдЙрднрд░реЗ рдЬрд┐рди рдкрд░ рдкрддреЗ рдХреЗ рдмреНрд▓реЙрдХ рдХрд╛ рд╡реНрдпрд╛рдкрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкрдЯреНрдЯреЗ рдкрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реМрджреЗ рд╕рдВрдкрдиреНрди рд╣реБрдПред рдзреАрд░реЗ-рдзреАрд░реЗ, рдЯреЗрд▓реАрдХреЙрдо рдСрдкрд░реЗрдЯрд░реЛрдВ рдиреЗ рдПрдбреНрд░реЗрд╕ рдФрд░ рдкреЛрд░реНрдЯ рдЯреНрд░рд╛рдВрд╕рд▓реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдПрдХреНрд╕реЗрд╕ рд╕реЗрд╡рд╛рдПрдВ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рдХреБрдЫ рдиреЗ рдкреНрд░рддреНрдпреЗрдХ рдЧреНрд░рд╛рд╣рдХ рдХреЛ "рд╕рдлреЗрдж" рдкрддрд╛ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдкрддреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ рдХрд┐рдпрд╛, рдЬрдмрдХрд┐ рдЕрдиреНрдп рдиреЗ рджреНрд╡рд┐рддреАрдпрдХ рдмрд╛рдЬрд╛рд░ рдкрд░ рдкрддреЗ рдЦрд░реАрджрдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рдХреЗ рдкреИрд╕реЗ рдмрдЪрд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рдиреЗрдЯрд╡рд░реНрдХ рдЙрдкрдХрд░рдг рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛рдУрдВ рдиреЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдЖрдорддреМрд░ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЙрдбреНрдпреВрд▓ рдпрд╛ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреБрдирд┐рдкрд░ рдХреА рдПрдордПрдХреНрд╕ рд░рд╛рдЙрдЯрд░реНрд╕ рдХреА рд▓рд╛рдЗрди рдореЗрдВ (рдирд╡реАрдирддрдо рдПрдордПрдХреНрд╕104 рдФрд░ рдПрдордПрдХреНрд╕204 рдХреЛ рдЫреЛрдбрд╝рдХрд░), рдЖрдк рдПрдХ рдЕрд▓рдЧ рдПрдордПрд╕-рдПрдордЖрдИрд╕реА рд╕рд░реНрд╡рд┐рд╕ рдХрд╛рд░реНрдб рдкрд░ рдПрдирдПрдкреАрдЯреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд┐рд╕реНрдХреЛ рдПрдПрд╕рдЖрд░1рдХреЗ рдХреЛ рд╕реАрдЬреАрдПрди рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╕рд┐рд╕реНрдХреЛ рдПрдПрд╕рдЖрд░9рдХреЗ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдП9рдХреЗ-рдЖрдИрдПрд╕рдПрдо-100 рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдФрд░ рдЙрд╕реЗ рдПрдХ A9K-CGN рд▓рд╛рдЗрд╕реЗрдВрд╕ -LICред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрдирдВрдж рдореЗрдВ рдмрд╣реБрдд рдкреИрд╕рд╛ рдЦрд░реНрдЪ рд╣реЛрддрд╛ рд╣реИред

IPTables

NAT рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ; рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрди рдкреНрд░реЛрд╕реЗрд╕рд░ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рднреА рд╣реЛрдо рд░рд╛рдЙрдЯрд░ рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдПрдХ рдЯреЗрд▓реАрдХреЙрдо рдСрдкрд░реЗрдЯрд░ рдХреЗ рдкреИрдорд╛рдиреЗ рдкрд░, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ FreeBSD (ipfw/pf) рдпрд╛ GNU/Linux (iptables) рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрдореЛрдбрд┐рдЯреА рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдо FreeBSD рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐... рдореИрдВрдиреЗ рдХрд╛рдлреА рд╕рдордп рдкрд╣рд▓реЗ рдЗрд╕ рдУрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЬреАрдПрдирдпреВ/рд▓рд┐рдирдХреНрд╕ рдкрд░ рд╣реА рдЯрд┐рдХреЗ рд░рд╣реЗрдВрдЧреЗред

рдкрддрд╛ рдЕрдиреБрд╡рд╛рдж рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдХрдард┐рди рдирд╣реАрдВ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдиреЗрдЯ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ iptables рдореЗрдВ рдПрдХ рдирд┐рдпрдо рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

iptables -t nat -A POSTROUTING -s 100.64.0.0/10 -j SNAT --to <pool_start_addr>-<pool_end_addr> --persistent

рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо nf_conntrack рдореЙрдбреНрдпреВрд▓ рд▓реЛрдб рдХрд░реЗрдЧрд╛, рдЬреЛ рд╕рднреА рд╕рдХреНрд░рд┐рдп рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░реЗрдЧрд╛ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд░реВрдкрд╛рдВрддрд░рдг рдХрд░реЗрдЧрд╛ред рдпрд╣рд╛рдВ рдХрдИ рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ рд╣реИрдВ. рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЪреВрдВрдХрд┐ рд╣рдо рдПрдХ рдЯреЗрд▓реАрдХреЙрдо рдСрдкрд░реЗрдЯрд░ рдХреЗ рдкреИрдорд╛рдиреЗ рдкрд░ NAT рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдиреБрд╡рд╛рдж рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЖрдХрд╛рд░ рддреЗрдЬреА рд╕реЗ рднрдпрд╛рд╡рд╣ рдореВрд▓реНрдпреЛрдВ рддрдХ рдмрдврд╝ рдЬрд╛рдПрдЧрд╛ред рдиреАрдЪреЗ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдкрд░ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

net.ipv4.ip_forward = 1
net.ipv4.ip_local_port_range = 8192 65535

net.netfilter.nf_conntrack_generic_timeout = 300
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 60
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 60
net.netfilter.nf_conntrack_tcp_timeout_established = 600
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 45
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 30
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close = 10
net.netfilter.nf_conntrack_tcp_timeout_max_retrans = 300
net.netfilter.nf_conntrack_tcp_timeout_unacknowledged = 300
net.netfilter.nf_conntrack_udp_timeout = 30
net.netfilter.nf_conntrack_udp_timeout_stream = 60
net.netfilter.nf_conntrack_icmpv6_timeout = 30
net.netfilter.nf_conntrack_icmp_timeout = 30
net.netfilter.nf_conntrack_events_retry_timeout = 15
net.netfilter.nf_conntrack_checksum=0

рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдЪреВрдВрдХрд┐ рдЕрдиреБрд╡рд╛рдж рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЖрдХрд╛рд░ рдХрд┐рд╕реА рдЯреЗрд▓реАрдХреЙрдо рдСрдкрд░реЗрдЯрд░ рдХреА рд╢рд░реНрддреЛрдВ рдХреЗ рддрд╣рдд рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдмрдврд╝рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

net.netfilter.nf_conntrack_max = 3145728

рд╕рднреА рдкреНрд░рд╕рд╛рд░рдгреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдмрдХреЗрдЯ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рд╛рдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдпрд╣ nf_conntrack рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ):

options nf_conntrack hashsize=1572864

рдЗрди рд╕рд░рд▓ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЗ рдмрд╛рдж, рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЧреНрд░рд╛рд╣рдХ рдкрддреЗ рдХреЛ рдмрд╛рд╣рд░реА рдкрддреЗ рдХреЗ рдкреВрд▓ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рд╡рд╛рдВрдЫрд┐рдд рдирд╣реАрдВ рд╣реИред NAT (рд▓рдЧрднрдЧ 2013) рдХреЗ рд▓рд┐рдП GNU/Linux рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЕрдкрдиреЗ рдкрд╣рд▓реЗ рдкреНрд░рдпрд╛рд╕ рдореЗрдВ, рдореИрдВ 7Mpps рдкреНрд░рддрд┐ рд╕рд░реНрд╡рд░ (Xeon E0.8-5v1650) рдкрд░ рд▓рдЧрднрдЧ 2Gbit/s рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдЙрд╕ рд╕рдордп рд╕реЗ, GNU/Linux рдХрд░реНрдиреЗрд▓ рдиреЗрдЯрд╡рд░реНрдХ рд╕реНрдЯреИрдХ рдореЗрдВ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдиреБрдХреВрд▓рди рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдПрдХ рд╣реА рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рдПрдХ рд╕рд░реНрд╡рд░ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди 18-19 Mpps рдкрд░ рд▓рдЧрднрдЧ 1.8-1.9 Gbit/s рддрдХ рдмрдврд╝ рдЧрдпрд╛ рд╣реИ (рдпреЗ рдЕрдзрд┐рдХрддрдо рдорд╛рди рдереЗ) , рд▓реЗрдХрд┐рди рдПрдХ рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдЯреНрд░реИрдлрд╝рд┐рдХ рд╡реЙрд▓реНрдпреВрдо рдХреА рдорд╛рдВрдЧ рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рдмрдврд╝реАред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╡рд┐рднрд┐рдиреНрди рд╕рд░реНрд╡рд░реЛрдВ рдкрд░ рд▓реЛрдб рдХреЛ рд╕рдВрддреБрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпреЛрдЬрдирд╛рдПрдВ рд╡рд┐рдХрд╕рд┐рдд рдХреА рдЧрдИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╕реЗрд╡рд╛рдУрдВ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ, рдмрдирд╛рдП рд░рдЦрдиреЗ рдФрд░ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдмрдврд╝ рдЧрдИред

рдПрдирдПрдлрдЯреЗрдмрд▓реНрд╕

рдЖрдЬрдХрд▓, рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ "рд╢рд┐рдлреНрдЯрд┐рдВрдЧ рдмреИрдЧ" рдореЗрдВ рдПрдХ рдлреИрд╢рдиреЗрдмрд▓ рдЪрд▓рди DPDK рдФрд░ XDP рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓реЗрдЦ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рднрд╛рд╖рдг рджрд┐рдП рдЧрдП рд╣реИрдВ, рдФрд░ рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рдЙрддреНрдкрд╛рдж рд╕рд╛рдордиреЗ рдЖ рд░рд╣реЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд╛рд╕рдПрдХреНрд╕рдкрд░реНрдЯреНрд╕ рд╕реЗ SKAT)ред рд▓реЗрдХрд┐рди рдЯреЗрд▓реАрдХреЙрдо рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕реАрдорд┐рдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЗрди рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдкрдиреЗ рджрдо рдкрд░ рдХреЛрдИ рднреА "рдЙрддреНрдкрд╛рдж" рдмрдирд╛рдирд╛ рдХрд╛рдлреА рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИред рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдРрд╕реЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛрдЧрд╛; рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдирд┐рджрд╛рди рдЙрдкрдХрд░рдг рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, DPDK рдХреЗ рд╕рд╛рде рдорд╛рдирдХ tcpdump рдРрд╕реЗ рд╣реА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдФрд░ рдпрд╣ XDP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддрд╛рд░реЛрдВ рдкрд░ рд╡рд╛рдкрд╕ рднреЗрдЬреЗ рдЧрдП рдкреИрдХреЗрдЯреЛрдВ рдХреЛ "рджреЗрдЦ" рдирд╣реАрдВ рдкрд╛рдПрдЧрд╛ред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд╕реНрдерд╛рди рдкрд░ рдкреИрдХреЗрдЯ рдлрд╝реЙрд░рд╡рд░реНрдбрд┐рдВрдЧ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдИ рддрдХрдиреАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЪрд░реНрдЪрд╛рдУрдВ рдХреЗ рдмреАрдЪ, рдЙрди рдкрд░ рдХрд┐рд╕реА рдХрд╛ рдзреНрдпрд╛рди рдирд╣реАрдВ рдЧрдпрд╛ рд░рд┐рдкреЛрд░реНрдЯреЛрдВ ╨╕ рд▓реЗрдЦ рдкрд╛рдмреНрд▓реЛ рдиреАрд░рд╛ рдЕрдпреБрд╕реЛ, рдЖрдИрдкреАрдЯреЗрдмрд▓реНрд╕ рдореЗрдВрдЯреЗрдирд░, рдПрдирдПрдлрдЯреАрдПрдмрд▓реНрд╕ рдореЗрдВ рдлреНрд▓реЛ рдСрдлрд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдЖрдЗрдП рдЗрд╕ рддрдВрддреНрд░ рдХреЛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рджреЗрдЦреЗрдВред

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

рд╡рд┐рдиреНрдпрд╛рд╕

рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП:

  • рддрд╛рдЬреА рдЧрд┐рд░реА рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реНрд╡рдпрдВ рдХрд░реНрдиреЗрд▓ 4.16 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рдХрд╛рдлреА рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдпрд╣ рдмрд╣реБрдд "рдХрдЪреНрдЪреА" рдереА рдФрд░ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдХрд░реНрдиреЗрд▓ рдШрдмрд░рд╛рд╣рдЯ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреА рдереАред рджрд┐рд╕рдВрдмрд░ 2019 рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╕рдм рдХреБрдЫ рд╕реНрдерд┐рд░ рд╣реЛ рдЧрдпрд╛, рдЬрдм рдПрд▓рдЯреАрдПрд╕ рдХрд░реНрдиреЗрд▓ 4.19.90 рдФрд░ 5.4.5 рдЬрд╛рд░реА рдХрд┐рдП рдЧрдПред
  • nftables рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ nftables рдкреНрд░рд╛рд░реВрдк рдореЗрдВ iptables рдирд┐рдпрдореЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВред рдмрд┐рд▓реНрдХреБрд▓ рд╕рдВрд╕реНрдХрд░рдг 0.9.0 рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдпрджрд┐ рдкрд╣рд▓реЗ рдмрд┐рдВрджреБ рдХреЗ рд╕рд╛рде рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рджреМрд░рд╛рди рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ (CONFIG_NFT_FLOW_OFFLOAD=m), рддреЛ рджреВрд╕рд░реЗ рдмрд┐рдВрджреБ рдкрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред nftables рдирд┐рдпрдореЛрдВ рдХреЛ iptables рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрднрд┐рд▓реЗрдЦ рд▓рдЧрднрдЧ рд╕рднреА рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдХрд░рддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рднреА рд╣реИрдВ рдХрдиреНрд╡рд░реНрдЯрд░реНрд╕ iptables рд╕реЗ nftables рддрдХ рдХреЗ рдирд┐рдпрдоред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдХреЗрд╡рд▓ NAT рдФрд░ рдлреНрд▓реЛ рдСрдлрд▓реЛрдб рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреА рд╕реА рдХрдерд╛: , - рдпреЗ рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЯреНрд░реИрдлрд╝рд┐рдХ рдЧреБрдЬрд░рддрд╛ рд╣реИ; рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпреЗ рджреЛ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред , - "рд╕рдлрд╝реЗрдж" рдкрддреЛрдВ рдХреА рд╢реНрд░реЗрдгреА рдХрд╛ рдЖрд░рдВрдн рдФрд░ рд╕рдорд╛рдкреНрддрд┐ рдкрддрд╛ред

NAT рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:

#! /usr/sbin/nft -f

table nat {
        chain postrouting {
                type nat hook postrouting priority 100;
                oif <o_if> snat to <pool_addr_start>-<pool_addr_end> persistent
        }
}

рдлреНрд▓реЛ рдСрдлрд▓реЛрдб рдХреЗ рд╕рд╛рде рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рдлреА рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╣реИ:

#! /usr/sbin/nft -f

table inet filter {
        flowtable fastnat {
                hook ingress priority 0
                devices = { <i_if>, <o_if> }
        }

        chain forward {
                type filter hook forward priority 0; policy accept;
                ip protocol { tcp , udp } flow offload @fastnat;
        }
}

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд╣ рд╕рдВрдкреВрд░реНрдг рд╕реЗрдЯрдЕрдк рд╣реИред рдЕрдм рд╕рднреА рдЯреАрд╕реАрдкреА/рдпреВрдбреАрдкреА рдЯреНрд░реИрдлрд┐рдХ рдлрд╛рд╕реНрдЯрдиреИрдЯ рдЯреЗрдмрд▓ рдореЗрдВ рдЖ рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрдВрдЧреЗред

рдирд┐рд╖реНрдХрд░реНрд╖

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ "рдмрд╣реБрдд рддреЗрдЬрд╝" рд╣реИ, рдореИрдВ рджреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд░реНрд╡рд░реЛрдВ рдкрд░ рд▓реЛрдб рдХрд╛ рдПрдХ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд╕рдВрд▓рдЧреНрди рдХрд░реВрдВрдЧрд╛, рдПрдХ рд╣реА рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ (Xeon E5-1650v2) рдХреЗ рд╕рд╛рде, рд╕рдорд╛рди рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди iptables рдореЗрдВ NAT рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред (NAT4) рдФрд░ nftables (NAT5) рдореЗрдВред

Linux рдореЗрдВ рддреЗрдЬрд╝ рд░реВрдЯрд┐рдВрдЧ рдФрд░ NAT

рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдкреИрдХреЗрдЯ рдХрд╛ рдХреЛрдИ рдЧреНрд░рд╛рдлрд╝ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрди рд╕рд░реНрд╡рд░реЛрдВ рдХреЗ рд▓реЛрдб рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдФрд╕рдд рдкреИрдХреЗрдЯ рдХрд╛ рдЖрдХрд╛рд░ рд▓рдЧрднрдЧ 800 рдмрд╛рдЗрдЯреНрд╕ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдорд╛рди 1.5Mpps рддрдХ рдкрд╣реБрдВрдЪ рдЬрд╛рддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, nftables рд╡рд╛рд▓реЗ рд╕рд░реНрд╡рд░ рдореЗрдВ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдкреНрд░рджрд░реНрд╢рди рд░рд┐рдЬрд░реНрд╡ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдпрд╣ рд╕рд░реНрд╡рд░ 30Mpps рдкрд░ 3Gbit/s рддрдХ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореБрдлреНрдд CPU рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде 40Gbps рдХреА рднреМрддрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рд╕реАрдорд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рд╣реИред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╛рдордЧреНрд░реА рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреАред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ