Linux как маршрутизатор с несколькими интернет-провайдерами

16

Linux как маршрутизатор: у меня есть 3 интернет-провайдера, каждый со своим модемом.

Provider1 , который является адресом шлюза 192.168.1.1,
подключенным к маршрутизатору linux eth1 /192.168.1.2

Provider2 , адрес шлюза 192.168.2.1,
подключенный к маршрутизатору linux eth2 /192.168.2.2

Provider3 , адрес шлюза 192.168.3.1,
подключенный к маршрутизатору linux eth3 /192.168.3.2

                                                                           ________
                                                   +------------+         /
                                                   |            |        |
                            +----------------------+ Provider 1 +--------|
        __                  |192.168.1.2           |192.168.1.1 |       /
    ___/  \_         +------+-------+              +------------+      |
  _/        \__      |    eth1      |              +------------+      /
 /             \ eth0|              |192.168.2.2   |            |      |
|Client network -----+  ROUTER  eth2|--------------+ Provider 2 +------|     Internet
 \10.0.0.0/24 __/    |              |              |192.168.2.1 |      |
   \__     __/       |    eth3      |              +------------+      \
      \___/          +------+-------+              +------------+       |
                            |192.168.3.2           |            |       \
                            +----------------------+ Provider 3 +-------|
                                                   |192.168.3.1 |       |
                                                   +------------+       \________

Я хотел бы направить клиентов в сети 10.0.0.0/24 по IP-адресу источника на разные шлюзы.
Интерфейс к клиентской сети - eth0 / 10.0.0.1, который является шлюзом по умолчанию для всех клиентов.

Например:
10.0.0.11 должен быть направлен на Provider1 @ eth1
10.0.0.12 должен быть направлен на Provider2 @ eth2
... и так далее ...

Я думаю, что мне нужно использовать ip routeи iptablesдля SNAT, но я не выяснил, как именно.
Вот сценарий, который я имею до сих пор.
Переадресация ipv4 включена.

#!/bin/bash
# flush tables
ip route flush table connection1
ip route flush table connection2
ip route flush table connection3

# add the default gateways for each table
ip route add table connection1 default via 192.168.1.1
ip route add table connection2 default via 192.168.2.1
ip route add table connection3 default via 192.168.3.1

# add some IP addresses for marking
iptables -t mangle -A PREROUTING -s 10.0.0.11 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -s 10.0.0.12 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -s 10.0.0.13 -j MARK --set-mark 3

# add the source nat rules for each outgoing interface
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.1.2
iptables -t nat -A POSTROUTING -o eth2 -j SNAT --to-source 192.168.2.2
iptables -t nat -A POSTROUTING -o eth3 -j SNAT --to-source 192.168.3.2

# link routing tables to connections (?)
ip rule add fwmark 1 table connection1
ip rule add fwmark 2 table connection2
ip rule add fwmark 3 table connection3

#default route for anything not configured above should be eth2
Flav
источник
Вам нужно добавить в CONNMARK, я думаю, чтобы сохранить / восстановить метку, чтобы она могла быть применена к пакетам 2..n (которые будут NAT'ами при отслеживании соединения)
derobert
Я добавил ответ с выдержками из конфига, который мы здесь используем. Я постараюсь проверить на выходных, чтобы уточнить что-нибудь ...
Дероберт

Ответы:

13

Вот аналогичная настройка от одного из наших маршрутизаторов (с некоторыми несущественными вещами). Обратите внимание, что это также обрабатывает входящие соединения.

Обратите внимание на использование переменных вместо жестко заданных номеров меток. Так намного проще в обслуживании! Они хранятся в отдельном скрипте и получают из. Имена таблиц настраиваются в /etc/iproute2/rt_tables. Имена интерфейсов задаются в /etc/udev/rules.d/70-persistent-net.rules.

##### fwmark ######
iptables -t mangle -F
iptables -t mangle -X

iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j RETURN # if already set, we're done
iptables -t mangle -A PREROUTING -i wan      -j MARK --set-mark $MARK_CAVTEL
iptables -t mangle -A PREROUTING -i comcast  -j MARK --set-mark $MARK_COMCAST
iptables -t mangle -A PREROUTING -i vz-dsl   -j MARK --set-mark $MARK_VZDSL

iptables -t mangle -A POSTROUTING -o wan     -j MARK --set-mark $MARK_CAVTEL
iptables -t mangle -A POSTROUTING -o comcast -j MARK --set-mark $MARK_COMCAST
iptables -t mangle -A POSTROUTING -o vz-dsl  -j MARK --set-mark $MARK_VZDSL
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark

##### NAT ######
iptables -t nat -F
iptables -t nat -X
for local in «list of internal IP/netmask combos»; do
    iptables -t nat -A POSTROUTING -s $local -o wan     -j SNAT --to-source «IP»
    iptables -t nat -A POSTROUTING -s $local -o comcast -j SNAT --to-source «IP»
    iptables -t nat -A POSTROUTING -s $local -o vz-dsl  -j SNAT --to-source «IP»
done

# this is an example of what the incoming traffic rules look like
for extip in «list of external IPs»; do
    iptables -t nat -A PREROUTING   -p tcp -d $extip --dport «port» -j DNAT --to-destination «internal-IP»:443
done

И правила:

ip rule flush
ip rule add from all               pref 1000  lookup main 
ip rule add from A.B.C.D/29        pref 1500  lookup comcast # these IPs are the external ranges (we have multiple IPs on each connection)
ip rule add from E.F.G.H/29        pref 1501  lookup cavtel
ip rule add from I.J.K.L/31        pref 1502  lookup vzdsl
ip rule add from M.N.O.P/31        pref 1502  lookup vzdsl # yes, you can have multiple ranges
ip rule add fwmark $MARK_COMCAST   pref 2000  lookup comcast
ip rule add fwmark $MARK_CAVTEL    pref 2001  lookup cavtel
ip rule add fwmark $MARK_VZDSL     pref 2002  lookup vzdsl
ip rule add                        pref 2500  lookup comcast # the pref order here determines the default—we default to Comcast.
ip rule add                        pref 2501  lookup cavtel
ip rule add                        pref 2502  lookup vzdsl
ip rule add                        pref 32767 lookup default

Таблицы маршрутизации настроены /etc/network/interfacesтак, что отключение интерфейса переключает его на использование другого:

iface comcast inet static
        address A.B.C.Q
        netmask 255.255.255.248
        up ip route add table comcast default via A.B.C.R dev comcast
        down ip route flush table comcast

Примечание: Если вы делаете фильтрацию , а также (что вы , вероятно , есть) вам также необходимо добавить соответствующие правила FORWARDдля ACCEPTтрафика. Особенно для любого входящего трафика.

derobert
источник
Большое спасибо! Сейчас я собираюсь изменить это в соответствии со своими потребностями, загрузить его на коробку и обновить этот пост.
Флав
Работает как шарм, спасибо еще раз. За исключением предзаказа / маршрута по умолчанию для «comcast». (Для меня это должно быть eth2) Но я думаю, что обошел его, добавив общее правило ip rule add from 10.0.0.0/24 pref 1400 lookup eth2и создав исключения позже.
Флав
1
@Flav вы также можете установить свои исключения с метками брандмауэра (в PREROUTING). Кстати: один из связанных вопросов ( unix.stackexchange.com/questions/70440/… ) содержит более подробное объяснение части этой конфигурации. Эти правила ip / mask на самом деле для трафика, отличного от NAT, в моей конфигурации (SNAT происходит в POSTROUTING, следовательно, после вещи с правилом ip)
derobert