Як об'єднати декілька підключень до Інтернету в одне?


23

У моєму ПК є 4 мережі, 2 провідні мережеві карти Gigabit Ethernet, а також 2 бездротові мережеві карти. (Один Broadcom з власними драйверами і Ralink з відкритим кодом програмного забезпечення, яке працює набагато краще, ніж Broadcom.)

Мій мобільний телефон може передавати своє з'єднання бездротово до мого ПК, але у мене також є дротовий Інтернет. Тож у мене є кілька підключень до Інтернету для доступу до Інтернету. Як я можу об'єднати 2 або більше з'єднань разом і збалансувати їх, щоб насолодитися одним об’єднаним досвідом Інтернету, що це сума всіх підключених до нього Інтернет-з'єднань.

Наприклад, якщо у мене є модем з підключенням до Інтернету 1024 кБ / с і ще один, який пропонує 512 кБ / с, і один невеликий, який пропонує 128 кБ / с, після збалансування навантаження та об'єднання всіх з'єднань (з'єднання або об'єднання), я можу завантажити швидкість 1664 кБ / с, використовуючи, наприклад, усі 3 підключення до Інтернету.

Це питання мене завжди інтригувало.


5
Здається, це виходить за рамки Ask Ubuntu :) Це досить складні мережеві речі. ІМО рідко варто того, коли ви враховуєте втрачені пакети через відсутнє (навіть тимчасове) переупорядкування пакетів через те, що деякі посилання повільніші за інші, і подібні речі. Я не знаю, що "чорна скринька" рішення, яке це зробить, може бути цікавим проектом.
Цезій

9
Ну питання в тому, чи можна це зробити в ubuntu, і якщо так, як.
Луїс Альварадо

Я створив відповідь у двох підключеннях до Інтернету в одному пості ПК . Зв'язування документів для обмеження в Ubuntu.
Lucio

@Lucio Я міг би позначити питання як дублікат або ви можете перенести свою відповідь тут, і я можу відзначити його як прийняте. Ви також повинні бути готові до появи 13.04, оскільки він буде включати в Менеджер мереж параметри приєднання (Лише провідні приєднані раби зараз).
Луїс Альварадо

Відповіді:


11

Я щось подібне роблю на роботі за допомогою Ubuntu 11.04. Ми запускаємо інструмент конфігурації брандмауера Shorewall, який, окрім відмінної роботи, надає кілька рудиментарних інструментів для маршрутизації декількох провайдерів, які можуть відповідати вашим потребам. Деякі документи про це можна знайти тут: http://www.shorewall.net/MultiISP.html

Що зводиться до цього, це те, що ви не можете використовувати кілька провайдерів Інтернет для одного з'єднання ... все не так просто. Найкраще, що ви можете зробити, це спробувати рівномірно направляти нові з'єднання між різними постачальниками.

Це складна проблема. Ви, ймовірно, в кінці биєте головою об стіну (я, звичайно, це робив), перш ніж налагодите кожну проблему. Отже, як підказали інші афіші, ви, можливо, будете розумні уважно подумати, наскільки сильне ваше бажання.


Приємне посилання. Дуже приємний підручник.
Луїс Альварадо

Дозвольте також побачити це: debuntu.org/2006/02/23/…
Postadelmaga

8

Ви можете зробити це, використовуючи пакет, ifenslaveякий приєднує та від'єднує підлеглий мережевий інтерфейс до пристрою зв'язку.

  1. Встановити:

    sudo apt-get install ifenslave
    
  2. Завантажте модуль ядра зв’язки

    sudo modprobe bondingle
    
  3. Налаштуйте свої інтерфейси:

    sudo vi /etc/network/interfaces
    

    Приклад конфігурації, щоб об'єднати eth0 та eth1 як раби у ваш обліковий інтерфейс:

    #eth0 is manually configured, and slave to the "bond0" bonded NIC
    auto eth0
    iface eth0 inet manual
    bond-master bond0
    
    #eth1 ditto, thus creating a 2-link bond.
    auto eth1
    iface eth1 inet manual
    bond-master bond0
    
    # bond0 is the bonded NIC and can be used like any other normal NIC.
    # bond0 is configured using static network information.
    auto bond0
    iface bond0 inet static
    address 192.168.1.10
    gateway 192.168.1.1
    netmask 255.255.255.0
    # bond0 uses standard IEEE 802.3ad LACP bonding protocol 
    bond-mode 802.3ad
    bond-miimon 100
    bond-lacp-rate 1
    bond-slaves none
    
  4. Перезапустити мережу:

    sudo restart networking
    
  5. Виведення обмеженого інтерфейсу вгору / вниз:

    ifup bond0
    ifdown bond0
    

    У якості прикладу ми використовуємо кілька режимів скріплення:

    bond-mode active-backup
    

    Опис режиму зв’язку активного резервного копіювання :

    Політика активного резервного копіювання: Активний лише один підлеглий у облігації. Інший раб стає активним, якщо і лише у тому випадку, коли активний раб виходить з ладу. MAC-адреса облігації зовні видно лише на одному порту (мережевому адаптері), щоб уникнути плутанини комутатора. Цей режим забезпечує відмову. Основний варіант впливає на поведінку цього режиму.

    • Опис всіх режимів скріплення.

    Джерело та додаткова інформація у допомозі у вікі спільноти Ubuntu .

Зв'язування означає поєднання декількох мережевих інтерфейсів (NIC) до однієї лінії зв'язку, забезпечуючи високу доступність, балансування навантаження, максимальну пропускну здатність або їх комбінацію. Джерело


+1, оскільки це одна з причин мого запитання. Ще буде чекати, як створити головне з’єднання віртуальної мережі, що є сумою всіх підлеглих (реальних) з'єднань. Щось схоже на зв’язок, що поставляється в останній версії ядра.
Луїс Альварадо

2
-1 - зв'язок працює в локальних мережах, оскільки це працює на рівні 2. Питання полягає в балансуванні навантаження двох незалежних WAN.
gertvdijk

@gertvdijk Я не згоден перевірити свою відповідь на оновлення, щоб з’ясувати, що зв’язування також завантажує балансування.
pl1nk

1
@ pl1nk Це врівноваження навантаження другого рівня для двох НІК в одній мережі L2. Це не те саме, що врівноваження навантаження з кількома провайдерами!
gertvdijk

3
@ pl1nk Мій остаточний коментар. Питання стосується безлічі незалежних широкосмугових з'єднань, однозначно. Хоча вони можуть бути одним провайдером, це не змінює інвалідність обробляти це на рівні 2
gertvdijk

6

Це трохи старе питання, але якщо ви все-таки хочете дізнатися ..

Є два типові сценарії, про що сперечалися gertvdijk та pl1nk в одній з відповідей:

У вас є комп'ютер з 2 загальнодоступними IP-адресами (2 різні провайдери) і ви підключаєтесь до іншого хоста (наприклад, сервер у центрі обробки даних із жировою трубою, що перевищує сукупну пропускну здатність обох підключень ISP вашого комп'ютера). Таким чином, ви встановлюєте зв’язкове з'єднання з хостом через свої 2 з'єднання, а потім хост (сервер) обслуговує ваш трафік через власне підключення до Інтернету. У цьому випадку ви можете отримати майже 100% комбінованої пропускної здатності в обох напрямках для одного з'єднання.

Це окремий випадок агрегації зв'язків / об'єднань / лінгвів, коли багатошарові інтерфейси 2 (одна і та сама мережа) з'єднані між собою. Цього можна досягти, встановивши з'єднання рівня 2 VPN (дотик) на кожному інтерфейсі провайдера від комп'ютера до хоста та з'єднавши їх разом (режим кругового замовлення), щоб мати єдиний інтерфейс. Обмежуючим фактором у цьому сценарії є те, наскільки різні затримки (ping) кожного з'єднання провайдера з хостом. Чим вони схожіші і стабільніші, тим краще. Ми використовуємо його в одній з наших установок, він добре працює. Якщо ви хочете дізнатися подробиці про те, як це здійснити, просто дайте мені знати.

