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

Вам потрібно додати CONNMARK, я думаю, щоб зберегти / відновити позначку, щоб вона могла бути застосована до пакетів 2..n (що буде NAT'd шляхом відстеження з'єднання)
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трафіку відповідні правила . Особливо для будь-якого вхідного трафіку.


Велике спасибі! Зараз я збираюсь змінити це на мої потреби, завантажити його на коробку та оновити цю публікацію.
Флав

Працює як шарм, ще раз дякую. За винятком попереднього замовлення / маршруту за замовчуванням до "comcast". (Для мене це повинно бути eth2) Але я думаю, що я працював над цим, додавши загальне правило ip rule add from 10.0.0.0/24 pref 1400 lookup eth2і створивши згодом винятки.
Флав

1
@Flav Ви також можете встановити свої винятки за допомогою міток брандмауера (у розділі PREROUTING). BTW: Одне з пов’язаних питань ( unix.stackexchange.com/questions/70440/… ) містить більше пояснень частини цього конфігурації. Ці правила ip / mask фактично стосуються трафіку, який не NAT, у моїй конфігурації (SNAT трапляється в ПОСТРОЮВАННІ, отже, після правила ip)
derobert
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.