ืฉื ืขืœ ืจื•ื˜ื™ื ื’ ืื•ืŸ NAT ืื™ืŸ ืœื™ื ื•ืงืก

ื•ื•ื™ IPv4 ืึทื“ืจืขืกืขืก ื•ื•ืขืจืŸ ื“ื™ืคึผืœื™ื˜ื™ื“, ืคื™ืœืข ื˜ืขืœืขืงืึธื ืึธืคึผืขืจื™ื™ื˜ืขืจื– ื–ืขื ืขืŸ ืคื™ื™ืกื˜ ืžื™ื˜ ื“ื™ ื ื•ื™ื˜ ืฆื• ืฆื•ืฉื˜ืขืœืŸ ื–ื™ื™ืขืจ ืงืœื™ื™ืึทื ืฅ ื ืขืฅ ืึทืงืกืขืก ื ื™ืฆืŸ ืึทื“ืจืขืก ืื™ื‘ืขืจื–ืขืฆื•ื ื’. ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ืื™ืš ื•ื•ืขื˜ ื–ืึธื’ืŸ ืื™ืจ ื•ื•ื™ ืื™ืจ ืงืขื ืขืŸ ื‘ืึทืงื•ืžืขืŸ ืงืึทืจื™ืขืจ ื’ืจืึทื“ืข NAT ืคืึธืจืฉื˜ืขืœื•ื ื’ ืื•ื™ืฃ ืกื›ื•ื™ืจืข ืกืขืจื•ื•ืขืจืก.

ื ื‘ื™ืกืœ ืคื•ืŸ ื’ืขืฉื™ื›ื˜ืข

ื“ื™ ื˜ืขืžืข ืคื•ืŸ โ€‹โ€‹IPv4 ืึทื“ืจืขืก ืคึผืœืึทืฅ ื™ื’ื–ืึธืกื˜ืฉืึทืŸ ืื™ื– ื ื™ื˜ ืžืขืจ ื ื™ื™ึท. ืื™ืŸ ืขื˜ืœืขื›ืข ืคื•ื ื˜, ื•ื•ืืจื˜ืŸ ืจืฉื™ืžื•ืช ืืจื•ื™ืก ืื™ืŸ RIPE, ื“ืขืžืึธืœื˜ ื™ืงืกื˜ืฉื™ื™ื ื“ื–ืฉื™ื– ื™ืžืขืจื“ื–ืฉื“ ืื•ื™ืฃ ื•ื•ืึธืก ื‘ืœืึทืงืก ืคื•ืŸ ืึทื“ืจืขืกืขืก ื–ืขื ืขืŸ ื’ืขื•ื•ืขืŸ ื˜ืจื™ื™ื“ื™ื“ ืื•ืŸ ื“ื™ืœื– ื–ืขื ืขืŸ ื’ืขืคื•ื ืขืŸ ืฆื• ื“ื™ื ื’ืขืŸ ื–ื™ื™. ื‘ื™ืกืœืขื›ื•ื•ื™ื™ึทื–, ื˜ืขืœืขืงืึธื ืึธืคึผืขืจื™ื™ื˜ืขืจื– ืื ื’ืขื”ื•ื™ื‘ืŸ ืฆื• ืฆื•ืฉื˜ืขืœืŸ ืื™ื ื˜ืขืจื ืขื˜ ืึทืงืกืขืก ื‘ืึทื“ื™ื ื•ื ื’ืก ื ื™ืฆืŸ ืึทื“ืจืขืก ืื•ืŸ ืคึผืึธืจื˜ ืื™ื‘ืขืจื–ืขืฆื•ื ื’. ืขื˜ืœืขื›ืข ื”ืึธื‘ืŸ ื ื™ื˜ ื’ืขืจืื˜ืŸ ืฆื• ื‘ืึทืงื•ืžืขืŸ ื’ืขื ื•ื’ ืึทื“ืจืขืกืขืก ืฆื• ืึทืจื•ื™ืกื’ืขื‘ืŸ ืึท "ื•ื•ื™ื™ึทืก" ืึทื“ืจืขืก ืฆื• ื™ืขื“ืขืจ ืึทื‘ืึธื ืขื ื˜, ื‘ืฉืขืช ืื ื“ืขืจืข ืื ื’ืขื”ื•ื™ื‘ืŸ ืฆื• ืฉืคึผืึธืจืŸ ื’ืขืœื˜ ื“ื•ืจืš ืึธืคึผื–ืึธื’ืŸ ืฆื• ืงื•ื™ืคืŸ ืึทื“ืจืขืกืขืก ืื•ื™ืฃ ื“ื™ ืฆื•ื•ื™ื™ื˜ื™ืง ืžืึทืจืง. ืžืึทื ื™ืึทืคืึทืงื˜ืฉืขืจืขืจื– ืคื•ืŸ ื ืขืฅ ื•ื™ืกืจื™ื›ื˜ ื’ืขืฉื˜ื™ืฆื˜ ื“ืขื ื’ืขื“ืึทื ืง, ื•ื•ื™ื™ึทืœ ื“ืขื ืคืึทื ื’ืงืฉืึทื ืึทืœื™ื˜ื™ ื™ื•ื–ืฉืึทื•ื•ืึทืœื™ ืจื™ืงื•ื•ื™ื™ืขืจื– ื ืึธืš ื’ืขืฉืคึผืจื™ื™ื˜ ืžืึทื“ื–ืฉื•ืœื– ืึธื“ืขืจ ืœื™ื™ืกืึทื ืกื™ื–. ืœืžืฉืœ, ืื™ืŸ ื“ื–ืฉื•ื ื™ืคึผืขืจ ืก ืฉื•ืจื” ืคื•ืŸ ืžืงืก ืจืึธื•ื˜ืขืจืก (ืึทื—ื•ืฅ ืคึฟืึทืจ ื“ื™ ืœืขืฆื˜ืข MX104 ืื•ืŸ MX204), ืื™ืจ ืงืขื ืขืŸ ื“ื•ืจื›ืคื™ืจืŸ NAPT ืื•ื™ืฃ ืึท ื‘ืึทื–ื•ื ื“ืขืจ MS-MIC ื“ื™ื ืกื˜ ืงืึธืจื˜, Cisco ASR1k ืจื™ืงื•ื•ื™ื™ืขืจื– ืึท CGN ื“ืขืจืœื•ื™ื‘ืขื ื™ืฉ, Cisco ASR9k ืจื™ืงื•ื•ื™ื™ืขืจื– ืึท ื‘ืึทื–ื•ื ื“ืขืจ A9K-ISM-100 ืžืึธื“ื•ืœืข. ืื•ืŸ ืึท A9K-CGN ื“ืขืจืœื•ื™ื‘ืขื ื™ืฉ -LIC ืฆื• ืื™ื. ืื™ืŸ ืึทืœื’ืขืžื™ื™ืŸ, ื“ื™ ืคืึทืจื’ืขื ื™ื’ืŸ ืงืึธืก ืึท ืคึผืœืึทืฅ ืคื•ืŸ ื’ืขืœื˜.

