URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 86879
[ Назад ]

Исходное сообщение
"Два провайдена + локалка, Linux исключительно iptables+route?"

Отправлено Bzz , 13-Окт-09 00:41 
Вопрос такой.
Система Федора 9
eth0 - интерфейс с внешним ип. через него инет от первого провайдера. ип 194.х.х.16 (248)
eth1 - интерфейс локальный в него приходит вся локалка 10.0.0.0 и 10.0.1.0
eth2 - интерфейс локальный в него приходит ADSL модем, который работает как роутер. Т.е на нем есть инет по умолчанию всегда от второго провайдера. 192.168.1.0

На eth1 два адреса 10.0.0.0 и 10.0.1.0 алиасом, соответственно приходят две локалки через свич.

Задача. В инет 10.0.0.0 все идут через eth2, а 10.0.1.0 через eth1
Вторая задача. Хочу все это сделать скриптом с помощью route и iptables без iproute2. Потому, что мне нравится логика, когда все прописываешь поэтапно в въезжаешь в каждую деталь. Во-вторых хочется для себя разобраться полностью как это все делается сначала так, без упрощающих утилит.

Я пока сделал так:
1. iptables все политики на DENY . Затем на инпут и оутпут цепочках ип каждого интерфейса разрешил ходить куда им положено.
2. в FORWARD зафорвардил все подсети, т.е дал им свободные маршруты во все направления, фактически.
iptables -A FORWARD -s 194.44.x.x/255.255.255.248 -j ACCEPT (ип что дан провайдеру свободно форвардится в любом направлении) и остальные правила в этом стиле как для 194.44.х.х, так и локальных подсетей
3. В роуте поставил
route add default gw 194.x.x.17 dev eth0

4. Затем в iptables
iptables -t nat -A POSTROUTING -s 10.0.0.10 -j MASQUERADE

С этого шага все заработало с 10.0.0.10 компа можно ходить в инет через превого провайдера, добавляя сюда правила добавляем пользователей которые получают доступ.

Далее надо часть пробросить через второго прова.
И вот тут начались проблемы.

5. В инете прочитал что надо сделать так, добавить дефаулт гв для второго пути:
route add default gw 192.168.1.1 (адрес модема) dev eth2
route add default gw 194.х.х.17 (адрес гв прова) dev eth0

Логика, что все приходящее на eth2 роутится через модем. Однако ничего сам собой не вышло.
Я начал адаптироваться и поменял правила в FORWARDе.

iptables -A FORWARD -s 10.0.1.0/255.255.255.0 -d 192.168.1.0/255.255.255.0 -j ACCEPT
И в этом стиле остальные.
Таким образом отрезал 10.0.1.0 подсеть от возможности вообще ходить через шлюз первого провайдера, а только дав возможность ходить через 192.168.1.0 подсеть т.е. через модем.

Сработало, на удивление. Компы из 10.0.1.0 подсети выходят в инет через второго прова.

Но два дефаултных роута сюдя по всему был плохой совет. Потому, что система стала работать  как-то через жопу, периодически если извне заходишь и не видны становятся хостящие ресурсы и т.д.

Я не могу дать весь конфиг, потому, что зайти не могу на машинку извне, а она в офисе. Завтра из локалки буд ковырять.


Я думаю следующий шаг улучшить это дело - это разнатить подсети полностью по интерфейсам. Что-то вроде как:
iptables -t nat -A POSTROUTING -s 10.0.0.0/255.255.255.0 -o eth0 -j SNAT 194.x.x.17
iptables -t nat -A POSTROUTING -s 10.0.1.0/255.255.255.0 -o eth2 -j SNAT 192.168.1.1
Не знаю, может ошибся - завтра на серве проверю.
И затем в FORWARDe тоже подсети зажать, чтобы могли ходить только по задуманному туннелю.
Но как правильно route и default gw прописать пока нигде не нашел.


Помогите разобраться с сабжем. Для меня это дело - хобби. И интересует не столько конфиг. Я его буду так вот по чуть-чуть отшлифовывать и напишу сам. Сколько въехать в саму логику процесса.


Содержание

Сообщения в этом обсуждении
"Два провайдена + локалка, Linux исключительно iptables+route..."
Отправлено Andrew , 13-Окт-09 07:03 
>[оверквотинг удален]
>Не знаю, может ошибся - завтра на серве проверю.
>И затем в FORWARDe тоже подсети зажать, чтобы могли ходить только по
>задуманному туннелю.
>Но как правильно route и default gw прописать пока нигде не нашел.
>
>
>
>Помогите разобраться с сабжем. Для меня это дело - хобби. И интересует
>не столько конфиг. Я его буду так вот по чуть-чуть отшлифовывать
>и напишу сам. Сколько въехать в саму логику процесса.

http://lartc.org


"Два провайдена + локалка, Linux исключительно iptables+route..."
Отправлено ALex_hha , 13-Окт-09 13:30 
>[оверквотинг удален]
>
>На eth1 два адреса 10.0.0.0 и 10.0.1.0 алиасом, соответственно приходят две локалки
>через свич.
>
>Задача. В инет 10.0.0.0 все идут через eth2, а 10.0.1.0 через eth1
>
>Вторая задача. Хочу все это сделать скриптом с помощью route и iptables
>без iproute2. Потому, что мне нравится логика, когда все прописываешь поэтапно
>в въезжаешь в каждую деталь. Во-вторых хочется для себя разобраться полностью
>как это все делается сначала так, без упрощающих утилит.