Тоді інший сценарій був би без проміжного хоста, тобто прямого з'єднання від ваших інтерфейсів провайдера до різних веб-серверів по всьому світу. У цьому випадку найкраще ви можете рівномірно розподілити вихідні з'єднання між інтерфейсами - тобто один сеанс TCP повністю проходить через один провайдер, другий сеанс через інший тощо. Це відбувається тому, що коли ви встановлюєте TCP-з'єднання, він має вихідні та цільові IP-адреси для кожного пакету, і коли сервер отримує пакет з іншого IP-адреси, для якого не було виконано рукостискання TCP, він вважає пакет помилковим і відміняє його. Оскільки у кожного з'єднання провайдера є власний загальнодоступний IP, для одного і того ж сеансу TCP ви не можете надсилати один пакет через одне з'єднання з одного IP та інший через інше з'єднання з іншим IP.

Ви не досягнете такої високої сукупності пропускної здатності для одного комп’ютера, як і для першого сценарію, але для невеликого офісу це може бути хорошим рішенням. Що ви можете зробити, щоб трохи її розширити, це реалізувати власні рішення для конкретних протоколів. Наприклад, ви можете мати якийсь проксі на шлюзі (який може бути тим же комп'ютером) для завантаження http і запитувати різні частини величезного файлу, що встановлюють різні сеанси TCP через різні інтерфейси провайдера. У цьому випадку отримана швидкість завантаження буде майже 100% від комбінованої пропускної здатності. Це як скачати на шлюз те, що роблять ReGet, GetRight та подібні завантажувачі. Google "Частковий вміст HTTP 206". Я не знаю жодних нестандартних рішень з відкритим кодом для цього сценарію, але є апаратні пристрої, які роблять саме це: google '


Оце Так! Перша частина вашої відповіді - саме те, що я шукаю. У мене є сервер у хмарі з Ubuntu та дуже швидке з'єднання. І єдине підключення до Інтернету, яке я маю тут, - це 300kbps з обмеженим 3G. Чи можете ви дати більше інформації про те, як досягти першої частини вашої відповіді, щоб я міг придбати багато ключів 3G і планувати покращити швидкість мого зв'язку?
Хуафу

2
echo "bonding" >> /etc/modules echo -e "alias bond* bonding\noptions bonding max_bonds=10 mode=2 xmit_hash_policy=layer3+4 arp_interval=100 arp_ip_target=10.0.0.1" > /etc/modprobe.d/bonding.conf
Анатолій

1
І закріпачіть усі дотики до цього зв’язку: echo "+tapX " >> /sys/class/net/bond0/bonding/slaves Перевірте його стан за допомогою: cat /proc/net/bonding/bond0 На цьому етапі весь інтернет-трафік повинен надходити через bond0 на сервер у центрі обробки даних. Там вам слід встановити маршрутизацію: echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p /etc/sysctl.conf iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE (eth0 повинен бути в Інтернеті iface)
Анатолій

1
Ця конфігурація зв'язків (режим = 2 xmit_hash_policy = layer3 + 4) змусить кожне нове з'єднання пройти через різні базові VPN, якщо базуватись на хеші (обчислюється з IP-адрес та портів, що беруть участь у з'єднанні). Більше інформації: kernel.org/doc/Documentation/networking/bonding.txt . Це насправді більше схоже на друге рішення з моєї відповіді, це тому, що для правильного функціонування потрібні дуже схожі (дуже низький тремтіння та така ж пропускна здатність), щоб базові з'єднання були круглими роботами (інакше ви отримуєте багато переупорядкування пакетів), і ви говорите що ваші з'єднання 3G.
Анатолій

1
@Huafu, щоб мати перше рішення, потрібно просто змінити параметри зв’язування, а не mode=2 xmit_hash_policy=layer3+4вказати mode=0(див. Посилання @ kernel.org), але спочатку перевірити, наскільки схожі посилання через 3G. Якщо час їх пінг відрізняється більше, ніж 2-3 мс, або тремтіння більше 1 мс, у вас буде багато переупорядкування пакетів, що ефективно зменшує швидкість агрегованого зв'язку. Вам доведеться перевірити сукупну статистику посилань за допомогою netstat -s(шукайте повторні передачі) та iperf -s/ iperf -c <server_ip> -d. Перша перевірка продуктивності кожного посилання, тоді ми можемо продовжити рішення
Анатолій

0

я зіткнувся з подібною проблемою .. і мене дуже зацікавив підхід до рішення за першим сценарієм містера. GTH та Анатолі, я дуже прошу викласти основні конфігурації та сценарії, якщо можливо, протестувати конфігурацію, описану в першому сценарії.

Тепер я налаштував з'єднання vpn через різних провайдерів провайдера, використовуючи комбіновані інтерфейси tun / tap (це не зв’язування, що пояснено у відповіді №8) за допомогою цієї утиліти:

Net-ISP-Balance від Лінкольна Д. Штейна

Завантажте баланс свого Інтернет-з'єднання через два або більше Інтернет-провайдера для покращення пропускної здатності та надійності

Домашня сторінка проекту: https://lstein.github.io/Net-ISP-Balance/

Цей пакет дозволяє налагодити баланс підключення до Інтернету для дому чи малого бізнесу через два або більше Інтернет-провайдерів. Ви можете використовувати його з одним хостом, підключеним до двох Інтернет-провайдерів, або на маршрутизаторі / брандмауері для завантаження балансу всієї локальної мережі. Мережевий трафік збалансований між обома підключеннями провайдера, щоб збільшити потужність завантаження та завантаження, і якщо один провайдер вийде з ладу, інший Інтернет-провайдер перейме автоматично.

Пропускна здатність розподіляється на рівні з'єднання. Це означає, що ви не побачите сукупну пропускну здатність на будь-якому конкретному еталоні завантаження або швидкості, але ви побачите переваги, коли одночасно відбувається безліч передач даних, наприклад, коли декілька людей у ​​вашій сім'ї передають фільми. Окрім того, протоколи передачі файлів з декількома з'єднаннями, такі як BitTorrent, побачать переваги балансування навантаження.

це утиліта на основі Perl для управління маршрутизацією та iptables в Linux, ідеально підходить для наших цілей. Насправді спочатку створюється таблиця маршрутизації для всіх провайдерів, а потім розподіляється весь трафік локальної мережі рівномірно між провайдерами, щоб зрозуміти, як працює утиліта, пропоную розглянути невеликий приклад (тестова конфігурація) для 3 isp + 1 lan

 #cat /etc/network/balance.conf
 ##service    device   role     ping-ip           
 CABLE3       enp0s3   isp      10.0.2.2
 CABLE8       enp0s8   isp      10.0.3.2
 CABLE9       enp0s9   isp      10.0.4.2
 LAN          enp0s10  lan                        

 #cat /etc/network/interfaces
auto enp0s3
allow-hotplug enp0s3
iface enp0s3 inet dhcp

auto enp0s8
allow-hotplug enp0s8
iface enp0s8 inet dhcp

auto enp0s9
allow-hotplug enp0s9
iface enp0s9 inet dhcp

auto enp0s10
allow-hotplug enp0s10
iface enp0s10 inet static
    address 192.168.1.1/24

#Now work Net-ISP-Balance utility:

## Including rules from /etc/network/balance/pre-run/pre-run-script.pl ##
## Finished /etc/network/balance/pre-run/pre-run-script.pl ##
echo 0 > /proc/sys/net/ipv4/ip_forward
ip route flush all
ip rule flush
ip rule add from all lookup main pref 32766
ip rule add from all lookup default pref 32767
ip route flush table  2
ip route flush table  1
ip route flush table  3
ip route add  10.0.2.0/24 dev enp0s3 src 10.0.2.15
ip route add  10.0.3.0/24 dev enp0s8 src 10.0.3.15
ip route add  10.0.4.0/24 dev enp0s9 src 10.0.4.15
ip route add  0.0.0.0/0 dev enp0s10 src 
ip route add default scope global nexthop via 10.0.4.2 dev enp0s9 weight 1 nexthop via 10.0.3.2 dev enp0s8 weight 1 nexthop via 10.0.2.2 dev enp0s3 weight 1
ip route add table 2 default dev enp0s3 via 10.0.2.2
ip route add table 2 10.0.2.0/24 dev enp0s3 src 10.0.2.15
ip route add table 2 10.0.3.0/24 dev enp0s8 src 10.0.3.15
ip route add table 2 10.0.4.0/24 dev enp0s9 src 10.0.4.15
ip route add table 2 0.0.0.0/0 dev enp0s10 src 
ip rule add from 10.0.2.15 table 2
ip rule add fwmark 2 table 2
ip route add table 1 default dev enp0s8 via 10.0.3.2
ip route add table 1 10.0.2.0/24 dev enp0s3 src 10.0.2.15
ip route add table 1 10.0.3.0/24 dev enp0s8 src 10.0.3.15
ip route add table 1 10.0.4.0/24 dev enp0s9 src 10.0.4.15
ip route add table 1 0.0.0.0/0 dev enp0s10 src 
ip rule add from 10.0.3.15 table 1
ip rule add fwmark 1 table 1
ip route add table 3 default dev enp0s9 via 10.0.4.2
ip route add table 3 10.0.2.0/24 dev enp0s3 src 10.0.2.15
ip route add table 3 10.0.3.0/24 dev enp0s8 src 10.0.3.15
ip route add table 3 10.0.4.0/24 dev enp0s9 src 10.0.4.15
ip route add table 3 0.0.0.0/0 dev enp0s10 src 
ip rule add from 10.0.4.15 table 3
ip rule add fwmark 3 table 3
## Including rules from /etc/network/balance/routes/01.local_routes ##
# enter any routing commands you might want to go in
# for example:
# ip route add 192.168.100.1 dev eth0 src 198.162.1.14

## Finished /etc/network/balance/routes/01.local_routes ##
## Including rules from /etc/network/balance/routes/02.local_routes.pl ##
## Finished /etc/network/balance/routes/02.local_routes.pl ##
iptables -F
iptables -t nat    -F
iptables -t mangle -F
iptables -X
iptables -P INPUT    DROP
iptables -P OUTPUT   DROP
iptables -P FORWARD  DROP

iptables -N DROPGEN
iptables -A DROPGEN -j LOG -m limit --limit 1/minute --log-level 4 --log-prefix "GENERAL: "
iptables -A DROPGEN -j DROP

iptables -N DROPINVAL
iptables -A DROPINVAL -j LOG -m limit --limit 1/minute --log-level 4 --log-prefix "INVALID: "
iptables -A DROPINVAL -j DROP

iptables -N DROPPERM
iptables -A DROPPERM -j LOG -m limit --limit 1/minute --log-level 4 --log-prefix "ACCESS-DENIED: "
iptables -A DROPPERM -j DROP

iptables -N DROPSPOOF
iptables -A DROPSPOOF -j LOG -m limit --limit 1/minute --log-level 4 --log-prefix "DROP-SPOOF: "
iptables -A DROPSPOOF -j DROP

iptables -N DROPFLOOD
iptables -A DROPFLOOD -m limit --limit 1/minute  -j LOG --log-level 4 --log-prefix "DROP-FLOOD: "
iptables -A DROPFLOOD -j DROP

iptables -N DEBUG
iptables -A DEBUG  -j LOG --log-level 3 --log-prefix "DEBUG: "
iptables -t mangle -N MARK-CABLE3
iptables -t mangle -A MARK-CABLE3 -j MARK     --set-mark 2
iptables -t mangle -A MARK-CABLE3 -j CONNMARK --save-mark
iptables -t mangle -N MARK-CABLE8
iptables -t mangle -A MARK-CABLE8 -j MARK     --set-mark 1
iptables -t mangle -A MARK-CABLE8 -j CONNMARK --save-mark
iptables -t mangle -N MARK-CABLE9
iptables -t mangle -A MARK-CABLE9 -j MARK     --set-mark 3
iptables -t mangle -A MARK-CABLE9 -j CONNMARK --save-mark
iptables -t mangle -A PREROUTING -i enp0s10 -m conntrack --ctstate NEW -m statistic --mode random --probability 1 -j MARK-CABLE9
iptables -t mangle -A PREROUTING -i enp0s10 -m conntrack --ctstate NEW -m statistic --mode random --probability 0.5 -j MARK-CABLE8
iptables -t mangle -A PREROUTING -i enp0s10 -m conntrack --ctstate NEW -m statistic --mode random --probability 0.333333333333333 -j MARK-CABLE3
iptables -t mangle -A PREROUTING -i enp0s10 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -i enp0s3 -m conntrack --ctstate NEW -j MARK-CABLE3
iptables -t mangle -A PREROUTING -i enp0s3 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -i enp0s8 -m conntrack --ctstate NEW -j MARK-CABLE8
iptables -t mangle -A PREROUTING -i enp0s8 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -i enp0s9 -m conntrack --ctstate NEW -j MARK-CABLE9
iptables -t mangle -A PREROUTING -i enp0s9 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
iptables -A INPUT  -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -d 127.0.0.0/8 -j DROPPERM
iptables -A INPUT   -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT   -p tcp --tcp-flags SYN,ACK ACK -j ACCEPT
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK ACK -j ACCEPT
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROPFLOOD
iptables -A INPUT   -i enp0s10 -s 0.0.0.0/0 -j ACCEPT
iptables -A OUTPUT  -o enp0s10 -d 0.0.0.0/0  -j ACCEPT
iptables -A OUTPUT  -o enp0s10 -d 255.255.255.255/32  -j ACCEPT
iptables -A OUTPUT  -p udp -s 0.0.0.0/0 -j ACCEPT
iptables -A FORWARD  -i enp0s10 -o enp0s3 -s 0.0.0.0/0 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A OUTPUT   -o enp0s3                 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A FORWARD  -i enp0s10 -o enp0s8 -s 0.0.0.0/0 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A OUTPUT   -o enp0s8                 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A FORWARD  -i enp0s10 -o enp0s9 -s 0.0.0.0/0 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A OUTPUT   -o enp0s9                 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A OUTPUT  -j DROPSPOOF
iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
iptables -t nat -A POSTROUTING -o enp0s8 -j MASQUERADE
iptables -t nat -A POSTROUTING -o enp0s9 -j MASQUERADE
## Including rules from /etc/network/balance/firewall/01.accept ##
## This file contains iptables statements that add additional firewall rules

# allow incoming domain packets -- needed for DNS resolution
iptables -A INPUT   -p udp --source-port domain -j ACCEPT
# allow incoming NTP packets -- needed for net time protocol
iptables -A INPUT   -p udp --source-port ntp -j ACCEPT
## Finished /etc/network/balance/firewall/01.accept ##
## Including rules from /etc/network/balance/firewall/01.accept.pl ##
iptables -A INPUT -p tcp -s 0.0.0.0/0 --syn --dport ssh -j ACCEPT
## Finished /etc/network/balance/firewall/01.accept.pl ##
## Including rules from /etc/network/balance/firewall/02.forward.pl ##
iptables -A FORWARD -p udp --source-port domain -d 0.0.0.0/0 -j ACCEPT
iptables -A FORWARD -p udp --source-port ntp    -d 0.0.0.0/0 -j ACCEPT
## Finished /etc/network/balance/firewall/02.forward.pl ##
echo 1 > /proc/sys/net/ipv4/ip_forward
## Including rules from /etc/network/balance/post-run/post-run-script.pl ##
## Finished /etc/network/balance/post-run/post-run-script.pl ##

Будь ласка, спробуйте видалити цю відповідь і додати коментар, вимагаючи додаткового пояснення до відповідної відповіді. Це не відповідь. Дякую.
Раффа
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.