IPTables

ื“ื™ ืึทืจื‘ืขื˜ ืคื•ืŸ ืคึผืขืจืคืึธืจืžื™ื ื’ NAT ื˜ื•ื˜ ื ื™ืฉื˜ ื“ืึทืจืคืŸ ืกืคึผืขืฉืึทืœื™ื™ื–ื“ ืงืึทืžืคึผื™ื•ื˜ื™ื ื’ ืจืขืกื•ืจืกืŸ; ืขืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ืกืึทืœื•ื•ื“ ื“ื•ืจืš ื’ืขื ืขืจืึทืœ-ืฆื™ืœ ืคึผืจืึทืกืขืกืขืจื– ื•ื•ืึธืก ื–ืขื ืขืŸ ืื™ื ืกื˜ืึทืœื™ืจืŸ, ืœืžืฉืœ, ืื™ืŸ ืงื™ื™ืŸ ื”ื™ื™ื ืจืึทื•ื˜ืขืจ. ืื•ื™ืฃ ื“ื™ ื•ื•ืึธื’ ืคื•ืŸ ืึท ื˜ืขืœืขืงืึธื ืึธืคึผืขืจืึทื˜ืึธืจ, ื“ืขื ืคึผืจืึธื‘ืœืขื ืงืขื ืขืŸ ื–ื™ื™ืŸ ืกืึทืœื•ื•ื“ ื ื™ืฆืŸ ืกื›ื•ื™ืจืข ืกืขืจื•ื•ืขืจืก ืžื™ื˜ FreeBSD (ipfw/pf) ืึธื“ืขืจ GNU/Linux (iptables). ืžื™ืจ ื•ื•ืขืœืŸ ื ื™ืฉื˜ ื‘ืึทื˜ืจืึทื›ื˜ืŸ FreeBSD, ื•ื•ื™ื™ึทืœ ... ืื™ืš ืคืืจืฉื˜ืืคื˜ ื ื™ืฆืŸ ื“ืขื ืึทืก ื’ืึทื ืฅ ืึท ืœืึทื ื’ ืฆื™ื™ึทื˜ ืฆื•ืจื™ืง, ืึทื–ื•ื™ ืžื™ืจ ื•ื•ืขืœืŸ ืฉื˜ืขืงืŸ ืฆื• GNU / ืœื™ื ื•ืงืก.

