Назад | Перейти на главную страницу

Сервер OpenVPN на маршрутизаторе Multi-WAN

У меня есть сервер OpenVPN на маршрутизаторе MultiWAN (на основе Ubuntu). Проблема в том, что входящие пакеты не покидают тот же интерфейс WAN, куда они вошли. Я уже тестировал правила iptables MARK в сочетании с правилами ip, но не смог решить проблему. Я знаю, что могу определить конфигурацию openvpn с помощью local 79.1.2.3 исходящий ip, но я хочу, чтобы он был более гибким, если это возможно. Протокол порта OpenVPN - это UDP, если это важно.

$ ip r s|grep default
default via 83.1.2.3 dev vlan254 metric 1 
default via 79.1.2.3 dev ppp0 metric 2 
default via 192.168.0.251 dev vlan10 metric 3 onlink 

$ ip rule s
0:      from all lookup local 
100:    from all fwmark 0x1 lookup uplink1 
101:    from 83.1.2.3 lookup uplink1 
102:    from all to 83.1.2.3 lookup uplink1 
200:    from all fwmark 0x2 lookup uplink2 
201:    from 79.1.2.3 lookup uplink2 
300:    from all fwmark 0x3 lookup uplink3 
301:    from 192.168.0.254 lookup uplink3 
302:    from all to 192.168.0.254 lookup uplink3 
32766:  from all lookup main 
32767:  from all lookup default 

# iptables -L -vn -t mangle
Chain PREROUTING (policy ACCEPT 4785K packets, 5178M bytes)
 pkts bytes target     prot opt in     out     source               destination         
4785K 5178M CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0            CONNMARK restore
3985K 5035M RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            mark match ! 0x0
  351 46210 MARK       all  --  vlan254 *       0.0.0.0/0            0.0.0.0/0            MARK set 0x1
 3865  242K MARK       all  --  ppp0   *       0.0.0.0/0            0.0.0.0/0            MARK set 0x2
  351 46210 CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0            mark match 0x1 CONNMARK save
 3865  242K CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0            mark match 0x2 CONNMARK save

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

Chain FORWARD (policy ACCEPT 3127K packets, 4063M bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 1534K packets, 1241M bytes)
 pkts bytes target     prot opt in     out     source               destination         
1534K 1241M CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0            CONNMARK restore
 657K  103M RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            mark match ! 0x0
    0     0 MARK       udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp spt:55394 MARK set 0x2
    0     0 CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0            mark match 0x1 CONNMARK save
    0     0 CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0            mark match 0x2 CONNMARK save

Chain POSTROUTING (policy ACCEPT 4639K packets, 5303M bytes)
 pkts bytes target     prot opt in     out     source               destination         
4639K 5303M CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0            CONNMARK restore
3743K 4164M RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            mark match ! 0x0
   90  7560 MARK       all  --  *      vlan254  0.0.0.0/0            0.0.0.0/0            MARK set 0x1
57161 3664K MARK       all  --  *      ppp0    0.0.0.0/0            0.0.0.0/0            MARK set 0x2
 896K 1140M CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0            CONNMARK save

Таким образом, входящие пакеты поступают из восходящего канала 2, но оставляют восходящий канал 1 (gw по умолчанию).

Любая идея, как я могу решить свою проблему?

Посмотрим, смогу ли я объяснить это немного лучше:

  1. Предположим, у вас есть хост где-то в Интернете, который отправляет пакет IP в вашу сеть. Допустим, он исходит от IP-адреса. 1.2.3.4.

  2. Пакет прибывает в вашу сеть из любого vlan254 или ppp0 ссылка на сайт. Которая пересылается в пункт назначения в вашей сети (иначе через uplink3).

  3. Теперь тот, кто получил посылку, должен ответить, поэтому он отправит посылку с адресом назначения. 1.2.3.4.

  4. Поскольку оба uplink1 и uplink2 есть путь к 1.2.3.4 любой из них работает как допустимый путь, пакет затем будет перенаправлен через ссылку с наименьшей метрикой, которая uplink1.

Это в основном то, что происходит в 10.4.2. Inbound traffic Using Multiple Connections to the Internet по моей ссылке выше.


Однако вы хотели:

  • Если трафик поступил через uplink1 тогда любой ответ выйдет через uplink1.
  • Точно так же любые IP-пакеты, поступающие из uplink2 также будет дан ответ, используя uplink2.

Это означает, что вы приземлились прямо в мире multihomed networking.

Я предполагаю, что вы использовали возможность маркировать посылку, чтобы отслеживать, откуда она пришла? Увы, маркировка используется только в том случае, если у вас есть IP-пакеты, которые необходимо маршрутизировать по разным путям, в зависимости от того, какой номер порта изначально использовался как порт источника или как порт назначения.

Альтернативное решение из моей ссылки состояло в том, чтобы позволить вашему серверу прослушивать 2 IP-адреса, а затем выполнять форму обратного NAT, когда весь входящий трафик перенаправляется на тот или иной IP-адрес в зависимости от того, какая ссылка была использована.

Затем вы можете перенаправить трафик через правильную ссылку в зависимости от исходного IP-адреса вашего сервера.

Вы также можете запустить OpenVPN на двух разных портах (например, 1194 и 1195) и использование маркировки для пересылки любых ответов по той или иной ссылке в Интернет.