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

Исходное сообщение
"Маршрутизация ответа на проброшеные пакеты через интефейс входа"

Отправлено phantom74rus , 21-Янв-08 23:04 
Добрый день, искал решение своей проблемы по форуму, но или плохо искал или не нашел, поэтому прошу помочь в решении следующей проблемы:

Имеется шлюз (Linux) с тремя реальными адресами и внутр. сервер HTTP (Mail и т.д).
На шлюзе маршрут по умолчанию выбирается в зависимости от условий т.е. не постоянно смотрит на какой-то один интерфейс. В днс прописаны все три адреса, для отказоустойчивости. Доступ к внутр веб-серверу реалезован с помощью Prerouting. (проброс запросов с помошью проксирования через апач отработан на основе таблиц и правил маршрутизации, но не совсем устраивает. да и нужно еще открыть доступ к почтовому серверу и т.п.)
Вот тут возникает проблема - запросы, которые пришли с "недефолтового" интерфейса пробрасываются внутрь, обрабатываются веб-сервером и выплевываются наружу, но уже через дефолтовый маршрут... как итог - клиент не получает ответа с того интерфейса. на который послан запрос и ничего не видит.
Как я понял - правила на основе источника запроса не проходят, т.к. €работают только в пределах самого шлюза(запрос покидает сам шлюз и шлюз забывает о том, откуда приходил запрос, хотя запросто могу ошибаться)
Подскажите - как можно проброшеные запросы отправлять обратно через тот же интерфей, через который они пришли ?


Содержание

Сообщения в этом обсуждении
"Маршрутизация ответа на проброшеные пакеты через интефейс вх..."
Отправлено PavelR , 22-Янв-08 06:04 
читай LARTC - linux advanced routing  how-to

http://gazette.linux.ru.net/rus/articles/lartc/x348.html


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


"Маршрутизация ответа на проброшеные пакеты через интефейс вх..."
Отправлено phantom74rus , 22-Янв-08 08:49 
>читай LARTC - linux advanced routing  how-to
>
>http://gazette.linux.ru.net/rus/articles/lartc/x348.html
>
>
>запросы, которые приходят на твои внешние адреса _должны_ уходить с того же
>адреса и через тот же самый интерфейс, не зависимо от того,
>есть у тебя проброс в локалку или нет.

Эту статью читал...
Как я понял - на голой системе ничего само ходить не будет, нужны правила для маршрутизации. Правила есть и они работают, но только для самого шлюза.
А вот т.н. форвард пакеты отправлять обратно через интерфейс - это у меня не получается.

192.168.1.0 dev eth3  scope link  src 192.168.1.4
192.168.0.0 dev eth0  scope link  src 192.168.0.5
83.167.2.0 dev eth2  scope link  src 83.167.2.120
83.142.164.160/29 dev eth1  proto kernel  scope link  src 83.142.164.162
83.167.2.0/24 dev eth2  proto kernel  scope link  src 83.167.2.120
192.168.1.0/24 dev eth3  proto kernel  scope link  src 192.168.1.4
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.5
default via 83.167.2.1 dev eth2

32763:  from 192.168.1.4 lookup ertelecom
32764:  from 83.167.2.120 lookup InSYS
32765:  from 83.142.164.162 lookup is74
32766:  from all lookup main
32767:  from all lookup default

83.142.164.160/29 dev eth1  scope link  src 83.142.164.162
default via 83.142.164.161 dev eth1
Для остальных таблиц правила подобные...


"Маршрутизация ответа на проброшеные пакеты через интефейс вх..."
Отправлено PavelR , 22-Янв-08 09:23 
>32763:  from 192.168.1.4 lookup ertelecom
>32764:  from 83.167.2.120 lookup InSYS
>32765:  from 83.142.164.162 lookup is74
>32766:  from all lookup main
>32767:  from all lookup default

Несколько не понятен следующий набор букв и цифр:

>83.142.164.160/29 dev eth1  scope link  src 83.142.164.162
>default via 83.142.164.161 dev eth1

Для успешного лечения выведите пожалуйста результат команд:

