αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž•αŸ’αž›αžΌαžœαž›αžΏαž“ αž“αž·αž„ NAT αž“αŸ…αž€αŸ’αž“αž»αž„αž›αžΈαž“αž»αž…

αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ IPv4 αž€αžΆαž“αŸ‹αžαŸ‚αž”αžΆαžαŸ‹αž”αž„αŸ‹ αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαž‘αžΌαžšαž‚αž˜αž“αžΆαž‚αž˜αž“αŸαž‡αžΆαž…αŸ’αžšαžΎαž“αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžˆαž˜αž˜αž»αžαž“αžΉαž„αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž€αŸ’αž“αž»αž„αž€αžΆαžšαž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž’αžαž·αžαž·αž‡αž“αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαž“αžΌαžœαž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαž”αžŽαŸ’αžαžΆαž‰αžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αžΆαžšαž”αž€αž”αŸ’αžšαŸ‚αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž”αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αž‘αž‘αž½αž›αž”αžΆαž“ Carrier Grade NAT performance αž“αŸ…αž›αžΎ servers αž‘αŸ†αž“αž·αž‰αŸ”

αž”αž“αŸ’αžαž·αž…αž“αŸƒαž”αŸ’αžšαžœαžαŸ’αžαž·αžŸαžΆαžŸαŸ’αžšαŸ’αž

αž”αŸ’αžšαž’αžΆαž“αž”αž‘αž“αŸƒαž€αžΆαžšαž αžαŸ‹αž“αžΏαž™αž‘αŸ†αž αŸ†αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ IPv4 αž›αŸ‚αž„αž‡αžΆαžšαžΏαž„αžαŸ’αž˜αžΈαž‘αŸ€αžαž αžΎαž™αŸ” αž“αŸ…αž…αŸ†αžŽαž»αž…αž˜αž½αž™αž…αŸ†αž“αž½αž“ αž”αž‰αŸ’αž‡αžΈαžšαž„αŸ‹αž…αžΆαŸ†αž”αžΆαž“αž›αŸαž…αž‘αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„ RIPE αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αžΆαž“αž›αŸαž…αž‘αžΎαž„αžŠαŸ‚αž›αž”αŸ’αž›αž»αž€αž“αŸƒαž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‡αž½αž‰αžŠαžΌαžš αž αžΎαž™αž€αž·αž…αŸ’αž…αž–αŸ’αžšαž˜αž–αŸ’αžšαŸ€αž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž‡αž½αž›αž–αž½αž€αž‚αŸαŸ” αž”αž“αŸ’αžαž·αž…αž˜αŸ’αžŠαž„αŸ— αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαž‘αžΌαžšαž‚αž˜αž“αžΆαž‚αž˜αž“αŸαž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž•αŸ’αžαž›αŸ‹αžŸαŸαžœαžΆαž…αžΌαž›αž”αŸ’αžšαžΎαž’αŸŠαžΈαž“αž’αžΊαžŽαž·αžαžŠαŸ„αž™αž”αŸ’αžšαžΎαž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ αž“αž·αž„αž€αžΆαžšαž”αž€αž”αŸ’αžšαŸ‚αž…αŸ’αžšαž€αŸ” αž’αŸ’αž“αž€αžαŸ’αž›αŸ‡αž˜αž·αž“αž”αžΆαž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž”αžΆαž“αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž…αŸαž‰αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ "ស" αžŠαž›αŸ‹αž’αžαž·αžαž·αž‡αž“αž˜αŸ’αž“αžΆαž€αŸ‹αŸ— αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αž’αŸ’αž“αž€αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŸαž“αŸ’αžŸαŸ†αž”αŸ’αžšαžΆαž€αŸ‹αžŠαŸ„αž™αž”αžŠαž·αžŸαŸαž’αž˜αž·αž“αž‘αž·αž‰αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αž“αŸ…αž›αžΎαž‘αžΈαž•αŸ’αžŸαžΆαžšαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž”αž“αŸ’αžŸαŸ†αŸ” αž€αŸ’αžšαž»αž˜αž αŸŠαž»αž“αž•αž›αž·αžαž§αž”αž€αžšαžŽαŸαž”αžŽαŸ’αžαžΆαž‰αž”αžΆαž“αž‚αžΆαŸ†αž‘αŸ’αžšαž‚αŸ†αž“αž·αžαž“αŸαŸ‡ αž–αžΈαž–αŸ’αžšαŸ„αŸ‡ αž˜αž»αžαž„αžΆαžšαž“αŸαŸ‡αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαž‘αžΆαž˜αž‘αžΆαžšαž˜αŸ‰αžΌαžŒαž»αž›αž”αž“αŸ’αžαŸ‚αž˜ αž¬αž’αžΆαž‡αŸ’αž‰αžΆαž”αŸαžŽαŸ’αžŽαŸ” αž§αž‘αžΆαž αžšαžŽαŸ αž“αŸ…αž€αŸ’αž“αž»αž„αž‡αž½αžšαžšαž”αžŸαŸ‹ Juniper αž“αŸƒαžšαŸ‰αŸ„αžαž‘αŸαžš MX (αž›αžΎαž€αž›αŸ‚αž„αžαŸ‚ MX104 αž“αž·αž„ MX204 αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž”αŸ†αž•αž»αž) NAPT αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž“αŸ…αž›αžΎαž€αžΆαžαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ MS-MIC αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€ Cisco ASR1k αž‘αžΆαž˜αž‘αžΆαžšαž’αžΆαž‡αŸ’αž‰αžΆαž”αŸαžŽαŸ’αžŽ CGN Cisco ASR9k αž‘αžΆαž˜αž‘αžΆαžšαž˜αŸ‰αžΌαžŒαž»αž› A9K-ISM-100 αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αŸ” αž“αž·αž„αž’αžΆαž‡αŸ’αž‰αžΆαž”αŸαžŽαŸ’αžŽ A9K-CGN -LIC αž‘αŸ…αž‚αžΆαžαŸ‹αŸ” αž‡αžΆαž‘αžΌαž‘αŸ… αž€αžΆαžšαžŸαž”αŸ’αž”αžΆαž™αžαŸ’αžšαžΌαžœαž…αŸ†αžŽαžΆαž™αž”αŸ’αžšαžΆαž€αŸ‹αž…αŸ’αžšαžΎαž“αŸ”