ืขื ื™ื™ื‘ืึทืœื™ื ื’ ืึทื“ืจืขืก ืื™ื‘ืขืจื–ืขืฆื•ื ื’ ืื™ื– ื ื™ืฉื˜ ืฉื•ื•ืขืจ. ืขืจืฉื˜ืขืจ ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืจืขื’ื™ืกื˜ืจื™ืจืŸ ืึท ื”ืขืจืฉืŸ ืื™ืŸ 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

ื ืึธืš ื“ื™ ืคึผืฉื•ื˜ ืžืึทื ื™ืคึผื™ืึทืœื™ื™ืฉืึทื ื–, ืึท ื’ืึธืจ ืืจื‘ืขื˜ืŸ ืคึผืœืึทืŸ ืื™ื– ื‘ืืงื•ืžืขืŸ ื•ื•ืึธืก ืงืขื ืขืŸ ืื™ื‘ืขืจื–ืขืฆืŸ ืึท ื’ืจื•ื™ืก ื ื•ืžืขืจ ืคื•ืŸ ืงืœื™ืขื ื˜ ืึทื“ืจืขืกืขืก ืื™ืŸ ืึท ื‘ืขืงืŸ ืคื•ืŸ ืคื•ื ื“ืจื•ื™ืกื ื“ื™ืง ืึธื ืขืก. ืึธื‘ืขืจ, ื“ื™ ืคืึธืจืฉื˜ืขืœื•ื ื’ ืคื•ืŸ ื“ืขื ืœื™ื™ื–ื•ื ื’ ืœืึธื–ืŸ ืคื™ืœ ืฆื• ื–ื™ื™ืŸ ื’ืขื•ื•ืืœื˜. ืื™ืŸ ืžื™ื™ืŸ ืขืจืฉื˜ืขืจ ืคืจื•ื•ื•ืŸ ืฆื• ื ื•ืฆืŸ GNU/Linux ืคึฟืึทืจ NAT (ืึทืจื•ื 2013), ืื™ืš ืื™ื– ื’ืขื•ื•ืขืŸ ื‘ื™ื›ื•ืœืช ืฆื• ื‘ืึทืงื•ืžืขืŸ ืคืึธืจืฉื˜ืขืœื•ื ื’ ืคื•ืŸ ืึทืจื•ื 7Gbit/s ื‘ื™ื™ 0.8Mpps ืคึผืขืจ ืกืขืจื•ื•ืขืจ (Xeon E5-1650v2). ื–ื™ื ื˜ ื“ืขืจ ืฆื™ื™ื˜, ืคื™ืœืข ืคืึทืจืฉื™ื“ืขื ืข ืึธืคึผื˜ื™ืžื™ื–ืึทื˜ื™ืึธื ืก ื–ืขื ืขืŸ ื’ืขืžืื›ื˜ ืื™ืŸ ื“ื™ GNU / Linux ืงืขืจืŸ ื ืขืฅ ืึธื ืœื™ื™ื’ืŸ, ื“ื™ ืคืึธืจืฉื˜ืขืœื•ื ื’ ืคื•ืŸ ืื™ื™ืŸ ืกืขืจื•ื•ืขืจ ืื•ื™ืฃ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ื™ื™ึทื–ื ื•ื•ืึทืจื’ ืื™ื– ื’ืขื•ื•ืืงืกืŸ ืฆื• ื›ึผืžืขื˜ 18-19 Gbit / s ื‘ื™ื™ 1.8-1.9 Mpps (ื“ืึธืก ื–ืขื ืขืŸ ื“ื™ ืžืึทืงืกื™ืžื•ื ื•ื•ืึทืœื•ืขืก) , ืึธื‘ืขืจ ื“ื™ ืคืึธื“ืขืจื•ื ื’ ืคึฟืึทืจ ืคืึทืจืงืขืจ ื‘ืึทื ื“, ืคึผืจืึทืกืขืกื˜ ื“ื•ืจืš ืื™ื™ืŸ ืกืขืจื•ื•ืขืจ ื’ืขื•ื•ืืงืกืŸ ืคื™ืœ ืคืึทืกื˜ืขืจ. ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜, ืกืงื™ืžื– ื–ืขื ืขืŸ ื“ืขื•ื•ืขืœืึธืคึผืขื“ ืฆื• ื‘ืึทืœืึทื ืกื™ืจืŸ ื“ื™ ืžืึทืกืข ืื•ื™ืฃ ืคืึทืจืฉื™ื“ืขื ืข ืกืขืจื•ื•ืขืจืก, ืึธื‘ืขืจ ืึทืœืข ื“ืขื ื’ืขื•ื•ืืงืกืŸ ื“ื™ ืงืึทืžืคึผืœืขืงืกื™ื˜ื™ ืคื•ืŸ ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ, ืžื™ื™ื ื˜ื™ื™ื ื™ื ื’ ืื•ืŸ ืžื™ื™ื ื˜ื™ื™ื ื™ื ื’ ื“ื™ ืงื•ื•ืึทืœื™ื˜ืขื˜ ืคื•ืŸ ื“ื™ ืกืขืจื•ื•ื™ืกืขืก ืฆื•ื’ืขืฉื˜ืขืœื˜.

