ะ ัะกะ ยฐ ะก โ ะ ัะกะ
เชฆเชฟเชตเชธเชจเซ เชฐเชเชพ. เชนเซเช เชเซเชซเซ เชชเซเชเช เชเซเช. เชตเชฟเชฆเซเชฏเชพเชฐเซเชฅเซเช เชฌเซ เชชเซเชเชจเซเช เชตเชเซเชเซ VPN เชเชจเซเชเซเชถเชจ เชธเซเช เชเชฐเซเชฏเซเช เช เชจเซ เชเชพเชฏเชฌ เชฅเช เชเชฏเซ. เชนเซเช เชคเชชเชพเชธเซเช เชเซเช: เชคเซเชฏเชพเช เชเชฐเซเชเชฐ เชเช เชเชจเชฒ เชเซ, เชชเชฐเชเชคเซ เชเชจเชฒเชฎเชพเช เชเซเช เชเซเชฐเชพเชซเชฟเช เชจเชฅเซ. เชตเชฟเชฆเซเชฏเชพเชฐเซเชฅเซ เชเซเชฒเชจเซ เชเชตเชพเชฌ เชเชชเชคเซ เชจเชฅเซ.
เชฎเซเช เชเซเชเชฒเซ เชเชพเชฒเซ เชเชฐเซ เช
เชจเซ S-Terra เชเซเชเชตเซ เชฎเซเชถเซเชเซเชฒเซเชจเชฟเชตเชพเชฐเชฃเชฎเชพเช เชกเซเชฌเชเซ เชฒเชเชพเชตเซ. เชนเซเช เชฎเชพเชฐเซ เช
เชจเซเชญเชต เช
เชจเซ เชชเชฆเซเชงเชคเชฟ เชถเซเชฐ เชเชฐเซเช เชเซเช.
เชชเซเชฐเชพเชฐเชเชญเชฟเช เชกเซเชเชพ
เชฌเซ เชญเซเชเซเชฒเชฟเช เชฐเซเชคเซ เช เชฒเช เชฅเชฏเซเชฒเซ เชธเชพเชเชเซเชธ GRE เชเชจเชฒ เชฆเซเชตเชพเชฐเชพ เชเซเชกเชพเชฏเซเชฒ เชเซ. GRE เชจเซ เชเชจเซเชเซเชฐเชฟเชชเซเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ:
เชนเซเช GRE เชเชจเชฒเชจเซ เชเชพเชฐเซเชฏเชเซเชทเชฎเชคเชพ เชคเชชเชพเชธเซ เชฐเชนเซเชฏเซ เชเซเช. เช เชเชฐเชตเชพ เชฎเชพเชเซ, เชนเซเช เชเชชเชเชฐเชฃ R1 เชฅเซ เชเชชเชเชฐเชฃ R2 เชจเชพ GRE เชเชจเซเชเชฐเชซเซเชธ เชชเชฐ เชชเชฟเชเช เชเชฒเชพเชตเซเช เชเซเช. เช เชเชจเซเชเซเชฐเชฟเชชเซเชถเชจ เชฎเชพเชเซ เชฒเชเซเชทเซเชฏ เชเซเชฐเชพเชซเชฟเช เชเซ. เชเซเช เชเชตเชพเชฌ เชจเชฅเชฟ:
root@R1:~# ping 1.1.1.2 -c 4
PING 1.1.1.2 (1.1.1.2) 56(84) bytes of data.
--- 1.1.1.2 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3057ms
เชนเซเช Gate1 เช เชจเซ Gate2 เชชเชฐเชจเชพ เชฒเซเชเซเชธ เชเซเชเช เชเซเช. เชฒเซเช เชเซเชถเซเชฅเซ เช เชนเซเชตเชพเชฒ เชเชชเซ เชเซ เชเซ IPsec เชเชจเชฒ เชธเชซเชณเชคเชพเชชเซเชฐเซเชตเช เชฒเซเชจเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชนเชคเซ, เชเซเช เชธเชฎเชธเซเชฏเชพ เชจเชฅเซ:
root@Gate1:~# cat /var/log/cspvpngate.log
Aug 5 16:14:23 localhost vpnsvc: 00100119 <4:1> IPSec connection 5 established, traffic selector 172.17.0.1->172.16.0.1, proto 47, peer 10.10.10.251, id "10.10.10.251", Filter
IPsec:Protect:CMAP:1:LIST, IPsecAction IPsecAction:CMAP:1, IKERule IKERule:CMAP:1
เชเซเช 1 เชชเชฐเชจเชพ IPsec เชเชจเชฒเชจเชพ เชเชเชเชกเชพเชฎเชพเช เชนเซเช เชเซเชเช เชเซเช เชเซ เชคเซเชฏเชพเช เชเชฐเซเชเชฐ เชเช เชเชจเชฒ เชเซ, เชชเชฐเชเชคเซ Rัvd เชเชพเชเชจเซเชเชฐ เชถเซเชจเซเชฏ เชชเชฐ เชฐเซเชธเซเช เชเซ:
root@Gate1:~# sa_mgr show
ISAKMP sessions: 0 initiated, 0 responded
ISAKMP connections:
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) State Sent Rcvd
1 3 (10.10.10.251,500)-(10.10.10.252,500) active 1070 1014
IPsec connections:
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) Protocol Action Type Sent Rcvd
1 3 (172.16.0.1,*)-(172.17.0.1,*) 47 ESP tunn 480 0
เชนเซเช S-Terra เชจเซ เช เชฐเซเชคเซ เชฎเซเชถเซเชเซเชฒเซเชฎเชพเช เชฎเซเชเซเช เชเซเช: เชนเซเช R1 เชฅเซ R2 เชจเชพ เชฎเชพเชฐเซเช เชชเชฐ เชฒเชเซเชทเซเชฏ เชชเซเชเซเชเซ เชเซเชฏเชพเช เชเซเชตเชพเช เชเชพเชฏ เชเซ เชคเซ เชถเซเชงเซเช เชเซเช. เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชฎเชพเช (เชธเซเชชเซเชเชฒเชฐ) เชฎเชจเซ เชญเซเชฒ เชฎเชณเชถเซ.
เชฎเซเชถเซเชเซเชฒเซเชจเชฟเชตเชพเชฐเชฃ
เชชเชเชฒเซเช 1. R1 เชฅเซ เชเซเช1 เชถเซเช เชฎเซเชณเชตเซ เชเซ
เชนเซเช เชฌเชฟเชฒเซเช-เชเชจ เชชเซเชเซเช เชธเซเชจเชฟเชซเชฐเชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช - tcpdump. เชนเซเช เชเชเชคเชฐเชฟเช (เชธเชฟเชธเซเชเซ เชเซเชตเชพ เชธเชเชเซเชคเชฎเชพเช Gi0/1 เช เชฅเชตเชพ เชกเซเชฌเชฟเชฏเชจ OS เชจเซเชเซเชถเชจเชฎเชพเช eth1) เชเชจเซเชเชฐเชซเซเชธ เชชเชฐ เชธเซเชจเชฟเชซเชฐ เชฒเซเชจเซเช เชเชฐเซเช เชเซเช:
root@Gate1:~# tcpdump -i eth1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
14:53:38.879525 IP 172.16.0.1 > 172.17.0.1: GREv0, key=0x1, length 92: IP 1.1.1.1 > 1.1.1.2: ICMP echo request, id 2083, seq 1, length 64
14:53:39.896869 IP 172.16.0.1 > 172.17.0.1: GREv0, key=0x1, length 92: IP 1.1.1.1 > 1.1.1.2: ICMP echo request, id 2083, seq 2, length 64
14:53:40.921121 IP 172.16.0.1 > 172.17.0.1: GREv0, key=0x1, length 92: IP 1.1.1.1 > 1.1.1.2: ICMP echo request, id 2083, seq 3, length 64
14:53:41.944958 IP 172.16.0.1 > 172.17.0.1: GREv0, key=0x1, length 92: IP 1.1.1.1 > 1.1.1.2: ICMP echo request, id 2083, seq 4, length 64
เชนเซเช เชเซเชเช เชเซเช เชเซ Gate1 เชจเซ R1 เชฅเซ GRE เชชเซเชเซเช เชฎเชณเซ เชเซ. เชนเซเช เชเชเชณ เชตเชงเซ เชฐเชนเซเชฏเซ เชเซเช.
เชชเชเชฒเซเช 2. GRE เชชเซเชเซเชเซ เชธเชพเชฅเซ Gate1 เชถเซเช เชเชฐเซ เชเซ
klogview เชเชชเชฏเซเชเชฟเชคเชพเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชนเซเช เชเซเช เชถเชเซเช เชเซเช เชเซ S-Terra VPN เชกเซเชฐเชพเชเชตเชฐเชจเซ เช เชเชฆเชฐ GRE เชชเซเชเซเชเซ เชธเชพเชฅเซ เชถเซเช เชฅเช เชฐเชนเซเชฏเซเช เชเซ:
root@Gate1:~# klogview -f 0xffffffff
filtration result for out packet 172.16.0.1->172.17.0.1, proto 47, len 112, if eth0: chain 4 "IPsecPolicy:CMAP", filter 8, event id IPsec:Protect:CMAP:1:LIST, status PASS
encapsulating with SA 31: 172.16.0.1->172.17.0.1, proto 47, len 112, if eth0
passed out packet 10.10.10.251->10.10.10.252, proto 50, len 160, if eth0: encapsulated
เชนเซเช เชเซเชเช เชเซเช เชเซ เชฒเชเซเชทเซเชฏ GRE เชเซเชฐเชพเชซเชฟเช (เชชเซเชฐเซเชเซ 47) 172.16.0.1 -> 172.17.0.1 เชธเซเชเชฎเชเชชเซ เชเซเชฐเชฟเชชเซเชเซ เชจเชเชถเชพเชฎเชพเช เชฒเชฟเชธเซเช เชเชจเซเชเซเชฐเชฟเชชเซเชถเชจ เชจเชฟเชฏเชฎ เชนเซเช เชณ เชเชตเซ เชเซ เช เชจเซ เชคเซเชจเซ เชเชจเซเชเซเชชเซเชธเซเชฏเซเชฒเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชนเชคเซเช. เชเชเชณ, เชชเซเชเซเช เชฐเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชนเชคเซเช (เชชเชพเชธ เชเชเช). klogview เชเชเชเชชเซเชเชฎเชพเช เชเซเช เชชเซเชฐเชคเชฟเชธเชพเชฆ เชเซเชฐเชพเชซเชฟเช เชจเชฅเซ.
เชนเซเช Gate1 เชเชชเชเชฐเชฃ เชชเชฐ เชเชเซเชธเซเชธ เชธเซเชเชฟเช เชคเชชเชพเชธเซ เชฐเชนเซเชฏเซ เชเซเช. เชฎเชจเซ เชเช เชเชเซเชธเซเชธ เชฒเชฟเชธเซเช เชฒเชฟเชธเซเช เชฆเซเชเชพเชฏ เชเซ, เชเซ เชเชจเซเชเซเชฐเชฟเชชเซเชถเชจ เชฎเชพเชเซเชจเชพ เชฒเชเซเชทเซเชฏ เชเซเชฐเชพเชซเชฟเชเชจเซ เชตเซเชฏเชพเชเซเชฏเชพเชฏเชฟเชค เชเชฐเซ เชเซ, เชเซเชจเซ เช เชฐเซเชฅ เชเซ เชเซ เชซเชพเชฏเชฐเชตเซเชฒ เชจเชฟเชฏเชฎเซ เชเซเช เชตเซเชฒเชพ เชจเชฅเซ:
Gate1#show access-lists
Extended IP access list LIST
10 permit gre host 172.16.0.1 host 172.17.0.1
เชจเชฟเชทเซเชเชฐเซเชท: เชธเชฎเชธเซเชฏเชพ Gate1 เชเชชเชเชฐเชฃ เชธเชพเชฅเซ เชจเชฅเซ.
klogview เชตเชฟเชถเซ เชตเชงเซ
VPN เชกเซเชฐเชพเชเชตเชฐ เชคเชฎเชพเชฎ เชจเซเชเชตเชฐเซเช เชเซเชฐเชพเชซเชฟเชเชจเซ เชนเซเชจเซเชกเชฒ เชเชฐเซ เชเซ, เชฎเชพเชคเซเชฐ เชคเซ เชเซเชฐเชพเชซเชฟเชเชจเซ เช เชจเชนเซเช เชเซเชจเซ เชเชจเซเชเซเชฐเชฟเชชเซเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ. เชเซ VPN เชกเซเชฐเชพเชเชตเชฐเซ เชจเซเชเชตเชฐเซเช เชเซเชฐเชพเชซเชฟเช เชชเชฐ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเซ เชนเซเชฏ เช เชจเซ เชคเซเชจเซ เชเชจเชเซเชฐเชฟเชชเซเช เชตเชฟเชจเชพ เชเซเชฐเชพเชจเซเชธเชฎเชฟเช เชเชฐเซ เชนเซเชฏ เชคเซ เช klogview เชฎเชพเช เชฆเซเชเชพเชคเชพ เชธเชเชฆเซเชถเชพเช เชเซ:
root@R1:~# ping 172.17.0.1 -c 4
root@Gate1:~# klogview -f 0xffffffff
filtration result for out packet 172.16.0.1->172.17.0.1, proto 1, len 84, if eth0: chain 4 "IPsecPolicy:CMAP": no match
passed out packet 172.16.0.1->172.17.0.1, proto 1, len 84, if eth0: filtered
เชนเซเช เชเซเชเช เชเซเช เชเซ ICMP เชเซเชฐเชพเชซเชฟเช (เชชเซเชฐเซเชเซ 1) 172.16.0.1->172.17.0.1 CMAP เชเซเชฐเชฟเชชเซเชเซ เชเชพเชฐเซเชกเชจเชพ เชเชจเซเชเซเชฐเชฟเชชเซเชถเชจ เชจเชฟเชฏเชฎเซเชฎเชพเช เชถเชพเชฎเซเชฒ เชจเชฅเซ (เชเซเช เชฎเซเช เชจเชฅเซ). เชชเซเชเซเช เชธเซเชชเชทเซเช เชฒเชเชพเชฃเชฎเชพเช เชฐเซเช (เชชเชพเชธ เชเชเช) เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชนเชคเซเช.
เชชเชเชฒเซเช 3. เชเซเช2 เชฎเชพเชเชฅเซ เชเซเช1 เชถเซเช เชฎเซเชณเชตเซ เชเซ
เชนเซเช WAN (eth0) Gate2 เชเชจเซเชเชฐเชซเซเชธ เชชเชฐ เชธเซเชจเชฟเชซเชฐ เชฒเซเชจเซเช เชเชฐเซเช เชเซเช:
root@Gate2:~# tcpdump -i eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
16:05:45.104195 IP 10.10.10.251 > 10.10.10.252: ESP(spi=0x30088112,seq=0x1), length 140
16:05:46.093918 IP 10.10.10.251 > 10.10.10.252: ESP(spi=0x30088112,seq=0x2), length 140
16:05:47.117078 IP 10.10.10.251 > 10.10.10.252: ESP(spi=0x30088112,seq=0x3), length 140
16:05:48.141785 IP 10.10.10.251 > 10.10.10.252: ESP(spi=0x30088112,seq=0x4), length 140
เชนเซเช เชเซเชเช เชเซเช เชเซ Gate2 เช Gate1 เชฎเชพเชเชฅเซ ESP เชชเซเชเซเช เชฎเซเชณเชตเซ เชเซ.
เชชเชเชฒเซเช 4. ESP เชชเซเชเซเชเซ เชธเชพเชฅเซ Gate2 เชถเซเช เชเชฐเซ เชเซ
เชนเซเช เชเซเช2 เชชเชฐ klogview เชเชชเชฏเซเชเชฟเชคเชพเชจเซ เชฒเซเชจเซเช เชเชฐเซเช เชเซเช:
root@Gate2:~# klogview -f 0xffffffff
filtration result for in packet 10.10.10.251->10.10.10.252, proto 50, len 160, if eth0: chain 17 "FilterChain:L3VPN", filter 21, status DROP
dropped in packet 10.10.10.251->10.10.10.252, proto 50, len 160, if eth0: firewall
เชนเซเช เชเซเชเช เชเซเช เชเซ เชซเชพเชฏเชฐเชตเซเชฒ เชจเชฟเชฏเชฎ (L50VPN) เชฆเซเชตเชพเชฐเชพ ESP เชชเซเชเซเชเซ (เชชเซเชฐเซเชเซ 3) เชกเซเชฐเซเชช (เชกเซเชฐเซเชช) เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเชพ เชนเชคเชพ. เชนเซเช เชเชพเชคเชฐเซ เชเชฐเซเช เชเซเช เชเซ Gi0/0 เชชเชพเชธเซ เชเชฐเซเชเชฐ เชคเซเชจเซ เชธเชพเชฅเซ เชเซเชกเชพเชฏเซเชฒ L3VPN เชเชเซเชธเซเชธ เชธเซเชเชฟ เชเซ:
Gate2#show ip interface gi0/0
GigabitEthernet0/0 is up, line protocol is up
Internet address is 10.10.10.252/24
MTU is 1500 bytes
Outgoing access list is not set
Inbound access list is L3VPN
เชฎเซเช เชธเชฎเชธเซเชฏเชพ เชถเซเชงเซ เชเชพเชขเซ.
เชชเชเชฒเซเช 5. เชเชเซเชธเซเชธ เชธเซเชเชฟเชฎเชพเช เชถเซเช เชเซเชเซเช เชเซ
L3VPN เชเชเซเชธเซเชธ เชธเซเชเชฟ เชถเซเช เชเซ เชคเซ เชนเซเช เชเซเชเช เชเซเช:
Gate2#show access-list L3VPN
Extended IP access list L3VPN
10 permit udp host 10.10.10.251 any eq isakmp
20 permit udp host 10.10.10.251 any eq non500-isakmp
30 permit icmp host 10.10.10.251 any
เชนเซเช เชเซเชเช เชเซเช เชเซ ISAKMP เชชเซเชเซเชเซเชจเซ เชฎเชเชเซเชฐเซ เชเซ, เชคเซเชฅเซ เชเช IPsec เชเชจเชฒ เชธเซเชฅเชพเชชเชฟเชค เชฅเชฏเซเชฒ เชเซ. เชชเชฐเชเชคเซ ESP เชฎเชพเชเซ เชเซเช เชธเชเซเชทเชฎ เชจเชฟเชฏเชฎ เชจเชฅเซ. เชฆเซเชเซเชคเซ เชฐเซเชคเซ, เชตเชฟเชฆเซเชฏเชพเชฐเซเชฅเซ icmp เช เชจเซ esp เชฎเชพเช เชฎเซเชเชเชตเชฃเชฎเชพเช เชนเชคเซ.
เชเชเซเชธเซเชธ เชธเซเชเชฟเชจเซ เชธเชเชชเชพเชฆเชฟเชค เชเชฐเซ เชฐเชนเซเชฏเซเช เชเซ:
Gate2(config)#
ip access-list extended L3VPN
no 30
30 permit esp host 10.10.10.251 any
เชชเชเชฒเซเช 6. เชเชพเชฐเซเชฏเชเซเชทเชฎเชคเชพ เชคเชชเชพเชธเซ เชฐเชนเซเชฏเซเช เชเซ
เชธเซ เชชเซเชฐเชฅเชฎ, เชนเซเช เชเชพเชคเชฐเซ เชเชฐเซเช เชเซเช เชเซ L3VPN เชเชเซเชธเซเชธ เชธเซเชเชฟ เชธเชพเชเซ เชเซ:
Gate2#show access-list L3VPN
Extended IP access list L3VPN
10 permit udp host 10.10.10.251 any eq isakmp
20 permit udp host 10.10.10.251 any eq non500-isakmp
30 permit esp host 10.10.10.251 any
เชนเชตเซ เชนเซเช เชเชชเชเชฐเชฃ R1 เชฅเซ เชฒเชเซเชทเซเชฏ เชเซเชฐเชพเชซเชฟเช เชถเชฐเซ เชเชฐเซเช เชเซเช:
root@R1:~# ping 1.1.1.2 -c 4
PING 1.1.1.2 (1.1.1.2) 56(84) bytes of data.
64 bytes from 1.1.1.2: icmp_seq=1 ttl=64 time=35.3 ms
64 bytes from 1.1.1.2: icmp_seq=2 ttl=64 time=3.01 ms
64 bytes from 1.1.1.2: icmp_seq=3 ttl=64 time=2.65 ms
64 bytes from 1.1.1.2: icmp_seq=4 ttl=64 time=2.87 ms
--- 1.1.1.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3006ms
rtt min/avg/max/mdev = 2.650/10.970/35.338/14.069 ms
เชตเชฟเชเชฏ. GRE เชเชจเชฒเชจเซ เชธเซเชฅเชพเชชเชจเชพ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ. IPsec เชเชเชเชกเชพเชฎเชพเช เชเชจเชเชฎเชฟเชเช เชเซเชฐเชพเชซเชฟเช เชเชพเชเชจเซเชเชฐ เชถเซเชจเซเชฏ เชจเชฅเซ:
root@Gate1:~# sa_mgr show
ISAKMP sessions: 0 initiated, 0 responded
ISAKMP connections:
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) State Sent Rcvd
1 3 (10.10.10.251,500)-(10.10.10.252,500) active 1474 1350
IPsec connections:
Num Conn-id (Local Addr,Port)-(Remote Addr,Port) Protocol Action Type Sent Rcvd
1 4 (172.16.0.1,*)-(172.17.0.1,*) 47 ESP tunn 1920 480
Gate2 เชเซเชเชตเซ เชชเชฐ, klogview เชเชเชเชชเซเชเชฎเชพเช, เชธเชเชฆเซเชถเชพเช เชฆเซเชเชพเชฏเชพ เชเซ เชฒเชเซเชทเซเชฏ เชเซเชฐเชพเชซเชฟเช 172.16.0.1->172.17.0.1 เชธเชซเชณเชคเชพเชชเซเชฐเซเชตเช CMAP เชเซเชฐเชฟเชชเซเชเซ เชจเชเชถเชพเชฎเชพเช LIST เชจเชฟเชฏเชฎ เชฆเซเชตเชพเชฐเชพ เชกเชฟเชเซเชฐเชฟเชชเซเช (PASS) เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซ เชนเชคเซ:
root@Gate2:~# klogview -f 0xffffffff
filtration result for in packet 172.16.0.1->172.17.0.1, proto 47, len 112, if eth0: chain 18 "IPsecPolicy:CMAP", filter 25, event id IPsec:Protect:CMAP:1:LIST, status PASS
passed in packet 172.16.0.1->172.17.0.1, proto 47, len 112, if eth0: decapsulated
เชชเชฐเชฟเชฃเชพเชฎเซ
เชเช เชตเชฟเชฆเซเชฏเชพเชฐเซเชฅเซเช เชคเซเชจเซ เชฆเชฟเชตเชธ เชฌเชฐเชฌเชพเชฆ เชเชฐเซเชฏเซ.
ME เชจเชฟเชฏเชฎเซ เชธเชพเชฅเซ เชธเชพเชตเชเซเชค เชฐเชนเซ.
เช
เชจเชพเชฎเซ เชเชเชจเซเชฐ
t.me/anonymous_engineer
เชธเซเชฐเซเชธ: www.habr.com