αž’αžΆαž™αž—αžΈαž’αžΈαž’αžΈ

αž—αžΆαžšαž€αž·αž…αŸ’αž…αž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αž NAT αž˜αž·αž“αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αž˜αžΆαž“αž’αž“αž’αžΆαž“αž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαž―αž€αž‘αŸαžŸαž‘αŸ αžœαžΆαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŠαŸ„αž™αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αžΌαž‘αŸ…αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αž§αž‘αžΆαž αžšαžŽαŸαž“αŸ…αž€αŸ’αž“αž»αž„αžšαŸ‰αŸ„αžαž‘αŸαžšαž•αŸ’αž‘αŸ‡αžŽαžΆαž˜αž½αž™αŸ” αž“αŸ…αž›αžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž“αŸƒαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαž‘αžΌαžšαž‚αž˜αž“αžΆαž‚αž˜αž“αŸ αž”αž‰αŸ’αž αžΆαž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŠαŸ„αž™αž”αŸ’αžšαžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‘αŸ†αž“αž·αž‰αžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš FreeBSD (ipfw/pf) ឬ GNU/Linux (iptables) αŸ” αž™αžΎαž„αž“αžΉαž„αž˜αž·αž“αž–αž·αž…αžΆαžšαžŽαžΆ FreeBSD αž‘αŸαž–αŸ’αžšαŸ„αŸ‡ ... αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžˆαž”αŸ‹αž”αŸ’αžšαžΎ OS αž“αŸαŸ‡αž™αžΌαžšαž αžΎαž™ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αž“αŸ…αž‡αžΆαž”αŸ‹αž“αžΉαž„ GNU/LinuxαŸ”

