рд▓рд┐рдирдХреНрд╕рдордзреНрдпреЗ рдЬрд▓рдж рд░рд╛рдЙрдЯрд┐рдВрдЧ рдЖрдгрд┐ NAT

IPv4 рдкрддреНрддреЗ рд╕рдВрдкреБрд╖реНрдЯрд╛рдд рдЖрд▓реНрдпрд╛рдиреЗ, рдЕрдиреЗрдХ рджреВрд░рд╕рдВрдЪрд╛рд░ рдСрдкрд░реЗрдЯрд░рдирд╛ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдХреНрд▓рд╛рдпрдВрдЯрдирд╛ рдЕреЕрдбреНрд░реЗрд╕ рдЯреНрд░рд╛рдиреНрд╕рд▓реЗрд╢рди рд╡рд╛рдкрд░реВрди рдиреЗрдЯрд╡рд░реНрдХ рдНрдХреНрд╕реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рднрд╛рд╕рддреЗ. рдпрд╛ рд▓реЗрдЦрд╛рдд рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рдХрдореЛрдбрд┐рдЯреА рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдХреЕрд░рд┐рдпрд░ рдЧреНрд░реЗрдб NAT рдХрд╛рдордЧрд┐рд░реА рдХрд╢реА рдорд┐рд│рд╡реВ рд╢рдХрддрд╛ рддреЗ рд╕рд╛рдВрдЧреЗрди.

рдЗрддрд┐рд╣рд╛рд╕ рдПрдХ рдмрд┐рдЯ

IPv4 рдЕреЕрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рдПрдХреНрдЭреЛрд╢рдирдЪрд╛ рд╡рд┐рд╖рдп рдЖрддрд╛ рдирд╡реАрди рдирд╛рд╣реА. рдХрд╛рд╣реА рдХреНрд╖рдгреА, RIPE рдордзреНрдпреЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдпрд╛рджреА рджрд┐рд╕реВ рд▓рд╛рдЧрд▓реА, рдирдВрддрд░ рдПрдХреНрд╕рдЪреЗрдВрдЬреЗрд╕ рдЙрджрдпрд╛рд╕ рдЖрд▓реНрдпрд╛ рдЬреНрдпрд╛рд╡рд░ рдкрддреНрддреНрдпрд╛рдВрдЪреНрдпрд╛ рдмреНрд▓реЙрдХреНрд╕рдЪреА рдЦрд░реЗрджреА-рд╡рд┐рдХреНрд░реА рдХреЗрд▓реА рдЧреЗрд▓реА рдЖрдгрд┐ рддреНрдпрд╛рдВрдирд╛ рднрд╛рдбреНрдпрд╛рдиреЗ рджреЗрдгреНрдпрд╛рдЪреЗ рд╕реМрджреЗ рдкреВрд░реНрдг рдЭрд╛рд▓реЗ. рд╣рд│реВрд╣рд│реВ, рджреВрд░рд╕рдВрдЪрд╛рд░ рдСрдкрд░реЗрдЯрд░ рдкрддреНрддрд╛ рдЖрдгрд┐ рдкреЛрд░реНрдЯ рднрд╛рд╖рд╛рдВрддрд░ рд╡рд╛рдкрд░реВрди рдЗрдВрдЯрд░рдиреЗрдЯ рдкреНрд░рд╡реЗрд╢ рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рди рдХрд░реВ рд▓рд╛рдЧрд▓реЗ. рдХрд╛рд╣реАрдВрдиреА рдкреНрд░рддреНрдпреЗрдХ рдЧреНрд░рд╛рд╣рдХрд╛рд▓рд╛ тАЬрдкрд╛рдВрдврд░рд╛тАЭ рдкрддреНрддрд╛ рдЬрд╛рд░реА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкреБрд░реЗрд╕реЗ рдкрддреНрддреЗ рдорд┐рд│реВ рд╢рдХрд▓реЗ рдирд╛рд╣реАрдд, рддрд░ рдХрд╛рд╣реАрдВрдиреА рджреБрдпреНрдпрдо рдмрд╛рдЬрд╛рд░рд╛рдд рдкрддреНрддреЗ рдЦрд░реЗрджреА рдХрд░рдгреНрдпрд╛рд╕ рдирдХрд╛рд░ рджреЗрдКрди рдкреИрд╕реЗ рд╡рд╛рдЪрд╡рдгреНрдпрд╛рд╕ рд╕реБрд░реБрд╡рд╛рдд рдХреЗрд▓реА. рдиреЗрдЯрд╡рд░реНрдХ рдЙрдкрдХрд░рдгрд╛рдВрдЪреНрдпрд╛ рдирд┐рд░реНрдорд╛рддреНрдпрд╛рдВрдиреА рдпрд╛ рдХрд▓реНрдкрдиреЗрдЪреЗ рд╕рдорд░реНрдерди рдХреЗрд▓реЗ, рдХрд╛рд░рдг рдпрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрд╕рд╛рдареА рд╕рд╣рд╕рд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╕реНрддрд╛рд░ рдореЙрдбреНрдпреВрд▓ рдХрд┐рдВрд╡рд╛ рдкрд░рд╡рд╛рдиреЗ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рддрд╛рдд. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЬреБрдирд┐рдкрд░рдЪреНрдпрд╛ MX рд░рд╛рдЙрдЯрд░рдЪреНрдпрд╛ рд▓рд╛рдЗрдирдордзреНрдпреЗ (рдирд╡реАрдирддрдо MX104 рдЖрдгрд┐ MX204 рд╡рдЧрд│рддрд╛), рддреБрдореНрд╣реА рд╡реЗрдЧрд│реНрдпрд╛ MS-MIC рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдбрд╡рд░ NAPT рдХрд░реВ рд╢рдХрддрд╛, Cisco ASR1k рд▓рд╛ CGN рдкрд░рд╡рд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, Cisco ASR9k рд▓рд╛ рд╡реЗрдЧрд│реНрдпрд╛ A9K-ISM-100 рдореЙрдбреНрдпреВрд▓рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ. рдЖрдгрд┐ рддреНрдпрд╛рд▓рд╛ A9K-CGN рдкрд░рд╡рд╛рдирд╛ -LIC. рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ, рдЖрдирдВрджрд╛рд╕рд╛рдареА рдЦреВрдк рдкреИрд╕реЗ рд▓рд╛рдЧрддрд╛рдд.