ื ืคื˜ืึทื‘ืœืขืก

ื ืึธื•ื•ืึทื“ื™ื™ึทืก, ืึท ืžืึธื“ืขืจืŸ ื’ืึทื ื’ ืื™ืŸ ื•ื•ื™ื™ื›ื•ื•ืืจื’ "ืฉื™ืคื˜ื™ื ื’ ื‘ืึทื’ืก" ืื™ื– ื“ื™ ื ื•ืฆืŸ ืคื•ืŸ DPDK ืื•ืŸ XDP. ืขืก ื–ืขื ืขืŸ ื’ืขืฉืจื™ื‘ืŸ ืคื™ืœืข ืึทืจื˜ื™ืงืœืขืŸ ืื•ื™ืฃ ื“ืขื ื˜ืขืžืข, ืคื™ืœืข ืคืึทืจืฉื™ื“ืขื ืข ืจืขื“ืขืก ื–ืขื ืขืŸ ื’ืขืžืื›ื˜ ืื•ืŸ ื’ืขืฉืขืคื˜ ืคึผืจืึธื“ื•ืงื˜ืŸ (ืœืžืฉืœ, SKAT ืคื•ืŸ VasExperts). ืึธื‘ืขืจ ื’ืขื’ืขื‘ืŸ ื“ื™ ืœื™ืžื™ื˜ืขื“ ืคึผืจืึธื’ืจืึทืžืžื™ื ื’ ืจืขืกื•ืจืกืŸ ืคื•ืŸ ื˜ืขืœืขืงืึธื ืึธืคึผืขืจื™ื™ื˜ืขืจื–, ืขืก ืื™ื– ื’ืึทื ืฅ ืคึผืจืึธื‘ืœืขืžืึทื˜ื™ืง ืฆื• ืฉืึทืคึฟืŸ ืงื™ื™ืŸ "ืคึผืจืึธื“ื•ืงื˜" ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ื“ื™ ืคืจืึทืžืขื•ื•ืึธืจืงืก ืื•ื™ืฃ ื“ื™ื™ืŸ ืื™ื™ื’ืŸ. ืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ืคื™ืœ ืžืขืจ ืฉื•ื•ืขืจ ืฆื• ืึทืจื‘ืขื˜ืŸ ืึทื–ืึท ืึท ืœื™ื™ื–ื•ื ื’ ืื™ืŸ ื“ืขืจ ืฆื•ืงื•ื ืคึฟื˜; ืกืคึผืขืฆื™ืขืœ ื“ื™ืึทื’ื ืึธืกื˜ื™ืง ืžื›ืฉื™ืจื™ื ื•ื•ืขื˜ ื–ื™ื™ืŸ ื“ืขื•ื•ืขืœืึธืคึผืขื“. ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ื ืึธืจืžืึทืœ tcpdump ืžื™ื˜ DPDK ื•ื•ืขื˜ ื ื™ืฉื˜ ืึทืจื‘ืขื˜ืŸ ืคึผื•ื ืงื˜ ืึทื–ื•ื™, ืื•ืŸ ืขืก ื•ื•ืขื˜ ื ื™ืฉื˜ "ื–ืขืŸ" ืคึผืึทืงื™ืฅ ื’ืขืฉื™ืงื˜ ืฆื•ืจื™ืง ืฆื• ื“ื™ ื•ื•ื™ืจืขืก ื ื™ืฆืŸ XDP. ืฆื•ื•ื™ืฉืŸ ืึทืœืข ื“ื™ ืจืขื“ืŸ ื•ื•ืขื’ืŸ ื ื™ื™ึทืข ื˜ืขืงื ืึทืœืึทื“ื–ืฉื™ื– ืคึฟืึทืจ ืึทื•ื˜ืคึผื•ืฅ ืคึผืึทืงืึทื˜ ืคืึธืจื•ื•ืขืจื“ื™ื ื’ ืฆื• ื‘ืึทื ื™ืฆืขืจ-ืคึผืœืึทืฅ, ื–ื™ื™ ื–ืขื ืขืŸ ืึทื ื ืึธื•ื˜ื™ืกื˜ ืžืขืœื“ืขื˜ ะธ ืึทืจื˜ื™ืงืœ Pablo Neira Ayuso, ื™ืคึผื˜ืึทื‘ืœืขืก ืžืึทื™ื ื˜ืขืจืขืจ, โ€‹โ€‹ื•ื•ืขื’ืŸ ื“ื™ ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืคื•ืŸ ืœื•ื™ืคืŸ ืึธืคืœืึธื•ื“ื™ื ื’ ืื™ืŸ ื ืคื˜ืึทื‘ืœืขืก. ื–ืืœ ืก ื ืขืžืขืŸ ืึท ื ืขืขื ื˜ืขืจ ืงื•ืง ืื™ืŸ ื“ืขื ืžืขืงืึทื ื™ื–ืึทื.

ื“ืขืจ ื”ื•ื™ืคึผื˜ ื’ืขื“ืึทื ืง ืื™ื– ืึทื– ืื•ื™ื‘ ื“ื™ ืจืึทื•ื˜ืขืจ ื“ื•ืจื›ื’ืขื’ืื ื’ืขืŸ ืคึผืึทืงื™ืฅ ืคื•ืŸ ืื™ื™ืŸ ืกืขืกื™ืข ืื™ืŸ ื‘ื™ื™ื“ืข ืื™ื ืกื˜ืจื•ืงืฆื™ืขืก ืคื•ืŸ ื“ื™ ืœื•ื™ืคืŸ (TCP ืกืขืกื™ืข ืื™ื– ื’ืขื•ื•ืขืŸ ืื™ืŸ ื“ื™ ESTABLISHED ืฉื˜ืึทื˜), ืขืก ืื™ื– ื ื™ื˜ ื“ืึทืจืคึฟืŸ ืฆื• ืคืึธืจืŸ ืกืึทื‘ืกืึทืงื•ื•ืึทื ื˜ ืคึผืึทืงื™ืฅ ืคื•ืŸ ื“ืขื ืกืขืกื™ืข ื“ื•ืจืš ืึทืœืข ืคื™ื™ืจื•ื•ืึทืœ ื›ึผืœืœื™ื, ื•ื•ื™ื™ึทืœ ืึทืœืข ื“ื™ ื˜ืฉืขืงืก ื•ื•ืขื˜ ื ืึธืš ืขื ื“ื™ืงืŸ ืžื™ื˜ ื“ื™ ืคึผืึทืงืึทื˜ ื˜ืจืึทื ืกืคืขืจื“ ื•ื•ื™ื™ึทื˜ืขืจ ืฆื• ื“ื™ ืจื•ื˜ื™ื ื’. ืื•ืŸ ืžื™ืจ ื˜ืึธืŸ ื ื™ื˜ ื˜ืึทืงืข ื“ืึทืจืคึฟืŸ ืฆื• ืื•ื™ืกืงืœื™ื™ึทื‘ืŸ ืึท ืžืึทืจืฉืจื•ื˜ - ืžื™ืจ ืฉื•ื™ืŸ ื•ื•ื™ืกืŸ ืฆื• ื•ื•ืึธืก ืฆื•ื‘ื™ื ื“ ืื•ืŸ ืฆื• ื•ื•ืึธืก ื‘ืึทืœืขื‘ืึธืก ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืฉื™ืงืŸ ืคึผืึทืงื™ืฅ ืื™ืŸ ื“ืขื ืกืขืกื™ืข. ืึทืœืข ื•ื•ืึธืก ื‘ืœื™ื™ื‘ื˜ ืื™ื– ืฆื• ืงืจืึธื ื“ื™ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืื•ืŸ ื ื•ืฆืŸ ืขืก ืคึฟืึทืจ ืจื•ื˜ื™ื ื’ ืื™ืŸ ืึท ืคืจื™ ื‘ื™ื ืข ืคื•ืŸ โ€‹โ€‹ืคึผืึทืงืึทื˜ ืคึผืจืึทืกืขืกื™ื ื’. ื•ื•ืขืŸ ืคึผืขืจืคืึธืจืžื™ื ื’ NAT, ืขืก ืื™ื– ื ื™ื™ื˜ื™ืง ืฆื• ืื•ื™ืš ืงืจืึธื ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ื•ื•ืขื’ืŸ ืขื ื“ืขืจื•ื ื’ืขืŸ ืื™ืŸ ืึทื“ืจืขืกืขืก ืื•ืŸ ืคึผืึธืจืฅ ืื™ื‘ืขืจื’ืขื–ืขืฆื˜ ื“ื•ืจืš ื“ื™ nf_conntrack ืžืึธื“ื•ืœืข. ื™ืึธ, ื“ืึธืš, ืื™ืŸ ื“ืขื ืคืึทืœ, ืคืึทืจืฉื™ื“ืŸ ืคึผืึทืœื™ืกืขืจื– ืื•ืŸ ืื ื“ืขืจืข ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืื•ืŸ ืกื˜ืึทื˜ื™ืกื˜ื™ืฉ ื›ึผืœืœื™ื ืื™ืŸ ื™ืคึผื˜ืึทื‘ืœืขืก ื”ืึทืœื˜ืŸ ืืจื‘ืขื˜ืŸ, ืึธื‘ืขืจ ืื™ืŸ ื“ื™ ืจืึทื ืคื•ืŸ ื“ื™ ืึทืจื‘ืขื˜ ืคื•ืŸ ืึท ื‘ืึทื–ื•ื ื“ืขืจ ืฉื˜ื™ื™ืขื ื“ื™ืง NAT ืึธื“ืขืจ, ืœืžืฉืœ, ืึท ื’ืจืขื ืขืฅ, ื“ืึธืก ืื™ื– ื ื™ืฉื˜ ืึทื–ื•ื™ ื•ื•ื™ื›ื˜ื™ืง ื•ื•ื™ื™ึทืœ ื“ื™ ืกืขืจื•ื•ื™ืกืขืก. ื–ืขื ืขืŸ ืคื•ื ืื ื“ืขืจื’ืขื˜ื™ื™ืœื˜ ืื™ื‘ืขืจ ื“ื™ื•ื•ื™ื™ืกืึทื–.