αž€αžΆαžšαž”αžΎαž€αž€αžΆαžšαž”αž€αž”αŸ’αžšαŸ‚αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αž˜αž·αž“αž–αž·αž”αžΆαž€αž‘αžΆαž›αŸ‹αžαŸ‚αžŸαŸ„αŸ‡αŸ” αžŠαŸ†αž”αžΌαž„αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αž…αŸ’αž”αžΆαž”αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ iptables αž“αŸ…αž€αŸ’αž“αž»αž„αžαžΆαžšαžΆαž„ nat:

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

αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αžΉαž„αž•αŸ’αž‘αž»αž€αž˜αŸ‰αžΌαžŒαž»αž› nf_conntrack αžŠαŸ‚αž›αž“αžΉαž„αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž€αžΆαžšαž—αŸ’αž‡αžΆαž”αŸ‹αžŸαž€αž˜αŸ’αž˜αž‘αžΆαŸ†αž„αž’αžŸαŸ‹ αž“αž·αž„αž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž”αŸ†αž”αŸ’αž›αŸ‚αž„αž…αžΆαŸ†αž”αžΆαž…αŸ‹αŸ” αž˜αžΆαž“ subtleties αž‡αžΆαž…αŸ’αžšαžΎαž“αž“αŸ…αž‘αžΈαž“αŸαŸ‡αŸ” αž‘αžΈαž˜αž½αž™ αžŠαŸ„αž™αžŸαžΆαžšαž™αžΎαž„αž€αŸ†αž–αž»αž„αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈ 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

αžœαžΆαž€αŸαž…αžΆαŸ†αž”αžΆαž…αŸ‹αž•αž„αžŠαŸ‚αžšαž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αž…αŸ†αž“αž½αž“αž’αž»αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαžΆαžšαžΆαž„ hash αžŠαŸ‚αž›αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αžΆαžšαž•αŸ’αžŸαžΆαž™αž‘αžΆαŸ†αž„αž’αžŸαŸ‹ (αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž‡αž˜αŸ’αžšαžΎαžŸαž“αŸ…αž€αŸ’αž“αž»αž„αž˜αŸ‰αžΌαžŒαž»αž› nf_conntrack):

options nf_conntrack hashsize=1572864

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž§αž”αžΆαž™αž€αž›αžŸαžΆαž˜αž‰αŸ’αž‰αž‘αžΆαŸ†αž„αž“αŸαŸ‡ αž€αžΆαžšαžšαž…αž“αžΆαžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αžΆαŸ†αž„αžŸαŸ’αžšαž»αž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αž‘αž½αž› αžŠαŸ‚αž›αž’αžΆαž…αž”αž€αž”αŸ’αžšαŸ‚αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αž’αžαž·αžαž·αž‡αž“αž˜αž½αž™αž…αŸ†αž“αž½αž“αž’αŸ†αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αŸ’αžšαž»αž˜αžαžΆαž„αž€αŸ’αžšαŸ…αŸ” αž‘αŸ„αŸ‡αž‡αžΆαž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž“αŸƒαžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž“αŸαŸ‡αž‘αž»αž€αž±αŸ’αž™αž˜αž“αž»αžŸαŸ’αžŸαž‡αžΆαž…αŸ’αžšαžΎαž“αž…αž„αŸ‹αž”αžΆαž“αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ‰αž»αž“αž”αŸ‰αž„αž›αžΎαž€αžŠαŸ†αž”αžΌαž„αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ GNU/Linux αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ NAT (αž”αŸ’αžšαž αŸ‚αž›αž†αŸ’αž“αžΆαŸ† 2013) αžαŸ’αž‰αž»αŸ†αž’αžΆαž…αž‘αž‘αž½αž›αž”αžΆαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αŸ’αžšαž αŸ‚αž› 7Gbit/s αž“αŸ… 0.8Mpps αž€αŸ’αž“αž»αž„αž˜αž½αž™ server (Xeon E5-1650v2)αŸ” αž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαž–αŸαž›αž“αŸ„αŸ‡αž˜αž€ αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆαž‡αžΆαž…αŸ’αžšαžΎαž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž‘αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„αž‡αž„αŸ‹αž”αžŽαŸ’αžαžΆαž‰αžαžΊαžŽαŸ‚αž› GNU/Linux αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸƒαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž˜αž½αž™αž“αŸ…αž›αžΎαž•αŸ’αž“αŸ‚αž€αžšαžΉαž„αžŠαžΌαž…αž‚αŸ’αž“αžΆαž”αžΆαž“αž€αžΎαž“αž‘αžΎαž„αžŠαž›αŸ‹αžŸαŸ’αž‘αžΎαžšαžαŸ‚ 18-19 Gbit/s αž“αŸ… 1.8-1.9 Mpps (αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž‚αžΊαž‡αžΆαžαž˜αŸ’αž›αŸƒαž’αžαž·αž”αžšαž˜αžΆ) αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αžšαž·αž˜αžΆαžŽαž…αžšαžΆαž…αžšαžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ„αž™αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžαŸ‚αž˜αž½αž™αž”αžΆαž“αž€αžΎαž“αž‘αžΎαž„αž›αžΏαž“αž‡αžΆαž„αž˜αž»αž“αŸ” αž‡αžΆαž›αž‘αŸ’αž’αž•αž› αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž±αŸ’αž™αž˜αžΆαž“αžαž»αž›αŸ’αž™αž—αžΆαž–αž“αŸƒαž”αž“αŸ’αž‘αž»αž€αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αž”αžΆαž“αž”αž„αŸ’αž€αžΎαž“αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž“αŸƒαž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ αž€αžΆαžšαžαŸ‚αžšαž€αŸ’αžŸαžΆ αž“αž·αž„αžšαž€αŸ’αžŸαžΆαž‚αž»αžŽαž—αžΆαž–αž“αŸƒαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αžαž›αŸ‹αŸ”