ip ro sh table InSYS
ip ro sh table is74

iptables -t nat -nvL --line

iptables -nvL --line



"Маршрутизация ответа на проброшеные пакеты через интефейс вх..."
Отправлено phantom74rus , 22-Янв-08 09:40 
>Для успешного лечения выведите пожалуйста результат команд:
>
>ip ro sh table InSYS
>ip ro sh table is74
>
>iptables -t nat -nvL --line
>
>iptables -nvL --line

ip ro sh table InSYS
83.167.2.0 dev eth2  scope link  src 83.167.2.120
default via 83.167.2.1 dev eth2

ip ro sh table is74
83.142.164.160/29 dev eth1  scope link  src 83.142.164.162
default via 83.142.164.161 dev eth1

iptables -t nat -nvL --line
Chain PREROUTING (policy ACCEPT 24 packets, 2612 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 DNAT       tcp  --  eth1   *       0.0.0.0/0            0.0.0.0/0           tcp dpt:25 to:192.168.0.2
2        0     0 DNAT       tcp  --  eth2   *       0.0.0.0/0            0.0.0.0/0           tcp dpt:25 to:192.168.0.2
3        0     0 DNAT       tcp  --  eth3   *       0.0.0.0/0            0.0.0.0/0           tcp dpt:25 to:192.168.0.2
4        0     0 DNAT       tcp  --  eth1   *       0.0.0.0/0            0.0.0.0/0           tcp dpt:110 to:192.168.0.2
5        0     0 DNAT       tcp  --  eth2   *       0.0.0.0/0            0.0.0.0/0           tcp dpt:110 to:192.168.0.2
6        0     0 DNAT       tcp  --  eth3   *       0.0.0.0/0            0.0.0.0/0           tcp dpt:110 to:192.168.0.2
7        0     0 DNAT       tcp  --  *      *       91.144.135.65        0.0.0.0/0           tcp dpt:1723 to:192.168.0.1
8        0     0 DNAT       47   --  *      *       91.144.135.65        0.0.0.0/0           to:192.168.0.1
9        0     0 DNAT       tcp  --  eth1   *       91.144.135.65        0.0.0.0/0           tcp dpt:3389 to:192.168.0.1
10       0     0 DNAT       tcp  --  eth2   *       91.144.135.65        0.0.0.0/0           tcp dpt:3389 to:192.168.0.1
11       0     0 DNAT       tcp  --  eth3   *       91.144.135.65        0.0.0.0/0           tcp dpt:3389 to:192.168.0.1

Chain POSTROUTING (policy ACCEPT 1 packets, 60 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        2   150 MASQUERADE  0    --  *      *       192.168.0.0/24       0.0.0.0/0

Chain OUTPUT (policy ACCEPT 3 packets, 210 bytes)
num   pkts bytes target     prot opt in     out     source               destination

iptables -nvL --line
Chain INPUT (policy ACCEPT 168 packets, 17140 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1       16  2082 ULOG       0    --  eth2   *       0.0.0.0/0            83.167.2.120        ULOG copy_range 0 nlgroup 2 queue_threshold 1
2        0     0 ULOG       0    --  eth1   *       0.0.0.0/0            83.142.164.162      ULOG copy_range 0 nlgroup 1 queue_threshold 1
3        0     0 ULOG       0    --  eth3   *       0.0.0.0/0            91.144.135.77       ULOG copy_range 0 nlgroup 3 queue_threshold 1
4        0     0 REJECT     0    --  *      *       91.76.119.128        0.0.0.0/0           reject-with icmp-port-unreachable
5        0     0 REJECT     0    --  *      *       200.88.104.71        0.0.0.0/0           reject-with icmp-port-unreachable
6        0     0 REJECT     0    --  *      *       85.141.218.1         0.0.0.0/0           reject-with icmp-port-unreachable
7        0     0 REJECT     0    --  *      *       81.181.81.114        0.0.0.0/0           reject-with icmp-port-unreachable
8        0     0 REJECT     0    --  *      *       216.144.192.118      0.0.0.0/0           reject-with icmp-port-unreachable
9        0     0 REJECT     0    --  *      *       216.144.192.118      0.0.0.0/0           reject-with icmp-port-unreachable
10       0     0 REJECT     0    --  *      *       67.19.82.114         0.0.0.0/0           reject-with icmp-port-unreachable
11       0     0 REJECT     0    --  *      *       66.207.47.66         0.0.0.0/0           reject-with icmp-port-unreachable
12       0     0 REJECT     0    --  *      *       219.243.24.6         0.0.0.0/0           reject-with icmp-port-unreachable
13       0     0 REJECT     0    --  *      *       202.130.106.89       0.0.0.0/0           reject-with icmp-port-unreachable
14       0     0 REJECT     0    --  *      *       61.47.210.106        0.0.0.0/0           reject-with icmp-port-unreachable
15       0     0 REJECT     0    --  *      *       208.73.226.254       0.0.0.0/0           reject-with icmp-port-unreachable
16       0     0 REJECT     0    --  *      *       190.24.131.35        0.0.0.0/0           reject-with icmp-port-unreachable
17       0     0 REJECT     0    --  *      *       80.93.212.74         0.0.0.0/0           reject-with icmp-port-unreachable
18       0     0 REJECT     0    --  *      *       65.79.193.35         0.0.0.0/0           reject-with icmp-port-unreachable
19       0     0 REJECT     0    --  *      *       210.51.173.105       0.0.0.0/0           reject-with icmp-port-unreachable
20     836  458K ACCEPT     0    --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
21       0     0 ACCEPT     0    --  *      *       0.0.0.0/0            0.0.0.0/0           ctstate RELATED,ESTABLISHED
22       0     0 ACCEPT     47   --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
23       0     0 ACCEPT     0    --  *      *       127.0.0.1            0.0.0.0/0
24       0     0 ACCEPT     47   --  *      *       0.0.0.0/0            0.0.0.0/0
25       0     0 ACCEPT     0    --  *      *       91.144.135.65        0.0.0.0/0
26       2   120 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0
27       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:10000
28       2    96 ACCEPT     tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0           tcp dpt:3128
29       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:21
30       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:20
31       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp spt:20 state RELATED,ESTABLISHED
32       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:20 state RELATED,ESTABLISHED
33       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp spt:21 state NEW,ESTABLISHED
34       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:21 state RELATED,ESTABLISHED
35       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp spts:1024:65535 state RELATED,ESTABLISHED
36       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpts:1024:65535 state RELATED,ESTABLISHED
37       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22
38      45  2172 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80
39       0     0 ACCEPT     tcp  --  *      *       192.168.0.8          0.0.0.0/0           tcp dpt:5901
40       0     0 ACCEPT     tcp  --  *      *       192.168.0.242        0.0.0.0/0           tcp dpt:5901
41       0     0 ACCEPT     tcp  --  *      *       192.168.0.243        0.0.0.0/0           tcp dpt:5901
42      11   528 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp flags:0x17/0x02 reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1       16  1611 ULOG       0    --  eth2   eth0   !83.167.2.120         0.0.0.0/0           ULOG copy_range 0 nlgroup 2 queue_threshold 1
2       16   768 ULOG       0    --  eth0   eth2    0.0.0.0/0           !83.167.2.120        ULOG copy_range 0 nlgroup 2 queue_threshold 1
3        6   363 ULOG       0    --  eth3   eth0   !192.168.1.4          0.0.0.0/0           ULOG copy_range 0 nlgroup 3 queue_threshold 1
4        5   412 ULOG       0    --  eth0   eth3    0.0.0.0/0           !192.168.1.4         ULOG copy_range 0 nlgroup 3 queue_threshold 1
5        0     0 ULOG       0    --  eth1   eth0   !83.142.164.162       0.0.0.0/0           ULOG copy_range 0 nlgroup 1 queue_threshold 1
6        0     0 ULOG       0    --  eth0   eth1    0.0.0.0/0           !83.142.164.162      ULOG copy_range 0 nlgroup 1 queue_threshold 1
7       41  3002 ACCEPT     0    --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
8        0     0 ACCEPT     0    --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
9        0     0 ACCEPT     47   --  *      *       0.0.0.0/0            0.0.0.0/0
10       0     0 ACCEPT     0    --  *      gre     0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
11       0     0 REJECT     tcp  --  *      *       192.168.0.2          0.0.0.0/0           tcp dpt:135 reject-with icmp-port-unreachable
12       0     0 REJECT     udp  --  *      *       192.168.0.2          0.0.0.0/0           udp dpt:135 reject-with icmp-port-unreachable
13       0     0 REJECT     tcp  --  *      *       192.168.0.2          0.0.0.0/0           tcp dpts:6666:6669 reject-with icmp-port-unreachable
14       0     0 ACCEPT     0    --  *      *       192.168.0.9          0.0.0.0/0
15       0     0 ACCEPT     0    --  *      *       192.168.0.3          0.0.0.0/0
16       0     0 ACCEPT     0    --  *      *       192.168.0.2          0.0.0.0/0
17       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.0.2         tcp dpt:110
18       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.0.2         tcp dpt:25
19       0     0 ACCEPT     0    --  *      *       192.168.0.1          0.0.0.0/0
20       0     0 ACCEPT     0    --  *      *       0.0.0.0/0            192.168.0.6
21       0     0 ACCEPT     0    --  *      *       192.168.0.6          0.0.0.0/0
22       0     0 ACCEPT     0    --  *      *       192.168.0.242        0.0.0.0/0
23       0     0 ACCEPT     0    --  *      *       192.168.0.243        0.0.0.0/0
24       0     0 ACCEPT     tcp  --  *      *       192.168.0.8          0.0.0.0/0           tcp dpt:5190
25       0     0 ACCEPT     tcp  --  *      *       192.168.0.242        0.0.0.0/0           tcp dpt:5190
26       0     0 ACCEPT     tcp  --  *      *       192.168.0.243        0.0.0.0/0           tcp dpt:5190
27       0     0 ACCEPT     tcp  --  *      *       192.168.0.92         0.0.0.0/0           tcp dpt:5190
28       0     0 ACCEPT     tcp  --  *      *       192.168.0.99         0.0.0.0/0           tcp dpt:5190
29       0     0 ACCEPT     tcp  --  *      *       192.168.0.101        0.0.0.0/0           tcp dpt:5190
30       0     0 ACCEPT     tcp  --  *      *       192.168.0.179        0.0.0.0/0           tcp dpt:5190
31       0     0 ACCEPT     tcp  --  *      *       192.168.0.37         0.0.0.0/0           tcp dpt:5190
32       0     0 ACCEPT     tcp  --  *      *       192.168.0.110        0.0.0.0/0           tcp dpt:5190
33       0     0 ACCEPT     tcp  --  *      *       192.168.0.52         0.0.0.0/0           tcp dpt:5190
34       0     0 ACCEPT     tcp  --  *      *       192.168.0.172        0.0.0.0/0           tcp dpt:5190
35       0     0 ACCEPT     tcp  --  *      *       192.168.0.29         0.0.0.0/0           tcp dpt:5190
36       0     0 ACCEPT     tcp  --  *      *       192.168.0.61         0.0.0.0/0           tcp dpt:5190
37       0     0 ACCEPT     tcp  --  *      *       192.168.0.173        0.0.0.0/0           tcp dpt:5190
38       0     0 ACCEPT     tcp  --  *      *       192.168.0.66         0.0.0.0/0           tcp dpt:5190
39       0     0 ACCEPT     tcp  --  *      *       192.168.0.141        0.0.0.0/0           tcp dpt:5190
40       0     0 ACCEPT     tcp  --  *      *       192.168.0.8          0.0.0.0/0           tcp dpt:25
41       0     0 ACCEPT     tcp  --  *      *       192.168.0.99         0.0.0.0/0           tcp dpt:25
42       0     0 ACCEPT     tcp  --  *      *       192.168.0.37         0.0.0.0/0           tcp dpt:25
43       0     0 ACCEPT     tcp  --  *      *       192.168.0.8          0.0.0.0/0           tcp dpt:110
44       0     0 ACCEPT     tcp  --  *      *       192.168.0.99         0.0.0.0/0           tcp dpt:110
45       0     0 ACCEPT     tcp  --  *      *       192.168.0.37         0.0.0.0/0           tcp dpt:110
46       0     0 ACCEPT     icmp --  *      *       192.168.0.8          0.0.0.0/0
47       0     0 ACCEPT     tcp  --  *      *       192.168.0.37         0.0.0.0/0           tcp dpt:5280
48       0     0 ACCEPT     tcp  --  *      *       192.168.0.37         0.0.0.0/0           tcp dpt:4444
49       0     0 ACCEPT     tcp  --  *      *       192.168.0.37         0.0.0.0/0           tcp dpt:443
50       0     0 ACCEPT     tcp  --  *      *       192.168.0.79         0.0.0.0/0           tcp dpt:4444
51       0     0 ACCEPT     tcp  --  *      *       192.168.0.79         0.0.0.0/0           tcp dpt:443
52       0     0 ACCEPT     tcp  --  *      *       192.168.0.42         0.0.0.0/0           tcp dpt:4444
53       0     0 ACCEPT     tcp  --  *      *       192.168.0.42         0.0.0.0/0           tcp dpt:443
54       0     0 ACCEPT     tcp  --  *      *       192.168.0.40         0.0.0.0/0           tcp dpt:4444
55       0     0 ACCEPT     tcp  --  *      *       192.168.0.40         0.0.0.0/0           tcp dpt:443
56       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.0.1         tcp dpt:1723
57       0     0 ACCEPT     47   --  *      *       0.0.0.0/0            192.168.0.1
58       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.0.1         tcp dpt:80
59       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.0.2         tcp dpt:80
60       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.0.6         tcp dpt:80
61       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.0.2         tcp dpt:25
62       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.0.2         tcp dpt:21
63       0     0 ACCEPT     tcp  --  *      *       192.168.0.8          0.0.0.0/0           tcp dpts:20:21
64       0     0 ACCEPT     tcp  --  *      *       192.168.0.24         0.0.0.0/0           tcp dpts:20:21
65       2   152 REJECT     0    --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1       19  2166 ULOG       0    --  *      eth2    83.167.2.120         0.0.0.0/0           ULOG copy_range 0 nlgroup 2 queue_threshold 1
2        0     0 ULOG       0    --  *      eth1    83.142.164.162       0.0.0.0/0           ULOG copy_range 0 nlgroup 1 queue_threshold 1
3        0     0 ULOG       0    --  *      eth3    192.168.1.4        0.0.0.0/0           ULOG copy_range 0 nlgroup 3 queue_threshold 1
4      925  505K ACCEPT     0    --  *      *       0.0.0.0/0            0.0.0.0/0
5        0     0 ACCEPT     0    --  *      *       127.0.0.1            0.0.0.0/0

Прероутинг для веб-сервера сейчас отключен, но приводился в действие с помошью
-A PREROUTING -d 83.142.164.162 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.6
и т.д.


"Маршрутизация ответа на проброшеные пакеты через интефейс вх..."
Отправлено PavelR , 22-Янв-08 15:59 
Честно говоря не особо понимаю в чем проблема. Описание маршрутизации через нескольких провайдеров, как это сделано у меня. Forward использовался некоторое время, сейчас не используется, так что не всё понятно.

После того, как прогоняется стартовый скрипт (у меня)

ip ru sh должен быть в результате таким:

0:      from all lookup local  <- локальные интерфейсы
1000:   from all lookup main   <- основная таблица маршрутизации. Используется как таблица маршрутизации в directly-connected сетки. Шлюз по умолчанию из неё удаляется

ip ro del default
и потом добавляется в таблицу default

ip ro add devault via DEF_GW dev DEV_DEF_GW [src DEF_SRC если надо] table default

<!--
Обратите внимание на следующие правила. Они нужны, чтобы из локальных подсеток можно было обращаться на другие адреса нашего рутера.
Локальные подсетки - те сетки, у которых шлюз по умолчанию - этот роутер.
Иначе пакет будет идти вместо локальной сети на удаленный шлюз провайдера.
-->


2000:   from net1_ip to net3 lookup main
2010:   from net2_ip to net3 lookup main


<!-- дальше можно вставить кого куда рулить (NAT) из локалки  принудительно -->
_на_ определенный айпи
3000:   from all to some_ip lookup net1
3100:   from all to some_ip2 lookup net2
3200:   from all to some_ip3 lookup net3
_с_ определенного айпи, локального
4000:   from some_ip4 lookup net1
4500:   from some_ip5 lookup net2

<!--теперь опишем наши интерфейсы и их адреса-->

5000:   from net1_ip lookup net1
5050:   from net2_ip lookup net2
5060:   from net3_ip lookup net3
10000:  from all lookup default  <-- только вот тут пойдет по дефолт маршруту


"Маршрутизация ответа на проброшеные пакеты через интефейс вх..."
Отправлено phantom74rus , 22-Янв-08 17:13 
Может я просто не до конца еще разобрался (совсем недавно взялся за это)?

Вот мои размышления:
Есть 3 интерфейса торчащие в инет eth1, eth2, eth3 и локальный eth0. (на шлюзе)
Есть три таблици для сетей на этих интерфейсах и три правила from для сопоставления с этими таблицами, в зависимости откуда пришел запрос. (выше они приведены)

дефолтовый маршрут смотрит на один из интерфейсов, допустим на eth1. Клиент цепляется к eth3, запрашивая ресурс, шлюз (по прероутингу) его пробрасывает через eth0 на внутр сервер, сервер отсылает ответ, который возвращается шлюзу, но шлюз не находит в правилах "from" этого источника (т.к. тут уже не from, а to (клиент из интернет и не относится ни к одной из трех внешних сетей))и направляет ответ на eth1... итог - клиент ничего не видит.

А правила у меня создаются следующие, но работают-то они только для самого шлюза (т.е. пакет пришел, обработался шлюзом, который отправил ответ обратно клиенту):
ip route add to $P1_NET dev $P1_IF src $P1_IP
ip route add $P1_NET dev $P1_IF src $P1_IP table $P1_TBL
ip route add default via $P1_GW table $P1_TBL

ip route add to $P2_NET dev $P2_IF src $P2_IP
ip route add $P2_NET dev $P2_IF src $P2_IP table $P2_TBL
ip route add default via $P2_GW table $P2_TBL

ip route add to $P3_NET dev $P3_IF src $P3_IP
ip route add $P3_NET dev $P3_IF src $P3_IP table $P3_TBL
ip route add default via $P3_GW table $P3_TBL

# трафик, исходящий с ip интерфейса будет уходить соответствующему провайдеру
ip rule add from $P1_IP table $P1_TBL
ip rule add from $P2_IP table $P2_TBL
ip rule add from $P3_IP table $P3_TBL
# маршрут по-умолчанию
ip route add default via $P1_GW


"Маршрутизация ответа на проброшеные пакеты через интефейс вх..."
Отправлено PavelR , 22-Янв-08 19:06 
Я когда настраивал - у меня всё получилось и проблем не возникло. Сейчас не использую, но времени на тестирование нет.

>дефолтовый маршрут смотрит на один из интерфейсов, допустим на eth1. Клиент цепляется
>к eth3, запрашивая ресурс, шлюз (по прероутингу) его пробрасывает через eth0
>на внутр сервер, сервер отсылает ответ, который возвращается шлюзу, но шлюз
>не находит в правилах "from" этого источника (т.к. тут уже не
>from, а to (клиент из интернет и не относится ни к
>одной из трех внешних сетей))и направляет ответ на eth1... итог -
>клиент ничего не видит.

сервер отсылает ответ, в фазе PREROUTING он проходит обратную трансляцию, и в пакете адрес  отправителя становится не сервер, а тот айпишник, на который пришел запрос.
Дальше он должен пойти в маршрутизации по правилу "from".

>[оверквотинг удален]
>ip route add to $P1_NET dev $P1_IF src $P1_IP
>ip route add $P1_NET dev $P1_IF src $P1_IP table $P1_TBL
>ip route add default via $P1_GW table $P1_TBL
>
>ip route add to $P2_NET dev $P2_IF src $P2_IP
>ip route add $P2_NET dev $P2_IF src $P2_IP table $P2_TBL
>ip route add default via $P2_GW table $P2_TBL
>ip route add to $P3_NET dev $P3_IF src $P3_IP
>ip route add $P3_NET dev $P3_IF src $P3_IP table $P3_TBL
>ip route add default via $P3_GW table $P3_TBL

Вот на этот момент я говорю:
если сделать некоторую рекомбинацию, то получим

три правила на directly-connected сетки. Эти правила не нужны, т.к. эти маршруты создаются при поднятии интерфейса. В таблице main, нужно только её использовать, с учетом удаления default.

ip route add to $P1_NET dev $P1_IF src $P1_IP
ip route add to $P2_NET dev $P2_IF src $P2_IP
ip route add to $P3_NET dev $P3_IF src $P3_IP


Эти три правила мне кажутся дублирующими два предыдущих.

ip route add $P1_NET dev $P1_IF src $P1_IP table $P1_TBL
ip route add $P2_NET dev $P2_IF src $P2_IP table $P2_TBL
ip route add $P3_NET dev $P3_IF src $P3_IP table $P3_TBL

В нужности этих трех никто не сомневается.

ip route add default via $P1_GW table $P1_TBL
ip route add default via $P2_GW table $P2_TBL
ip route add default via $P3_GW table $P3_TBL


==============


Если входящие соединения устанавливать на адреса/порты открытые на router - все работает как надо и входит и уходит по правильным интерфейсам ?


"Маршрутизация ответа на проброшеные пакеты через интефейс вх..."
Отправлено MVictorL , 22-Янв-08 20:46 
Может тупо, но вдруг -- ip_forward включен?

"Маршрутизация ответа на проброшеные пакеты через интефейс вх..."
Отправлено MVictorL , 22-Янв-08 20:46 
;-)

"Маршрутизация ответа на проброшеные пакеты через интефейс вх..."
Отправлено phantom74rus , 22-Янв-08 20:48 
>[оверквотинг удален]
>ip route add to $P2_NET dev $P2_IF src $P2_IP
>ip route add to $P3_NET dev $P3_IF src $P3_IP
>
>
>Эти три правила мне кажутся дублирующими два предыдущих.
>
>ip route add $P1_NET dev $P1_IF src $P1_IP table $P1_TBL
>ip route add $P2_NET dev $P2_IF src $P2_IP table $P2_TBL
>ip route add $P3_NET dev $P3_IF src $P3_IP table $P3_TBL
>

Я представлял себе то, что это занесение данных в соответствующие таблицы, для последующего использования на основе нижеследующих правил.
>[оверквотинг удален]
>ip route add default via $P1_GW table $P1_TBL
>ip route add default via $P2_GW table $P2_TBL
>ip route add default via $P3_GW table $P3_TBL
>
>
>==============
>
>
>Если входящие соединения устанавливать на адреса/порты открытые на router - все работает
>как надо и входит и уходит по правильным интерфейсам ?

Да, если работать не со внутр. серверами, а со шлюзом - все работает отлично, но опять же только с этими правилами. Без этих правил все сыпалось по дефолтовому маршруту. Видимо я просто не до конца еще осознаю механизм маршрутизации :(

P.S. Может возможно как-нибудь пообщаться? для перенятия опыта :) (например ICQ)
P.P.S А разве ip_forward не должен быть включен ? (чувствую себя совершенным чайником :( )


"Маршрутизация ответа на проброшеные пакеты через интефейс вх..."
Отправлено PavelR , 23-Янв-08 09:46 

>P.S. Может возможно как-нибудь пообщаться? для перенятия опыта :) (например ICQ)
>P.P.S А разве ip_forward не должен быть включен ? (чувствую себя совершенным
>чайником :( )

Отпиши аську на мыло test
в домене
termexlab_ru



"Маршрутизация ответа на проброшеные пакеты через интефейс вх..."
Отправлено MVictorL , 23-Янв-08 10:52 
>
>>P.S. Может возможно как-нибудь пообщаться? для перенятия опыта :) (например ICQ)
>>P.P.S А разве ip_forward не должен быть включен ? (чувствую себя совершенным
>>чайником :( )
>
>Отпиши аську на мыло test
>в домене
>termexlab_ru

Пообщаться не проблема, но, например, я себя не считаю большим спецом, т.ч. смысла большого не будет.
А по ip_forwarding см. файл /proc/sys/net/ipv4/ip_forward -- по умолчанию в Linux там '0', т.е. ip_forward запрещен. Включается перманентно он путем редактирования файла /etc/sysctl.conf:

net.ipv4.ip_forward = 1

Вдруг поможет...


"Маршрутизация ответа на проброшеные пакеты через интефейс вх..."
Отправлено PavelR , 25-Апр-08 06:47 
На форуме часто задается вопрос, по поводу маршрутизации сети, подключенной к двум провайдерам.
В частном случае проблема расширяется тем, что нужно осуществлять проброс соединений к сервисам, расположенным в локальной сети.
Это делается с помощью DNAT, и при этом снова возникает проблема - по каналу какого провайдера отправлять ответ.
Проблема усугубляется тем, что обратное преобразование адресов выполняется уже после принятия решения о маршрутизации,
т.е. примерно в районе цепочки POSTROUTING, но скрытно от пользователя (в отличие от явного заворота на диверт в ipfw@freebsd).

Решить эту нерешаемую проблему поможет модуль CONNMARK.  Принцип работы маршрутизатора для решения описанной задачи будет выглядеть примерно так:

Входящие соединения маркируются определенным флажком, после чего делается их проброс в нужное назначение.
Каждый обратный пакет соединения _до принятия решения о маршрутизации_ маркируется флажком соответствующего ему соединения (флажок восстанавливается).
На основании флажков принимается решение о маршрутизации пакета в соответствующую сеть.


В нижеописанном примере обеспечение доступности сервиса по двум каналам/провайдерам делалось для локального сервиса маршрутизатора.
В связи с этим маркировка исходящих пакетов делается в цепочке OUTPUT таблицы mangle. Для проброса порта к  серверу в локальной сети
(в DMZ) проверку и восстановление маркера надо делать в цепочке PREROUTING.
Таким образом, "обратный DNAT" будет происходить когда пакет уже будет идти по нужному маршруту.

Все не маркированные пакеты будут идти по маршруту по умолчанию. В моем случае это первый провайдер first и айпи интерфейса first_ip.
Входящие пакеты/соединения с порта второго провайдера (destination <second_ip>) будут помечены маркером и к ним будет применен DNAT.
Все исходящие (обратные) пакеты  будут промаркированы значением маркера соединения в цепочке OUTPUT таблицы mangle.

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


[root@test z]# iptables -t nat -nvL PREROUTING
Chain PREROUTING (policy ACCEPT 144M packets, 9659M bytes)
pkts bytes target     prot opt in     out     source               destination
    1    52 CONNMARK   tcp  --  *      *       0.0.0.0/0            <second_ip>      tcp dpt:<port> CONNMARK set 0x1
    1    52 DNAT       tcp  --  *      *       0.0.0.0/0            <second_ip>      tcp dpt:<port> to:<first_ip>:<port>


[root@test z]# iptables -t mangle -nvL OUTPUT
Chain OUTPUT (policy ACCEPT 6745M packets, 7048G bytes)
pkts bytes target     prot opt in     out     source               destination
65915 8600K CONNMARK   tcp  --  *      *       <first_ip>            0.0.0.0/0           tcp spt:<port> CONNMARK restore


[root@test z]# ip ru sh
0:      from all lookup local
1000:   from all lookup main
3300:   from all fwmark 0x1 lookup <second>
5000:   from <first_ip> lookup <first>
5500:   from <second_ip> lookup <second>
10000:  from all lookup default
32766:  from all lookup main
32767:  from all lookup default