Linux เชฎเชพเช‚ เชเชกเชชเซ€ เชฐเซ‚เชŸเซ€เช‚เช— เช…เชจเซ‡ 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 เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเชพ เชฎเชพเชฐเชพ เชชเซเชฐเชฅเชฎ เชชเซเชฐเชฏเชพเชธเซ‹เชฎเชพเช‚, เชนเซเช‚ เชธเชฐเซเชตเชฐ เชฆเซ€เช  7Mpps (Xeon E0.8-5v1650) เชชเชฐ เชฒเช—เชญเช— 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) เชฎเชพเช‚.

Linux เชฎเชพเช‚ เชเชกเชชเซ€ เชฐเซ‚เชŸเซ€เช‚เช— เช…เชจเซ‡ NAT

เชธเซเช•เซเชฐเซ€เชจเชถเซ‹เชŸเชฎเชพเช‚ เชชเซเชฐเชคเชฟ เชธเซ‡เช•เชจเซเชก เชชเซ‡เช•เซ‡เชŸเชจเซ‹ เช•เซ‹เชˆ เช—เซเชฐเชพเชซ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เช† เชธเชฐเซเชตเชฐเชจเซ€ เชฒเซ‹เชก เชชเซเชฐเซ‹เชซเชพเช‡เชฒเชฎเชพเช‚ เชธเชฐเซ‡เชฐเชพเชถ เชชเซ‡เช•เซ‡เชŸเชจเซเช‚ เช•เชฆ เชฒเช—เชญเช— 800 เชฌเชพเช‡เชŸเซเชธ เช›เซ‡, เชคเซ‡เชฅเซ€ เชฎเซ‚เชฒเซเชฏเซ‹ 1.5Mpps เชธเซเชงเซ€ เชชเชนเซ‹เช‚เชšเซ‡ เช›เซ‡. เชœเซ‡เชฎ เชคเชฎเซ‡ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹, nftables เชธเชพเชฅเซ‡ เชธเชฐเซเชตเชฐ เชชเชพเชธเซ‡ เชตเชฟเชถเชพเชณ เชชเซเชฐเชฆเชฐเซเชถเชจ เช…เชจเชพเชฎเชค เช›เซ‡. เชนเชพเชฒเชฎเชพเช‚, เช† เชธเชฐเซเชตเชฐ 30Mpps เชชเชฐ 3Gbit/s เชธเซเชงเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชฎเชซเชค CPU เชธเช‚เชธเชพเชงเชจเซ‹ เชนเซ‹เชตเชพ เช›เชคเชพเช‚, 40Gbps เชจเซ€ เชญเซŒเชคเชฟเช• เชจเซ‡เชŸเชตเชฐเซเช• เชฎเชฐเซเชฏเชพเชฆเชพเชจเซ‡ เชชเชนเซ‹เช‚เชšเซ€ เชตเชณเชตเชพ เชฎเชพเชŸเซ‡ เชธเซเชชเชทเซเชŸเชชเชฃเซ‡ เชธเช•เซเชทเชฎ เช›เซ‡.

เชนเซเช‚ เช†เชถเชพ เชฐเชพเช–เซเช‚ เช›เซเช‚ เช•เซ‡ เช† เชธเชพเชฎเช—เซเชฐเซ€ เชจเซ‡เชŸเชตเชฐเซเช• เชเชจเซเชœเชฟเชจเชฟเชฏเชฐเซ‹ เชฎเชพเชŸเซ‡ เช‰เชชเชฏเซ‹เช—เซ€ เชฅเชถเซ‡ เชœเซ‡เช“ เชคเซ‡เชฎเชจเชพ เชธเชฐเซเชตเชฐเซเชธเชจเซ€ เช•เชพเชฎเช—เซ€เชฐเซ€ เชธเซเชงเชพเชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ‡ เช›เซ‡.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