Это из серии - "мы не ищем легких путей"? route уже давно deprecated и рекомендуют использовать именно ip из пакета iproute2.


>Я пока сделал так:
>1. iptables все политики на DENY . Затем на инпут и оутпут
>цепочках ип каждого интерфейса разрешил ходить куда им положено.
>2. в FORWARD зафорвардил все подсети, т.е дал им свободные маршруты во
>все направления, фактически.
>iptables -A FORWARD -s 194.44.x.x/255.255.255.248 -j ACCEPT (ип что дан провайдеру свободно
>форвардится в любом направлении) и остальные правила в этом стиле как
>для 194.44.х.х, так и локальных подсетей

не понятно для чего эти правила, в цепочке FORWARD будут только транзитные пакеты и уж точно там не будет 194.44.x.x

>3. В роуте поставил
>route add default gw 194.x.x.17 dev eth0
>
>4. Затем в iptables
>iptables -t nat -A POSTROUTING -s 10.0.0.10 -j MASQUERADE
>
>С этого шага все заработало с 10.0.0.10 компа можно ходить в инет
>через превого провайдера, добавляя сюда правила добавляем пользователей которые получают доступ.

Лучше использовать SNAT, если ip статический


>Далее надо часть пробросить через второго прова.
>И вот тут начались проблемы.
>
>5. В инете прочитал что надо сделать так, добавить дефаулт гв для
>второго пути:
>route add default gw 192.168.1.1 (адрес модема) dev eth2
>route add default gw 194.х.х.17 (адрес гв прова) dev eth0

не правильно


>[оверквотинг удален]
>Я думаю следующий шаг улучшить это дело - это разнатить подсети полностью
>по интерфейсам. Что-то вроде как:
>iptables -t nat -A POSTROUTING -s 10.0.0.0/255.255.255.0 -o eth0 -j SNAT 194.x.x.17
>
>iptables -t nat -A POSTROUTING -s 10.0.1.0/255.255.255.0 -o eth2 -j SNAT 192.168.1.1
>
>Не знаю, может ошибся - завтра на серве проверю.
>И затем в FORWARDe тоже подсети зажать, чтобы могли ходить только по
>задуманному туннелю.
>Но как правильно route и default gw прописать пока нигде не нашел.

тебе нужно натсроить source policy routing. Ссылку тебе уже дали


"Два провайдена + локалка, Linux исключительно iptables+route..."
Отправлено Bzz , 14-Окт-09 15:28 
Короче говоря уговорили, сделал все через ip
Получился следующий скрипт:

---------------------------
#!/bin/bash

IF0=eth0   -- провайдер лан
IF1=eth1   -- локалка
IF2=eth2   -- линк в АДСЛ модем

IP0=194.44.хх.хх
IP10=10.0.0.254
IP11=10.0.1.254
IP2=192.168.1.254

P0=194.44.хх.хх --провайдер лан
P2=192.168.1.1  --АДСЛ модем в режиме роутера

P0_NET=194.44.хх.хх/29
P10_NET=10.0.0.0/24
P11_NET=10.0.1.0/24
P2_NET=192.168.1.0/24

/sbin/ip route flush table T1
/sbin/ip route flush table T2

/sbin/ip route add $P0_NET dev $IF0 src $IP0 table T1
/sbin/ip route add default via $P0 table T1
/sbin/ip route add $P2_NET dev $IF2 src $IP2 table T2
/sbin/ip route add default via $P2 table T2

/sbin/ip route add $P0_NET dev $IF0 src $IP0
/sbin/ip route add $P2_NET dev $IF2 src $IP2
/sbin/ip route add default via $P2

/sbin/ip rule flush
/sbin/ip rule del from all lookup main
/sbin/ip rule add from $IP0 table T1
/sbin/ip rule add from $IP2 table T2
/sbin/ip rule add from $P10_NET table T2
/sbin/ip rule add from $P11_NET table T1
/sbin/ip rule add from all lookup main

/sbin/ip route add $P10_NET     dev $IF1 table T2
/sbin/ip route add $P2_NET      dev $IF2 table T2
/sbin/ip route add 127.0.0.0/8  dev lo   table T2
/sbin/ip route add $P11_NET     dev $IF1 table T1
/sbin/ip route add $P0_NET      dev $IF0 table T1
/sbin/ip route add 127.0.0.0/8  dev lo   table T1
-------------------------------------------------------

flush rule и del from all lookup main стоит там потому, что немного запортачил пока делал правила и мейн всевремя подкидывало наверх и через него в маршрут по-умолчанию уходили все пакеты.

В целом скрипт вот такой. Все работает.
Второй скрипт на iptables но его не привожу он просто раскидывает кому куда ходить и с каких именно ИП можно ходить в инет.

Вопросы - может кто поможет систематизировать это дело? Может чего лишнего написал.


И мне не нравится положение дел вот здесь:
[root@qwerty firewall]# /sbin/ip rule list
0:      from all lookup local
0:      from all lookup local
0:      from 194.44.хх.хх lookup T1
0:      from 192.168.1.254 lookup T2
0:      from 10.0.0.0/24 lookup T2
0:      from 10.0.1.0/24 lookup T1
0:      from all lookup main
Два локала вверху, все что ниже них не flushится . Получилась такая сиутация из-за длительных опытов над этими правилами как-то сама.
Как можно по-умному тут все раскидать один раз скриптом, чтобы уже не лазить сюда повторно?