LINUX.ORG.RU
ФорумAdmin

Появился второй провайдер. Как выход через инет через него. Все остальное по старому.


1

1

Есть сервер,на котором есть apache, postfix и другие сервера. Появился еще один пров, доступ к которому пока сделан через NAT.
Задача.
1. Настроить, чтобы все пользователи локальной сети пошли через нового провайдера
2. Все остальное должно работать по старому.
Взял для примера настройку тут
в файл
/etc/iproute2/rt_tables добавил 2 таблицы
201 T1
202 T2

#!/bin/sh
set -x
# Поднимаем доп интерфейс для связи с новым провом
ifconfig  eth0:1 172.16.151.2 netmask 255.255.255.248 up
route del default
IF2=eth0:1 
IF1=eth1
IP2="172.16.151.2" 
IP1="78.36.168.210"#ip адрес старого интерфейса P2="172.16.151.1" # шлюз2
P1="78.36.168.209" # шлюз 1 
P1_NET="78.36.168.208/30" #сеть 1
P2_NET="172.16.151.0/29" #сеть 2
IP="/sbin/ip"
P0_NET="172.16.131.0/24" # Внутренняя сеть - доступ в инет через VPN
# маршрут к шлюзу и маршрут по-умолчанию через этот шлюз
$IP route add $P1_NET dev $IF1 src $IP1 table T1
$IP route add default via $P1 table T1
$IP route add $P2_NET dev $IF2 src $IP2 table T2
$IP route add default via $P2 table T2

# настроить главную таблицу маршрутизации.
#$IP route add $P1_NET dev $IF1 src $IP1
#$IP route add $P2_NET dev $IF2 src $IP2 

# Теперь задаем маршрут по умолчанию
$IP route add default via $P1

# Зададим правила маршрутизации. Они будут отвечать за то, какая таблица будет 
# использоваться при маршрутизации. Вы хотите, чтобы пакет с определенным адресом 
# источника маршрутизировался через соответствующий интерфейс:
ip rule add from $IP1 table T1
ip rule add from $IP2 table T2

ip route add $P0_NET     dev $IF2 table T2
ip route add 127.0.0.0/8 dev lo   table T1
Доступ в инет раньше задавался правилом
iptables -t nat -A POSTROUTING -s 172.16.131.0/24  -j SNAT --to-source 78.36.168.210
Пробовал MASQUERADE - не работает. Подскажите, что я не так сделал.


Может не совсем прав и есть более корректное решение, если я не ошибаюсь то демоны работают от имени каких либо пользователей.

К примеру httpd - user -> apache и если в iptables указать, что именно этому пользователю ходить только сюда - через eth0:1 ?

--match owner --uid-owner

doctor-ua ()

Нужно маркировать пакеты(iptables, действие MARK), и заворачивать их в таблицу нового прова(ip rule fwmark). А те правила, что сейчас прописаны вообще неясно для чего нужны, потому как они пытаются заворачивать пакеты возвращающиеся на сервер от провайдера, хотя задача «Настроить, чтобы все пользователи локальной сети пошли через нового провайдера».

Вот тут есть подробный ман со всеми инструкциями на русском языке.

shell-script ★★★★★ ()
Ответ на: комментарий от shell-script

Зачем маркировать то. И так понятно, что все пакеты из сети 172.16.131.0/24 должны идти через интерфейс eth0:1
Но, если пишу правило

iptables -t nat -A POSTROUTING -s 172.16.131.0/24  -j SNAT --to-source 172.16.151.2
То ничего не работает, тк попав на интерфейс eth0:1 пакет не знает, что ему нужно идти на адрес шлюза данной сети.
Вот и нужно прописать правильные default route для обеих сетей.

mnk ()
Ответ на: комментарий от shell-script

Сделал так
Добавил таблицу q1

iptables -A POSTROUTING -t mangle -s 172.16.131.0/24  -j MARK --set-mark 100
iptables -t nat -A POSTROUTING -s 172.16.131.0/24  -j SNAT --to-source 172.16.151.2
ip rule add fwmark 100 table q1
ip route add default via 172.16.151.1 dev eth0:1 table q1
и не работает.

mnk ()

Как вариант

/etc/postfix/main.cf :

  inet_interfaces = eth0
/etc/apache2/ports.conf :
  listen oldaddress

И так далее

UFO-man ()
Ответ на: комментарий от shell-script

Может быть и правильно, но
1. Почему T1? Может
ip rule add from $P0_NET table T2
2. Пробовал - тоже не работает.
И еще как сбросить те изменения которые наделал?
те скрипт выглядит так

IF2=eth0:1 
IF1=eth1
IP2="172.16.151.2" 
IP1="78.36.168.210" 
P1="78.36.168.209" 
P2="172.16.151.1"  
P1_NET="78.36.168.208/30" 
P2_NET="172.16.151.0/29" 
IP="/sbin/ip"
P0_NET="172.16.131.0/24" 
# маршрут к шлюзу и маршрут по-умолчанию через этот шлюз
$IP route add $P2_NET dev $IF2 src $IP2 table T2
$IP route add default via $P2 table T2
ip rule add from $P0_NET table T2
$IP route add default via $P1

mnk ()
Ответ на: комментарий от mnk

1. Почему T1? Может
ip rule add from $P0_NET table T2

Под словом «правильно» я имел ввиду подход без маркировки в iptables.

2. Пробовал - тоже не работает.

После изменений в маршрутах надо делать ip route flush cache, иначе настройки не применяются. Т.е. эту команду надо давать перед каждым новым тестом.