NTFables

αžŸαž–αŸ’αžœαžαŸ’αž„αŸƒαž“αŸαŸ‡ αž“αž·αž“αŸ’αž“αžΆαž€αžΆαžšαž˜αŸ‰αžΌαžŠαž‘αžΆαž“αŸ‹αžŸαž˜αŸαž™αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ "αž€αžΆαž”αžΌαž”αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš" αž‚αžΊαž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ DPDK αž“αž·αž„ XDP αŸ” αž’αžαŸ’αžαž”αž‘αž‡αžΆαž…αŸ’αžšαžΎαž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž›αžΎαž”αŸ’αžšαž’αžΆαž“αž”αž‘αž“αŸαŸ‡ αžŸαž»αž“αŸ’αž‘αžšαž€αžαžΆαž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆαž‡αžΆαž…αŸ’αžšαžΎαž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž‘αžΎαž„ αž αžΎαž™αž•αž›αž·αžαž•αž›αž–αžΆαžŽαž·αž‡αŸ’αž‡αž€αž˜αŸ’αž˜αž€αŸ†αž–αž»αž„αž›αŸαž…αž‘αžΎαž„ (αž§αž‘αžΆαž αžšαžŽαŸ SKAT αž–αžΈ VasExperts)αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŠαŸ„αž™αžŸαžΆαžšαž’αž“αž’αžΆαž“αžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž˜αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž”αžŸαŸ‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαž‘αžΌαžšαž‚αž˜αž“αžΆαž‚αž˜αž“αŸ αžœαžΆαž–αž·αžαž‡αžΆαž˜αžΆαž“αž”αž‰αŸ’αž αžΆαž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž "αž•αž›αž·αžαž•αž›" αžŽαžΆαž˜αž½αž™αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒαž‘αžΆαŸ†αž„αž“αŸαŸ‡αžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αŸ” αžœαžΆαž“αžΉαž„αž€αžΆαž“αŸ‹αžαŸ‚αž›αŸ†αž”αžΆαž€αž€αŸ’αž“αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αŸ‚αž”αž“αŸαŸ‡αž“αžΆαž–αŸαž›αž’αž“αžΆαž‚αž αž‡αžΆαž–αž·αžŸαŸαžŸ αž§αž”αž€αžšαžŽαŸαžœαž·αž“αž·αž…αŸ’αž†αŸαž™αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αž„αŸ’αž€αžΎαžαŸ” αž§αž‘αžΆαž αžšαžŽαŸ tcpdump αžŸαŸ’αžŠαž„αŸ‹αžŠαžΆαžšαž‡αžΆαž˜αž½αž™ DPDK αž“αžΉαž„αž˜αž·αž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαžΌαž…αž“αŸ„αŸ‡αž‘αŸ αž αžΎαž™αžœαžΆαž“αžΉαž„αž˜αž·αž“ "αžƒαžΎαž‰" αž€αž‰αŸ’αž…αž”αŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αž‰αžΎαžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ…αžαŸ’αžŸαž—αŸ’αž›αžΎαž„αžŠαŸ„αž™αž”αŸ’αžšαžΎ XDP αž‘αŸαŸ” αž…αŸ†αž–αŸαž›αž˜αžΆαž“αž€αžΆαžšαž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž’αŸ†αž–αžΈαž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆαžαŸ’αž˜αžΈαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž‰αŸ’αž…αŸαž‰αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž”αž“αŸ’αžαž‘αŸ…αž€αžΆαž“αŸ‹αž€αž“αŸ’αž›αŸ‚αž„αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž–αž½αž€αž‚αŸαž˜αž·αž“αž˜αžΆαž“αž€αžΆαžšαž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸ αžšαž”αžΆαž™αž€αžΆαžšαžŽαŸ ΠΈ αž’αžαŸ’αžαž”αž‘ Pablo Neira Ayuso αž’αŸ’αž“αž€αžαŸ‚αž‘αžΆαŸ† iptables αž’αŸ†αž–αžΈαž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸƒαž›αŸ†αž αžΌαžš offloading αž“αŸ…αž€αŸ’αž“αž»αž„ nftables αŸ” αž…αžΌαžšαž™αžΎαž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž±αŸ’αž™αž€αžΆαž“αŸ‹αžαŸ‚αž…αŸ’αž”αžΆαžŸαŸ‹αž’αŸ†αž–αžΈαž™αž“αŸ’αžαž€αžΆαžšαž“αŸαŸ‡αŸ”

