Балансировка нагрузки с несколькими шлюзами

у меня есть разные интернет-провайдеры, каждый в каждой собственной сети. Основной подключается через ethernet и вторичный через Wi-Fi. Эти две сети не имеют никакого отношения вообще. Я просто подключаюсь к ним одновременно. Причина, по которой я хочу сбалансировать нагрузку между ними, заключается в достижении более высоких скоростей интернета.
Примечание: у меня нет продвинутого сетевого оборудования. Только мой компьютер и два маршрутизатора, к которым у меня нет доступа...
основная сеть:

if: eth0
gw: 192.168.178.1
my ip: 192.168.178.95
speed: 400 kbit/s

вторичная сеть:

if: wlan0
gw: 192.168.1.1
my ip: 192.168.1.95
speed: 300 kbit/s

диаграмма для объяснения ситуация:

enter image description here

Я на Arch Linux x64. Я использую netcfg для настройки интерфейсов
Конфиги:

# /etc/network.d/main
CONNECTION='ethernet'
DESCRIPTION='A basic static ethernet connection using iproute'
INTERFACE='eth0'
IP='static'
ADDR='192.168.178.95'

# /etc/network.d/second
CONNECTION='wireless'
DESCRIPTION='A simple WEP encrypted wireless connection'
INTERFACE='wlan0'
SECURITY='wep'
ESSID='wifi_essid'
KEY='the_password'
IP="static"
ADDR='192.168.1.95'

и я использую iptables для балансировки нагрузки, правила:

#!/bin/bash
/usr/sbin/ip route flush table ISP1 2>/dev/null
/usr/sbin/ip rule del fwmark 101 table ISP1 2>/dev/null
/usr/sbin/ip route add table ISP1 192.168.178.0/24 dev eth0 proto kernel  scope link  src 192.168.178.95  metric 202
/usr/sbin/ip route add table ISP1 default via 192.168.178.1 dev eth0
/usr/sbin/ip rule add fwmark 101 table ISP1
/usr/sbin/ip route flush table ISP2 2>/dev/null
/usr/sbin/ip rule del fwmark 102 table ISP2 2>/dev/null
/usr/sbin/ip route add table ISP2 192.168.1.0/24 dev wlan0 proto kernel  scope link  src 192.168.1.95  metric 202
/usr/sbin/ip route add table ISP2 default via 192.168.1.1 dev wlan0
/usr/sbin/ip rule add fwmark 102 table ISP2
/usr/sbin/iptables -t mangle -F
/usr/sbin/iptables -t mangle -X
/usr/sbin/iptables -t mangle -N MARK-gw1
/usr/sbin/iptables -t mangle -A MARK-gw1 -m comment --comment 'send via 192.168.178.1' -j MARK --set-mark 101
/usr/sbin/iptables -t mangle -A MARK-gw1 -j CONNMARK --save-mark
/usr/sbin/iptables -t mangle -A MARK-gw1 -j RETURN
/usr/sbin/iptables -t mangle -N MARK-gw2
/usr/sbin/iptables -t mangle -A MARK-gw2 -m comment --comment 'send via 192.168.1.1' -j MARK --set-mark 102
/usr/sbin/iptables -t mangle -A MARK-gw2 -j CONNMARK --save-mark
/usr/sbin/iptables -t mangle -A MARK-gw2 -j RETURN
/usr/sbin/iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
/usr/sbin/iptables -t mangle -A PREROUTING -m comment --comment "this stream is already marked; escape early" -m mark ! --mark 0 -j ACCEPT
/usr/sbin/iptables -t mangle -A PREROUTING -m comment --comment 'prevent asynchronous routing' -i eth0 -m conntrack --ctstate NEW -j MARK-gw1
/usr/sbin/iptables -t mangle -A PREROUTING -m comment --comment 'prevent asynchronous routing' -i wlan0 -m conntrack --ctstate NEW -j MARK-gw2
/usr/sbin/iptables -t mangle -N DEF_POL
/usr/sbin/iptables -t mangle -A DEF_POL -m comment --comment 'default balancing' -p tcp -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
/usr/sbin/iptables -t mangle -A DEF_POL -m comment --comment 'default balancing' -p udp -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
/usr/sbin/iptables -t mangle -A DEF_POL -m comment --comment 'balance gw1 tcp' -p tcp -m conntrack --ctstate NEW -m statistic --mode nth --every 2 --packet 0 -j MARK-gw1
/usr/sbin/iptables -t mangle -A DEF_POL -m comment --comment 'balance gw1 tcp' -p tcp -m conntrack --ctstate NEW -m statistic --mode nth --every 2 --packet 0 -j ACCEPT
/usr/sbin/iptables -t mangle -A DEF_POL -m comment --comment 'balance gw2 tcp' -p tcp -m conntrack --ctstate NEW -m statistic --mode nth --every 2 --packet 1 -j MARK-gw2
/usr/sbin/iptables -t mangle -A DEF_POL -m comment --comment 'balance gw2 tcp' -p tcp -m conntrack --ctstate NEW -m statistic --mode nth --every 2 --packet 1 -j ACCEPT
/usr/sbin/iptables -t mangle -A DEF_POL -m comment --comment 'balance gw1 udp' -p udp -m conntrack --ctstate NEW -m statistic --mode nth --every 2 --packet 0 -j MARK-gw1
/usr/sbin/iptables -t mangle -A DEF_POL -m comment --comment 'balance gw1 udp' -p udp -m conntrack --ctstate NEW -m statistic --mode nth --every 2 --packet 0 -j ACCEPT
/usr/sbin/iptables -t mangle -A DEF_POL -m comment --comment 'balance gw2 udp' -p udp -m conntrack --ctstate NEW -m statistic --mode nth --every 2 --packet 1 -j MARK-gw2
/usr/sbin/iptables -t mangle -A DEF_POL -m comment --comment 'balance gw2 udp' -p udp -m conntrack --ctstate NEW -m statistic --mode nth --every 2 --packet 1 -j ACCEPT
/usr/sbin/iptables -t mangle -A PREROUTING -j DEF_POL
/usr/sbin/iptables -t nat -A POSTROUTING -m comment --comment 'snat outbound eth0' -o eth0 -s 192.168.0.0/16 -m mark --mark 101 -j SNAT --to-source 192.168.178.95
/usr/sbin/iptables -t nat -A POSTROUTING -m comment --comment 'snat outbound wlan0' -o wlan0 -s 192.168.0.0/16 -m mark --mark 102 -j SNAT --to-source 192.168.1.95
/usr/sbin/ip route flush cache