И еще как сбросить те изменения которые наделал?

Если маршрутов немного, удалить руками. Если накопилась каша, использовать всё тот же ip route flush(в man ip синтаксис расписан довольно подробно).

те скрипт выглядит так

В iptables маскарад или нат в любом случае должен быть.

В общем, покажи полные настройки в последней версии. В нынешнем скрипте, я так понял, ты выкинул половину команд? Зачем? Надо было просто добавить недостающие ip rule правила. В той статье, по которой ты настраивал, они, кстати, были, а в твоём первоначальном скрипте почему-то нет. Попробуй всё сделать с чистого листа не торопясь.

shell-script ★★★★★ ()
Ответ на: комментарий от mnk

Какой смысл маркировать в POSTROUTING, после того как будет выбор маршрута? Почему при использовании маркировки SNAT правило пишется для ip-адресов, а не для маркера пакета? Маршрут не надо писать через алиас интерфейса (eth0:1), надо через основное имя (eth0).

Возможно, в таблицу q1 нужно будет дописать другие маршруты (к локальным сетям), иначе вобще всё пойдёт через 172.16.151.1.

mky ★★★★★ ()
Ответ на: комментарий от mky

Про маркировку пакетов Вы, наверно правы
Дык маркер то нужен для ip route.
Про алиас - завтра попробую.
Вот заработало в таком варианте

route del default
IF2=eth0:1 
IF1=eth1
IP2="172.16.151.2" 
IP1="78.36.168.210" 
P1="78.36.168.209" 
P2="172.16.151.1"  
P1_NET="78.36.168.208/30" 
P2_NET="172.16.151.0/29" 
IP="/sbin/ip"
P0_NET="172.16.131.0/24" 
# маршрут к шлюзу и маршрут по-умолчанию через этот шлюз
$IP route add $P1_NET dev $IF1 src $IP1 table T1
$IP route add default via $P1 table T1
$IP route add $P2_NET dev $IF2 src $IP2 table T2
$IP route add default via $P2 table T2

$IP route add default via $P2

$IP rule add from $IP1 table T1
$IP rule add from $IP2 table T2

$IP route add $P0_NET     dev $IF2 table T2
$IP route add 127.0.0.0/8 dev lo   table T1

$IP rule add from $P0_NET table T2
Правда похоже, что надо делать по другому, тк в таком варианте, squid перестал работать. И если сидеть в консоли то инет пойдет через более медленный старый интерфейс.
А мне нужно, что бы через старый интерфейс работали только те сервера (сервисы), для которых это важно. Прикинул - это только postfix.
Apache - будет работать в любом случае, лишь бы пакеты возвращались туда, откуда пришли.
Те установка меняется. По умолчанию ставим новый интерфейс. А вот для Postfix нужен маршрут через eth1. Те, наверно, нужна маркировка пакетов по порту. Завтра буду пробовать.

mnk ()
Ответ на: комментарий от mnk

Дык маркер то нужен для ip route.

Если вы уж вводите маркер, то лучше использовать его по полной (и для SNAT правила), потом будет проще. Допустим какой-нибудь ip-адрес нужно будет пустить по старому маршруту. Тогда только так где маркировка нужно будет править правила, а SNAT правила не трограть.

Алиасы (eth0:1) вобще не нужны. Они тянутся из прошлого, когда не было команды ip. В некоторых дистрибутивах алиасы это единственный способ сделать нескольо ip-адресов на интерфейсе штатными средствами (/etc/sysconfig/network-scripts/... например). Если же адрес цепляется скриптом, его можно добавлять на этот же интерфейс командой ip:

ip addr add 172.16.151.2/29 dev eth1

Postfix (ЕМНИП) умел биндится (bind) на заданый ip-адрес. То есть ему можно прописать, чтобы он «шёл» в инет от адреса 78.36.168.210 и тогда маркировка пакетов будет не нужна.

mky ★★★★★ ()

default route на старого провайдера, в iptables правило «-t nat -A POSTROUTING -s 172.16.131.0/24 -j SNAT --to-source 172.16.151.2». Вроде всё.

berrywizard ★★★★★ ()
Ответ на: комментарий от berrywizard

Да не все. Откуда сервер знает шлюз в сети 172.16.151.0?
Сделал пока так.
1. Настроил ip route, что бы, пакеты из вне уходили на те же интерфейсы откуда и пришли.
2. default route на новую сеть.
3. Помечаю пакеты, с почтовика и пересылаю их на старый интерфейс

iptables -A OUTPUT -t mangle -p tcp -m tcp --sport 25  -j MARK --set-mark 100
/sbin/ip rule add fwmark 100 table T1
4. В постфиксе пришлось добавить строку
smtp_bind_address = 78.36.168.210
Иначе письма рассылок возвращались обратно
5. В DNS сервере добавил еще одну доверенную сеть 172.16.151.0
Пока все, c DNS еще может вылезут косяки, если придется синхронизировать зоны с провом, но пока все работает.

mnk ()
Ответ на: комментарий от mnk

> Откуда сервер знает шлюз в сети 172.16.151.0?

Э?

...
P2="172.16.151.1" # шлюз2
...
т. е. где-то же есть
ip route add 172.16.151.0/29 via 172.16.151.1
Для сервисов на самом шлюзе, к которым идёт обращение извне, source-адрес их ответов никак не будет 172.16.151.2, и они в NAT-правило не попадут.

berrywizard ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.