ืงืึธื ืคื™ื’ื•ืจืึทื˜ื™ืึธืŸ

ืฆื• ื ื•ืฆืŸ ื“ืขื ืคึฟื•ื ืงืฆื™ืข ืžื™ืจ ื“ืึทืจืคึฟืŸ:

  • ื ื™ืฆืŸ ืึท ืคืจื™ืฉ ืงืขืจืŸ. ื˜ืจืึธืฅ ื“ืขืจ ืคืึทืงื˜ ืึทื– ื“ื™ ืคืึทื ื’ืงืฉืึทื ืึทืœื™ื˜ื™ ื–ื™ืš ืืจื•ื™ืก ืื™ืŸ ืงืขืจืŸ 4.16, ืคึฟืึทืจ ืึท ืœืึทื ื’ ืฆื™ื™ึทื˜ ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ื–ื™ื™ืขืจ "ืจื•ื™" ืื•ืŸ ืงืขืกื™ื™ื“ืขืจ ื’ืขืคึฟื™ืจื˜ ืงืขืจืŸ ืคึผืึทื ื™ืง. ืึทืœืฅ ืกื˜ื™ื™ื‘ืึทืœื™ื™ื–ื“ ืึทืจื•ื ื“ืขืฆืขืžื‘ืขืจ 2019, ื•ื•ืขืŸ LTS ืงืขืจื ืึทืœื– 4.19.90 ืื•ืŸ 5.4.5 ื–ืขื ืขืŸ ื‘ืืคืจื™ื™ื˜.
  • ืจื™ืจื™ื™ื˜ ื™ืคึผื˜ืึทื‘ืœืขืก ื›ึผืœืœื™ื ืื™ืŸ nftables ืคึฟืึธืจืžืึทื˜ ืžื™ื˜ ืึท ืคืขืจืœื™ ืคืจื™ืฉ ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹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), ื™ื™ื“ืขื ื™ืงืึทืœ ืงืึทื ืคื™ื’ื™ืขืจื“, ื ื™ืฆืŸ ื“ื™ ื–ืขืœื‘ืข ืœื™ื ื•ืงืก ืงืขืจืŸ, ืึธื‘ืขืจ ื“ื•ืจื›ืคื™ืจืŸ NAT ืื™ืŸ ื™ืคึผื˜ืึทื‘ืœืขืก. (NAT4) ืื•ืŸ ืื™ืŸ ื ืคื˜ืึทื‘ืœืขืก (NAT5).