(этот скрипт был сделан fukawi2, я не знаю, как использовать iptables)
но у меня нет подключения к интернету...

вывод iptables - t mangle-nvL

Chain PREROUTING (policy ACCEPT 1254K packets, 1519M bytes)
 pkts bytes target     prot opt in     out     source               destination         
1278K 1535M CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0            CONNMARK restore
21532   15M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* this stream is already marked; escape early */ mark match ! 0x0
  582 72579 MARK-gw1   all  --  eth0   *       0.0.0.0/0            0.0.0.0/0            /* prevent asynchronous routing */ ctstate NEW
 2376  696K MARK-gw2   all  --  wlan0  *       0.0.0.0/0            0.0.0.0/0            /* prevent asynchronous routing */ ctstate NEW
1257K 1520M DEF_POL    all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain INPUT (policy ACCEPT 1276K packets, 1535M bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 870K packets, 97M bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 870K packets, 97M bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain DEF_POL (1 references)
 pkts bytes target     prot opt in     out     source               destination         
1236K 1517M CONNMARK   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default balancing */ ctstate RELATED,ESTABLISHED CONNMARK restore
15163 2041K CONNMARK   udp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default balancing */ ctstate RELATED,ESTABLISHED CONNMARK restore
  555 33176 MARK-gw1   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* balance gw1 tcp */ ctstate NEW statistic mode nth every 2
  555 33176 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* balance gw1 tcp */ ctstate NEW statistic mode nth every 2
  277 16516 MARK-gw2   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* balance gw2 tcp */ ctstate NEW statistic mode nth every 2 packet 1
  277 16516 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* balance gw2 tcp */ ctstate NEW statistic mode nth every 2 packet 1
 1442  384K MARK-gw1   udp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* balance gw1 udp */ ctstate NEW statistic mode nth every 2
 1442  384K ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* balance gw1 udp */ ctstate NEW statistic mode nth every 2
  720  189K MARK-gw2   udp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* balance gw2 udp */ ctstate NEW statistic mode nth every 2 packet 1
  720  189K ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* balance gw2 udp */ ctstate NEW statistic mode nth every 2 packet 1

Chain MARK-gw1 (3 references)
 pkts bytes target     prot opt in     out     source               destination         
 2579  490K MARK       all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* send via 192.168.178.1 */ MARK set 0x65
 2579  490K CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0            CONNMARK save
 2579  490K RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain MARK-gw2 (3 references)
 pkts bytes target     prot opt in     out     source               destination         
 3373  901K MARK       all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* send via 192.168.1.1 */ MARK set 0x66
 3373  901K CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0            CONNMARK save
 3373  901K RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0
15
задан Donald Duck
11.02.2023 2:02 Количество просмотров материала 2465
Распечатать страницу

1 ответ

Если вы не можете каким-то образом разделить трафик на основе их локальных параметров (например, LAN IP), используя это решение, вы получите много случайных ошибок, потому что многие сайты не позволяют использовать одну и ту же сессию с совершенно разных IP-адресов, не говоря уже о других протоколах, таких как FTP, DNS и т. д.

Если вы действительно хотите сделать это, вам нужно снять в аренду (виртуальный) сервер с минимум 2 IP и построения VPN на каждом из подключений, настроить Балансировка нагрузки OSPF для использования обоих соединений одинаково. Ваш сервер должен иметь как минимум вдвое большую скорость соединения.

в целом: без поддержки сети отработки отказа работает достаточно хорошо, балансировка нагрузки, однако будет постоянная боль.

обновление: что нужно делать:

  1. настройте сервер и убедитесь, что ваш локальный компьютер видит два IP-адреса сервера через разные блат.
  2. запустите два сервера OpenVPN на сервере, прослушивая каждый из адресов.
  3. запустить два клиента OpenVPN на клиенте.
  4. установить Квагга на сервере и клиенте.
  5. убедитесь, что сервер и клиент видят друг друга через OpenVPN без рекламы каких-либо маршрутов.
  6. настройте объявление маршрутизации на сервере, чтобы маршрут по умолчанию (0.0.0.0/0) объявлялся по одной ссылке OSPF на сервер. клиент через перераспределение статических маршрутов. (Это трудно.)
  7. добавить вторую ссылку в качестве резервной ссылки через OSPF.
  8. измените конфигурацию так, чтобы две ссылки использовались в режимах балансировки нагрузки.

OSPF-это совершенно новый мир, это неотъемлемая часть того, как работает интернет. Если вы действительно хотите это сделать, я рекомендую вам дать себе время и прочитать несколько книг, поскольку это выходит за рамки этого описания. Я сделал это один раз и я мог бы получить вернемся к написанию учебника по этому вопросу, но это займет значительное время, поэтому я не буду давать никаких обещаний.

2
отвечен Janos Pasztor 2023-02-12 09:50

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх