УскоряСм OpenVPN Π½Π° Ρ€ΠΎΡƒΡ‚Π΅Ρ€Π΅ Openwrt. ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Π°Ρ вСрсия Π±Π΅Π· паяльника ΠΈ Ρ…Π°Ρ€Π΄Π²Π°Ρ€Π½ΠΎΠ³ΠΎ экстрСмизма

УскоряСм OpenVPN Π½Π° Ρ€ΠΎΡƒΡ‚Π΅Ρ€Π΅ Openwrt. ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Π°Ρ вСрсия Π±Π΅Π· паяльника ΠΈ Ρ…Π°Ρ€Π΄Π²Π°Ρ€Π½ΠΎΠ³ΠΎ экстрСмизма

ВсСм ΠΏΡ€ΠΈΠ²Π΅Ρ‚, Π½Π΅Π΄Π°Π²Π½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π» давнюю ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ OpenVPN Π½Π° Ρ€ΠΎΡƒΡ‚Π΅Ρ€Π΅, пСрСнСся ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΆΠ΅Π»Π΅Π·ΠΊΡƒ, которая припаиваСтся Π²Π½ΡƒΡ‚Ρ€ΠΈ самого Ρ€ΠΎΡƒΡ‚Π΅Ρ€Π°. Π£ мСня Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ с Π°Π²Ρ‚ΠΎΡ€ΠΎΠΌ случай β€” TP-Link WDR3500 с 128 ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚Π°ΠΌΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²ΠΊΠΈ ΠΈ Π±Π΅Π΄Π½Ρ‹ΠΌ процСссором, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°ΠΏΡ€ΠΎΡ‡ΡŒ Π½Π΅ справляСтся с ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Ρ‚ΡƒΠ½Π½Π΅Π»Π΅ΠΉ. Однако, Π»Π΅Π·Ρ‚ΡŒ Π² Ρ€ΠΎΡƒΡ‚Π΅Ρ€ с паяльником ΠΌΠ½Π΅ катСгоричСски Π½Π΅ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ. Под ΠΊΠ°Ρ‚ΠΎΠΌ ΠΌΠΎΠΉ ΠΎΠΏΡ‹Ρ‚ выноса OpenVPN Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΆΠ΅Π»Π΅Π·ΠΊΡƒ с Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π½Π° Ρ€ΠΎΡƒΡ‚Π΅Ρ€Π΅ Π½Π° случай Π°Π²Π°Ρ€ΠΈΠΈ.

Π—Π°Π΄Π°Ρ‡Π°

Π•ΡΡ‚ΡŒ Ρ€ΠΎΡƒΡ‚Π΅Ρ€ TP-Link WDR3500 ΠΈ Orange Pi Zero H2. Π₯ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Ρ‚ΡƒΠ½Π½Π΅Π»Π΅ΠΉ Π² ΡˆΡ‚Π°Ρ‚Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ занимался Orange Pi, ΠΏΡ€ΠΈ этом Ссли с Π½ΠΈΠΌ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ случится, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° VPN вСрнСтся ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π½Π° Ρ€ΠΎΡƒΡ‚Π΅Ρ€. ВсС настройки Ρ„Π°Π΅Ρ€Π²ΠΎΠ»Π° Π½Π° Ρ€ΠΎΡƒΡ‚Π΅Ρ€Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Ρ€Π°Π½ΡŒΡˆΠ΅. И Π²ΠΎΠΎΠ±Ρ‰Π΅ Π² Ρ†Π΅Π»ΠΎΠΌ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΆΠ΅Π»Π΅Π·ΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ для всСх ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎ ΠΈ Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ. OpenVPN Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎ TCP, Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ TAP Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ моста (server-bridge).

РСшСниС

ВмСсто ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΠΎ USB я Ρ€Π΅ΡˆΠΈΠ» ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ€Ρ‚ Ρ€ΠΎΡƒΡ‚Π΅Ρ€Π° ΠΈ завСсти ΠΏΠΎ Π½Π΅ΠΌΡƒ Π½Π° Orange Pi всС подсСти, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ VPN Π±Ρ€ΠΈΠ΄ΠΆ. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ ΠΆΠ΅Π»Π΅Π·ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ физичСски Π²ΠΈΡΠ΅Ρ‚ΡŒ Π² Ρ‚Π΅Ρ… ΠΆΠ΅ сСтях, Ρ‡Ρ‚ΠΎ ΠΈ VPN сСрвСра Π½Π° Ρ€ΠΎΡƒΡ‚Π΅Ρ€Π΅. ПослС этого ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π΅ΠΌ Ρ€ΠΎΠ²Π½ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅ сСрвСра Π½Π° Orange Pi, Π° Π½Π° Ρ€ΠΎΡƒΡ‚Π΅Ρ€Π΅ настраиваСм ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ прокси Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ ΠΎΡ‚Π΄Π°Π²Π°Π» всС входящиС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π° внСшний сСрвСр, Π° Ссли Orange Pi ΠΏΠΎΠΌΠ΅Ρ€ ΠΈΠ»ΠΈ нСдоступСн β€” Ρ‚ΠΎΠ³Π΄Π° Π½Π° Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ fallback сСрвСр. Π― взял HAProxy.

ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ Ρ‚Π°ΠΊ:

  1. ΠŸΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚
  2. Если внСшний сСрвСр нСдоступСн β€” ΠΊΠ°ΠΊ ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ΄Π΅Ρ‚ Π½Π° Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ сСрвСр
  3. Если доступСн β€” ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Orange Pi
  4. VPN Π½Π° Orange Pi Π΄Π΅ΡˆΠΈΡ„Ρ€ΡƒΠ΅Ρ‚ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΈ Π²Ρ‹ΠΏΠ»Π΅Π²Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡ… ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² Ρ€ΠΎΡƒΡ‚Π΅Ρ€
  5. Π ΠΎΡƒΡ‚Π΅Ρ€ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΡ… ΠΊΡƒΠ΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

Π˜Ρ‚Π°ΠΊ, ΠΏΡƒΡΡ‚ΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ Π½Π° Ρ€ΠΎΡƒΡ‚Π΅Ρ€Π΅ Π΄Π²Π΅ сСти β€” main(1) ΠΈ guest(2), для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ… Π½ΠΈΡ… Π΅ΡΡ‚ΡŒ OpenVPN сСрвСр для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ снаруТи.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ сСти

Нам Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΊΠΈΠ½ΡƒΡ‚ΡŒ ΠΎΠ±Π΅ сСти Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ€Ρ‚, поэтому создаСм 2 VLAN’a.

На Ρ€ΠΎΡƒΡ‚Π΅Ρ€Π΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Network/Switch создаСм VLAN’Ρ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 1 ΠΈ 2) ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΠΈΡ… Π² tagged Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π½Π° Π½ΡƒΠΆΠ½ΠΎΠΌ ΠΏΠΎΡ€Ρ‚Ρƒ, добавляСм вновь созданныС eth0.1 ΠΈ eth0.2 ΠΊ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ сСтям (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, добавляСм Π² brigde).

На Orange Pi создаСм Π΄Π²Π° VLAN интСрфСйса (Ρƒ мСня Archlinux ARM + netctl):

/etc/netctl/vlan-main

Description='Main VLAN on eth0'
Interface=vlan-main
Connection=vlan
BindsToInterfaces=eth0
VLANID=1
IP=no

/etc/netctl/vlan-guest

Description='Guest VLAN on eth0'
Interface=vlan-guest
Connection=vlan
BindsToInterfaces=eth0
VLANID=2
IP=no

И сразу создаСм Π΄Π²Π° Π±Ρ€ΠΈΠ΄ΠΆΠ° для Π½ΠΈΡ…:

/etc/netctl/br-main

Description="Main Bridge connection"
Interface=br-main
Connection=bridge
BindsToInterfaces=(vlan-main)
IP=dhcp

/etc/netctl/br-guest

Description="Guest Bridge connection"
Interface=br-guest
Connection=bridge
BindsToInterfaces=(vlan-guest)
IP=dhcp

Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ автостарт Π½Π° всС 4 профиля (netctl enable). Π’Π΅ΠΏΠ΅Ρ€ΡŒ послС ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Orange Pi Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΈΡΠ΅Ρ‚ΡŒ Π² Π΄Π²ΡƒΡ… Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Ρ… сСтях. АдрСса интСрфСйсов Π½Π° Orange Pi настраиваСм Π² Static Leases Π½Π° Ρ€ΠΎΡƒΡ‚Π΅Ρ€Π΅.

ip addr show

4: vlan-main@eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-main state UP group default qlen 1000
    link/ether 02:42:f0:f8:23:c8 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::42:f0ff:fef8:23c8/64 scope link 
       valid_lft forever preferred_lft forever

5: vlan-guest@eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-guest state UP group default qlen 1000
    link/ether 02:42:f0:f8:23:c8 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::42:f0ff:fef8:23c8/64 scope link 
       valid_lft forever preferred_lft forever

6: br-main: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 52:c7:0f:89:71:6e brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.3/24 brd 192.168.1.255 scope global dynamic noprefixroute br-main
       valid_lft 29379sec preferred_lft 21439sec
    inet6 fe80::50c7:fff:fe89:716e/64 scope link 
       valid_lft forever preferred_lft forever

7: br-guest: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether ee:ea:19:31:34:32 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.3/24 brd 192.168.2.255 scope global br-guest
       valid_lft forever preferred_lft forever
    inet6 fe80::ecea:19ff:fe31:3432/64 scope link 
       valid_lft forever preferred_lft forever

Настройка VPN

Π”Π°Π»ΡŒΡˆΠ΅ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ с Ρ€ΠΎΡƒΡ‚Π΅Ρ€Π° настройки для OpenVPN ΠΈ ΠΊΠ»ΡŽΡ‡ΠΈ. Настройки ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡ‚ΡŒ Π² /tmp/etc/openvpn*.conf

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ openvpn, Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹ΠΉ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ TAP ΠΈ server-bridge Π΄Π΅Ρ€ΠΆΠΈΡ‚ свой интСрфСйс Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ. Π§Ρ‚ΠΎΠ±Ρ‹ всС Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ, Π½Π°Π΄ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ скрипт, запускаСмый ΠΏΡ€ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΈ соСдинСния.

/etc/openvpn/main.conf

dev vpn-main
dev-type tap

client-to-client
persist-key
persist-tun
ca /etc/openvpn/main/ca.crt
cert /etc/openvpn/main/main.crt
cipher AES-256-CBC
comp-lzo yes
dh /etc/openvpn/main/dh2048.pem
ifconfig-pool-persist /etc/openvpn/ipp_main.txt
keepalive 10 60
key /etc/openvpn/main/main.key
port 443
proto tcp
push "redirect-gateway"
push "dhcp-option DNS 192.168.1.1"
server-bridge 192.168.1.3 255.255.255.0 192.168.1.200 192.168.1.229
status /tmp/openvpn.main.status
verb 3

setenv profile_name main
script-security 2
up /etc/openvpn/vpn-up.sh

/etc/openvpn/vpn-up.sh

#!/bin/sh

ifconfig vpn-${profile_name} up
brctl addif br-${profile_name} vpn-${profile_name}

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ случится ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, интСрфСйс vpn-main Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π² br-main. Для сСтки guest β€” Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ с Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π΄ΠΎ ΠΈΠΌΠ΅Π½ΠΈ интСрфСйса ΠΈ адрСса Π² server-bridge.

ΠœΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡ запросов снаруТи ΠΈ проксированиС

На этом шагС Orange Pi ΡƒΠΆΠ΅ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² Π² Π½ΡƒΠΆΠ½Ρ‹Π΅ сСти. ΠžΡΡ‚Π°Π»ΠΎΡΡŒ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ проксированиС входящих ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π½Π° Ρ€ΠΎΡƒΡ‚Π΅Ρ€Π΅.

ΠŸΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌ Ρ€ΠΎΡƒΡ‚Π΅Ρ€Π½Ρ‹Π΅ VPN сСрвСра Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΡ€Ρ‚Ρ‹, ставим Π½Π° Ρ€ΠΎΡƒΡ‚Π΅Ρ€ HAProxy ΠΈ настраиваСм:

/etc/haproxy.cfg

global
        maxconn 256
        uid 0
        gid 0
        daemon

defaults
        retries 1
        contimeout 1000
        option splice-auto

listen guest_vpn
        bind :444
        mode tcp
        server 0-orange 192.168.2.3:444 check
        server 1-local  127.0.0.1:4444 check backup

listen main_vpn
        bind :443
        mode tcp
        server 0-orange 192.168.1.3:443 check
        server 1-local  127.0.0.1:4443 check backup

НаслаТдаСмся

Если всС ΠΏΡ€ΠΎΡˆΠ»ΠΎ ΠΏΠΎ ΠΏΠ»Π°Π½Ρƒ β€” ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΡƒΠΉΠ΄ΡƒΡ‚ Π½Π° Orange Pi ΠΈ процСссор Ρ€ΠΎΡƒΡ‚Π΅Ρ€Π° большС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π³Ρ€Π΅Ρ‚ΡŒΡΡ, Π° ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ VPN ΠΎΡ‰ΡƒΡ‚ΠΈΠΌΠΎ возрастСт. ΠŸΡ€ΠΈ этом останутся Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ всС сСтСвыС ΠΏΡ€Π°Π²ΠΈΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ прописаны Π½Π° Ρ€ΠΎΡƒΡ‚Π΅Ρ€Π΅. Π’ случаС Π°Π²Π°Ρ€ΠΈΠΈ Π½Π° Orange Pi ΠΎΠ½ отвалится ΠΈ HAProxy Π·Π°Π²Π΅Ρ€Π½Π΅Ρ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² Π½Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ сСрвСра.

Бпасибо Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, поТСлания ΠΈ исправлСния ΠΏΡ€ΠΈΠ²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ΡΡ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com