ืฉื ืขืœ ืจื•ื˜ื™ื ื’ ืื•ืŸ NAT ืื™ืŸ ืœื™ื ื•ืงืก

ืขืก ืื™ื– ืงื™ื™ืŸ ื’ืจืึทืคื™ืง ืคื•ืŸ ืคึผืึทืงื™ืฅ ืคึผืขืจ ืกืขืงื•ื ื“ืข ืื™ืŸ ื“ื™ ืกืงืจืขืขื ืฉืึธื˜, ืึธื‘ืขืจ ืื™ืŸ ื“ื™ ืžืึทืกืข ืคึผืจืึธืคื™ืœ ืคื•ืŸ ื“ื™ ืกืขืจื•ื•ืขืจืก ื“ื™ ื“ื•ืจื›ืฉื ื™ื˜ืœืขืš ืคึผืึทืงืึทื˜ ื’ืจื™ื™ืก ืื™ื– ืึทืจื•ื 800 ื‘ื™ื˜ืขืก, ืึทื–ื•ื™ ื“ื™ ื•ื•ืึทืœื•ืขืก ื“ืขืจื’ืจื™ื™ื›ืŸ ืึทืจื•ื™ืฃ ืฆื• 1.5 ืžืคึผืก. ื•ื•ื™ ืื™ืจ ืงืขื ืขืŸ ื–ืขืŸ, ื“ืขืจ ืกืขืจื•ื•ืขืจ ืžื™ื˜ nftables ื”ืื˜ ืึท ืจื™ื–ื™ืง ืคืึธืจืฉื˜ืขืœื•ื ื’ ืจืขื–ืขืจื•ื•. ื“ืขืจื•ื•ื™ื™ึทืœ, ื“ืขืจ ืกืขืจื•ื•ืขืจ ืคึผืจืึทืกืขืกืึทื– ืึทืจื•ื™ืฃ ืฆื• 30Gbit / s ื‘ื™ื™ 3Mpps ืื•ืŸ ืื™ื– ืงืœืืจ ื˜ื•ื™ื’ืขื•ื•ื“ื™ืง ืฆื• ื˜ืจืขืคืŸ ื“ื™ ื’ืฉืžื™ื•ืช ื ืขืฅ ื‘ืึทื’ืจืขื ืขืฆื•ื ื’ ืคื•ืŸ 40Gbps, ื‘ืฉืขืช ืื™ืจ ื”ืึธื‘ืŸ ืคืจื™ื™ ืงืคึผื• ืจืขืกื•ืจืกืŸ.

ืื™ืš ื”ืึธืคึฟืŸ ื“ืขื ืžืึทื˜ืขืจื™ืึทืœ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื ื•ืฆื™ืง ืคึฟืึทืจ ื ืขืฅ ืขื ื“ื–ืฉืึทื ื™ืจื– ื˜ืจื™ื™ื ื’ ืฆื• ืคึฟืึทืจื‘ืขืกืขืจืŸ ื“ื™ ืคืึธืจืฉื˜ืขืœื•ื ื’ ืคื•ืŸ ื–ื™ื™ืขืจ ืกืขืจื•ื•ืขืจืก.

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’