рдЖрдпрдкреАрдЯреАрдмрд▓

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

рдкрддреНрддрд╛ рдЕрдиреБрд╡рд╛рдж рд╕рдХреНрд╖рдо рдХрд░рдгреЗ рдЕрдЬрд┐рдмрд╛рдд рдЕрд╡рдШрдб рдирд╛рд╣реА. рдкреНрд░рдердо рддреБрдореНрд╣рд╛рд▓рд╛ nat рдЯреЗрдмрд▓рдордзреНрдпреЗ 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 рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдорд╛рдЭреНрдпрд╛ рдкрд╣рд┐рд▓реНрдпрд╛ рдкреНрд░рдпрддреНрдирд╛рдВрдордзреНрдпреЗ, рдореА рдкреНрд░рддрд┐ рд╕рд░реНрд╡реНрд╣рд░ (Xeon E7-0.8v5) 1650Mpps рд╡рд░ рд╕реБрдорд╛рд░реЗ 2Gbit/s рдЪреА рдХрд╛рдордЧрд┐рд░реА рдорд┐рд│рд╡реВ рд╢рдХрд▓реЛ. рддреЗрд╡реНрд╣рд╛рдкрд╛рд╕реВрди, GNU/Linux рдХрд░реНрдирд▓ рдиреЗрдЯрд╡рд░реНрдХ рд╕реНрдЯреЕрдХрдордзреНрдпреЗ рдЕрдиреЗрдХ рднрд┐рдиреНрди рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рди рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗрдд, рддреНрдпрд╛рдЪ рд╣рд╛рд░реНрдбрд╡реЗрдЕрд░рд╡рд░реАрд▓ рдПрдХрд╛ рд╕рд░реНрд╡реНрд╣рд░рдЪреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ 18-19 Mpps рд╡рд░ рдЬрд╡рд│рдЬрд╡рд│ 1.8-1.9 Gbit/s рдкрд░реНрдпрдВрдд рд╡рд╛рдврд▓реА рдЖрд╣реЗ (рд╣реА рдХрдорд╛рд▓ рдореВрд▓реНрдпреЗ рд╣реЛрддреА) , рдкрд░рдВрддреБ рдПрдХрд╛ рд╕рд░реНрд╡реНрд╣рд░рджреНрд╡рд╛рд░реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд░рд╣рджрд╛рд░реАрдЪреНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рдЪреА рдорд╛рдЧрдгреА рдЦреВрдк рд╡реЗрдЧрд╛рдиреЗ рд╡рд╛рдврд▓реА. рдкрд░рд┐рдгрд╛рдореА, рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░реАрд▓ рднрд╛рд░ рд╕рдВрддреБрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдпреЛрдЬрдирд╛ рд╡рд┐рдХрд╕рд┐рдд рдХреЗрд▓реНрдпрд╛ рдЧреЗрд▓реНрдпрд╛, рдкрд░рдВрддреБ рдпрд╛ рд╕рд░реНрд╡рд╛рдВрдореБрд│реЗ рдкреНрд░рджрд╛рди рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╕реЗрд╡рд╛рдВрдЪреА рд╕реНрдерд╛рдкрдирд╛, рджреЗрдЦрднрд╛рд▓ рдЖрдгрд┐ рдЧреБрдгрд╡рддреНрддрд╛ рд░рд╛рдЦрдгреНрдпрд╛рдЪреА рдЬрдЯрд┐рд▓рддрд╛ рд╡рд╛рдврд▓реА.

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

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

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

рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди

рд╣реЗ рдХрд╛рд░реНрдп рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ:

  • рддрд╛рдЬреЗ рдХрд░реНрдирд▓ рд╡рд╛рдкрд░рд╛. рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реНрд╡рддрдГ рдХрд░реНрдирд▓ 4.16 рдордзреНрдпреЗ рджрд┐рд╕рд▓реА рдЕрд╕реВрдирд╣реА, рдмрд░реНтАНрдпрд╛рдЪ рдХрд╛рд│рд╛рдкрд╛рд╕реВрди рддреА рдЦреВрдк "рдХрдЪреНрдЪреА" рд╣реЛрддреА рдЖрдгрд┐ рдирд┐рдпрдорд┐рддрдкрдгреЗ рдХрд░реНрдирд▓ рдШрд╛рдмрд░рдд рд╣реЛрддреА. рдбрд┐рд╕реЗрдВрдмрд░ 2019 рдЪреНрдпрд╛ рдЖрд╕рдкрд╛рд╕ рд╕рд░реНрд╡ рдХрд╛рд╣реА рд╕реНрдерд┐рд░ рдЭрд╛рд▓реЗ, рдЬреЗрд╡реНрд╣рд╛ LTS рдХрд░реНрдирд▓ 4.19.90 рдЖрдгрд┐ 5.4.5 рд░рд┐рд▓реАрдЬ рдЭрд╛рд▓реЗ.
  • nftables рдЪреНрдпрд╛ рдЕрдЧрджреА рдЕрд▓реАрдХрдбреАрд▓ рдЖрд╡реГрддреНрддреАрдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди iptables рдирд┐рдпрдо nftables рдлреЙрд░рдореЕрдЯрдордзреНрдпреЗ рдкреБрдиреНрд╣рд╛ рд▓рд┐рд╣рд╛. рдЖрд╡реГрддреНрддреА 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;
        }
}

рдЦрд░рдВ рддрд░, рд╕рдВрдкреВрд░реНрдг рд╕реЗрдЯрдЕрдк рдЖрд╣реЗ. рдЖрддрд╛ рд╕рд░реНрд╡ TCP/UDP рдЯреНрд░реЕрдлрд┐рдХ рдлрд╛рд╕реНрдЯрдиреЕрдЯ рдЯреЗрдмрд▓рдордзреНрдпреЗ рдпреЗрдИрд▓ рдЖрдгрд┐ рддреНрдпрд╛рд╡рд░ рдЕрдзрд┐рдХ рдЬрд▓рдж рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗрд▓реА рдЬрд╛рдИрд▓.

рдирд┐рдХрд╛рд▓

рд╣реЗ "рдХрд┐рддреА рд╡реЗрдЧрд╡рд╛рди" рдЖрд╣реЗ рд╣реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдореА рджреЛрди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░реАрд▓ рд▓реЛрдбрдЪрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд╕рдВрд▓рдЧреНрди рдХрд░реЗрди, рддреНрдпрд╛рдЪ рд╣рд╛рд░реНрдбрд╡реЗрдЕрд░рд╕рд╣ (Xeon E5-1650v2), рд╕рдорд╛рди рд░реАрддреАрдиреЗ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реЗрд▓реЗ, рд╕рдорд╛рди рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдирд▓ рд╡рд╛рдкрд░реВрди, рдкрд░рдВрддреБ iptables рдордзреНрдпреЗ NAT рдХрд░рдд рдЖрд╣реЗ. (NAT4) рдЖрдгрд┐ nftables рдордзреНрдпреЗ (NAT5).

рд▓рд┐рдирдХреНрд╕рдордзреНрдпреЗ рдЬрд▓рдж рд░рд╛рдЙрдЯрд┐рдВрдЧ рдЖрдгрд┐ NAT

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

рдорд▓рд╛ рдЖрд╢рд╛ рдЖрд╣реЗ рдХреА рд╣реА рд╕рд╛рдордЧреНрд░реА рддреНрдпрд╛рдВрдЪреНрдпрд╛ рд╕рд░реНрд╡реНрд╣рд░рдЪреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реБрдзрд╛рд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рдгрд╛рд░реНтАНрдпрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдЕрднрд┐рдпрдВрддреНрдпрд╛рдВрдирд╛ рдЙрдкрдпреБрдХреНрдд рдард░реЗрд▓.

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