αž‚αŸ†αž“αž·αžαžŸαŸ†αžαžΆαž“αŸ‹αž‚αžΊαžαžΆαž”αŸ’αžšαžŸαž·αž“αž”αžΎαžšαŸ‰αŸ„αžαž‘αŸαžšαž”αžΆαž“αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž–αžΈαžœαž‚αŸ’αž‚αž˜αž½αž™αž€αŸ’αž“αž»αž„αž‘αž·αžŸαžŠαŸ…αž‘αžΆαŸ†αž„αž–αžΈαžšαž“αŸƒαž›αŸ†αž αžΌαžš (αžŸαž˜αŸαž™ TCP αž”αžΆαž“αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž“αž—αžΆαž– ESTABLISHED) αž“αŸ„αŸ‡αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž“αŸƒαžœαž‚αŸ’αž‚αž“αŸαŸ‡αžαžΆαž˜αžšαž™αŸˆαž…αŸ’αž”αžΆαž”αŸ‹αž‡αž‰αŸ’αž‡αžΆαŸ†αž„αž—αŸ’αž›αžΎαž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ„αŸ‡αž‘αŸ αž–αŸ’αžšαŸ„αŸ‡ αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αž“αžΉαž„αž“αŸ…αžαŸ‚αž”αž‰αŸ’αž…αž”αŸ‹αžŠαŸ„αž™αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‘αŸαžšαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαž‘αŸ…αž€αžΆαž“αŸ‹αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αž”αž“αŸ’αžαŸ” αž αžΎαž™αž™αžΎαž„αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž•αŸ’αž›αžΌαžœαž‘αŸ - αž™αžΎαž„αžŠαžΉαž„αžšαž½αž…αž αžΎαž™αž’αŸ†αž–αžΈαž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αž˜αž½αž™αžŽαžΆ αž“αž·αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αž½αž™αžŽαžΆαžŠαŸ‚αž›αž™αžΎαž„αžαŸ’αžšαžΌαžœαž•αŸ’αž‰αžΎαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αžœαž‚αŸ’αž‚αž“αŸαŸ‡αŸ” αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž“αŸ…αžŸαŸαžŸαžŸαž›αŸ‹αž‚αžΊαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž–αŸαžαŸŒαž˜αžΆαž“αž“αŸαŸ‡ αž αžΎαž™αž”αŸ’αžšαžΎαžœαžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ†αžŽαžαŸ‹αž•αŸ’αž›αžΌαžœαž“αŸ…αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αžŠαŸ†αž”αžΌαž„αž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αŸ” αž“αŸ…αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš NAT αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžαŸ’αžšαžΌαžœαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž–αŸαžαŸŒαž˜αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž’αŸ†αž–αžΈαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ αž“αž·αž„αž…αŸ’αžšαž€αžŠαŸ‚αž›αž”αž€αž”αŸ’αžšαŸ‚αžŠαŸ„αž™αž˜αŸ‰αžΌαžŒαž»αž› nf_conntrack αŸ” αž”αžΆαž‘/αž…αžΆαžŸαŸŽ αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡αž”αŸ‰αžΌαž›αžΈαžŸαž•αŸ’αžŸαŸαž„αŸ— αž“αž·αž„αž–αŸαžαŸŒαž˜αžΆαž“ αž“αž·αž„αž…αŸ’αž”αžΆαž”αŸ‹αžŸαŸ’αžαž·αžαž·αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž“αŸ…αž€αŸ’αž“αž»αž„ iptables αžˆαž”αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒαž“αŸƒαž—αžΆαžšαž€αž·αž…αŸ’αž…αžšαž”αžŸαŸ‹ NAT αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€ αž¬αž§αž‘αžΆαž αžšαžŽαŸαž–αŸ’αžšαŸ†αžŠαŸ‚αž“ αžœαžΆαž˜αž·αž“αžŸαŸ†αžαžΆαž“αŸ‹αž‘αŸ αž–αžΈαž–αŸ’αžšαŸ„αŸ‡αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αŸ‚αž€αž…αžΆαž™αž“αŸ…αž‘αžΌαž‘αžΆαŸ†αž„αž§αž”αž€αžšαžŽαŸαŸ”

αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹β€‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’

αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαžΎαž˜αž»αžαž„αžΆαžšαž“αŸαŸ‡ αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαŸ–

  • αž”αŸ’αžšαžΎαžαžΊαžŽαŸ‚αž›αžŸαŸ’αžšαžŸαŸ‹αŸ” αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž€αžΆαžšαž–αž·αžαžŠαŸ‚αž›αžαžΆαž˜αž»αžαž„αžΆαžšαžαŸ’αž›αž½αž“αžœαžΆαž”αž„αŸ’αž αžΆαž‰αžαŸ’αž›αž½αž“αž“αŸ…αž€αŸ’αž“αž»αž„αžαžΊαžŽαŸ‚αž› 4.16 αž€αŸαžŠαŸ„αž™αž€αŸαžœαžΆ "αž†αŸ…" αž’αžŸαŸ‹αžšαž™αŸˆαž–αŸαž›αž‡αžΆαž™αžΌαžšαž˜αž€αž αžΎαž™αž αžΎαž™αž”αžŽαŸ’αžαžΆαž›αž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαž—αŸαž™αžŸαŸ’αž›αž“αŸ‹αžŸαŸ’αž›αŸ„αžšαž”αžŸαŸ‹αžαžΊαžŽαŸ‚αž›αž‡αžΆαž‘αŸ€αž„αž‘αžΆαžαŸ‹αŸ” αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž˜αžΆαž“αžŸαŸ’αžαŸαžšαž—αžΆαž–αž“αŸ…αž‡αž»αŸ†αžœαž·αž‰αžαŸ‚αž’αŸ’αž“αžΌ αž†αŸ’αž“αžΆαŸ† 2019 αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžαžΊαžŽαŸ‚αž› LTS 4.19.90 αž“αž·αž„ 5.4.5 αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αŸαž‰αž•αŸ’αžŸαžΆαž™αŸ”
  • αžŸαžšαžŸαŸαžšαž…αŸ’αž”αžΆαž”αŸ‹ iptables αž‘αžΎαž„αžœαž·αž‰αž‡αžΆαž‘αž˜αŸ’αžšαž„αŸ‹ nftables αžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αŸ†αžŽαŸ‚ nftables αžαŸ’αž˜αžΈαŸ—αž“αŸαŸ‡αŸ” αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αž–αž·αžαž”αŸ’αžšαžΆαž€αžŠαž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαŸ‚ 0.9.0

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αžœαžΈαŸ—αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‡αžΆαž‚αŸ„αž›αž€αžΆαžšαžŽαŸαž…αŸ’αž”αžΆαžŸαŸ‹αž›αžΆαžŸαŸ‹αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž…αŸ†αžŽαž»αž…αž‘αžΈαž˜αž½αž™ αžšαžΏαž„αžŸαŸ†αžαžΆαž“αŸ‹αž‚αžΊαž€αž»αŸ†αž—αŸ’αž›αŸαž…αž”αž‰αŸ’αž…αžΌαž›αž˜αŸ‰αžΌαžŒαž»αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αŸ†αž‘αž»αž„αž–αŸαž›αž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆ (CONFIG_NFT_FLOW_OFFLOAD=m) αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž…αŸ†αžŽαž»αž…αž‘αžΈαž–αžΈαžšαž‘αžΆαž˜αž‘αžΆαžšαž€αžΆαžšαž–αž“αŸ’αž™αž›αŸ‹αŸ” αž…αŸ’αž”αžΆαž”αŸ‹ nftables αžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαžαž»αžŸαž‚αŸ’αž“αžΆαž‘αžΆαŸ†αž„αžŸαŸ’αžšαž»αž„αž‡αžΆαž„αž“αŸ…αž€αŸ’αž“αž»αž„ iptables αŸ” αž―αž€αžŸαžΆαžš αž”αž„αŸ’αž αžΆαž‰αž…αŸ†αžŽαž»αž…αžŸαŸ’αž‘αžΎαžšαžαŸ‚αž‘αžΆαŸ†αž„αž’αžŸαŸ‹ αž€αŸαž˜αžΆαž“αž…αŸ†αžŽαž»αž…αž–αž·αžŸαŸαžŸαž•αž„αžŠαŸ‚αžšαŸ” αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž˜αŸ’αž›αŸ‚αž„ αž…αŸ’αž”αžΆαž”αŸ‹αž–αžΈ iptables αž‘αŸ… nftables αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž›αžΎαž€αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ NAT αž“αž·αž„αž›αŸ†αž αžΌαžš offload αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αž§αž‘αžΆαž αžšαžŽαŸαžšαžΏαž„αž–αŸ’αžšαŸαž„αžαžΌαž…αž˜αž½αž™αŸ– , - αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αž”αžŽαŸ’αžαžΆαž‰αžŠαŸ‚αž›αž…αžšαžΆαž…αžšαž†αŸ’αž›αž„αž€αžΆαžαŸ‹; αžαžΆαž˜αž–αž·αžαžœαžΆαž’αžΆαž…αž˜αžΆαž“αž…αŸ’αžšαžΎαž“αž‡αžΆαž„αž–αžΈαžšαž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αž–αž½αž€αž‚αŸαŸ” , - αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž“αž·αž„αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸƒαž‡αž½αžšαž“αŸƒαž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ "ស" αŸ”

αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ 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
        }
}

αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž›αŸ†αž αžΌαžš offload αžœαžΆαž˜αžΆαž“αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž”αž“αŸ’αžαž·αž… αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž’αžΆαž…αž™αž›αŸ‹αž”αžΆαž“αŸ–

#! /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 αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αžΉαž„αž’αŸ’αž›αžΆαž€αŸ‹αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αžαžΆαžšαžΆαž„ fastnat αž αžΎαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αžΏαž“αž‡αžΆαž„αž˜αž»αž“αŸ”

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹

αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž…αŸ’αž”αžΆαžŸαŸ‹αžαžΆαžαžΎαžœαžΆαž›αžΏαž“αž”αŸ‰αž»αžŽαŸ’αžŽαžΆ αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž—αŸ’αž‡αžΆαž”αŸ‹αžšαžΌαž”αžαžαž’αŸαž€αŸ’αžšαž„αŸ‹αž“αŸƒαž€αžΆαžšαž•αŸ’αž‘αž»αž€αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž–αž·αžαž–αžΈαžš αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž•αŸ’αž“αŸ‚αž€αžšαžΉαž„αžŠαžΌαž…αž‚αŸ’αž“αžΆ (Xeon E5-1650v2) αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαžΌαž…αž‚αŸ’αž“αžΆ αžŠαŸ„αž™αž”αŸ’αžšαžΎαžαžΊαžŽαŸ‚αž›αž›αžΈαž“αž»αž…αžŠαžΌαž…αž‚αŸ’αž“αžΆ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš NAT αž“αŸ…αž€αŸ’αž“αž»αž„ iptables (NAT4) αž“αž·αž„αž€αŸ’αž“αž»αž„ nftables (NAT5)αŸ”

αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž•αŸ’αž›αžΌαžœαž›αžΏαž“ αž“αž·αž„ NAT αž“αŸ…αž€αŸ’αž“αž»αž„αž›αžΈαž“αž»αž…

αž˜αž·αž“αž˜αžΆαž“αž€αŸ’αžšαžΆαž αŸ’αžœαž“αŸƒαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž€αŸ’αž“αž»αž„αž˜αž½αž™αžœαž·αž“αžΆαž‘αžΈαž“αŸ…αž€αŸ’αž“αž»αž„αžšαžΌαž”αžαžαž’αŸαž€αŸ’αžšαž„αŸ‹αž“αŸ„αŸ‡αž‘αŸαž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αž•αŸ’αž‘αž»αž€αž“αŸƒαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž‘αŸ†αž αŸ†αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž‡αžΆαž˜αž’αŸ’αž™αž˜αž‚αžΊαž“αŸ…αž‡αž»αŸ†αžœαž·αž‰ 800 αž”αŸƒ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžαž˜αŸ’αž›αŸƒαžˆαžΆαž“αžŠαž›αŸ‹ 1.5Mpps αŸ” αžŠαžΌαž…αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αžƒαžΎαž‰αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžŠαŸ‚αž›αž˜αžΆαž“ nftables αž˜αžΆαž“αž‘αž»αž“αž”αž˜αŸ’αžšαž»αž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸαž’αŸ†αŸ” αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“ αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž“αŸαŸ‡αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžšαž αžΌαžαžŠαž›αŸ‹ 30Gbit/s αž“αŸ…αž›αŸ’αž”αžΏαž“ 3Mpps αž αžΎαž™αž…αŸ’αž”αžΆαžŸαŸ‹αžŽαžΆαžŸαŸ‹αžαžΆαž’αžΆαž…αž”αŸ†αž–αŸαž‰αžαžΆαž˜αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž”αžŽαŸ’αžαžΆαž‰αž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αž“αŸƒ 40Gbps αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αž˜αžΆαž“αž’αž“αž’αžΆαž“ CPU αž₯αžαž‚αž·αžαžαŸ’αž›αŸƒαŸ”

αžαŸ’αž‰αž»αŸ†αžŸαž„αŸ’αžƒαžΉαž˜αžαžΆαžŸαž˜αŸ’αž—αžΆαžšαŸˆαž“αŸαŸ‡αž“αžΉαž„αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαžŠαž›αŸ‹αžœαž·αžŸαŸ’αžœαž€αžšαž”αžŽαŸ’αžαžΆαž‰αžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αž–αŸ’αž™αžΆαž™αžΆαž˜αž€αŸ‚αž›αž˜αŸ’αž’αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸƒαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