LINUX.ORG.RU
решено ФорумAdmin

Проблема настройки маршрутизации со вторым каналом интернет + IPSec + внутренние сайты


1

1

Добрый день! В данный момент на шлюзе имеются такие настройки:

# ifconfig
eth0      Link encap:Ethernet  HWaddr cc:cc:cc:cc:cc:cc  
          inet addr:192.168.200.10  Bcast:192.168.200.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupt:29 Base address:0xe000 

eth1      Link encap:Ethernet  HWaddr dd:dd:dd:dd:dd:dd  
          inet6 addr: fe80::214:d1ff:fe15:bd24/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1400  Metric:1
          RX packets:13045311 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12113512 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:9394208816 (9.3 GB)  TX bytes:2627579737 (2.6 GB)
          Interrupt:21 Base address:0xbc00 

eth1:1    Link encap:Ethernet  HWaddr dd:dd:dd:dd:dd:dd  
          inet addr:11.22.33.205  Bcast:11.22.33.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1400  Metric:1
          Interrupt:21 Base address:0xbc00 

eth2      Link encap:Ethernet  HWaddr ee:ee:ee:ee:ee:ee  
          inet addr:192.168.1.241  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::214:d1ff:fe10:c40e/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:14237829 errors:0 dropped:341 overruns:0 frame:0
          TX packets:15173684 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:3663482603 (3.6 GB)  TX bytes:10402933575 (10.4 GB)
          Interrupt:20 Base address:0x2000 

eth2:1    Link encap:Ethernet  HWaddr ee:ee:ee:ee:ee:ee  
          inet addr:192.168.1.240  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:20 Base address:0x2000 

eth2:2    Link encap:Ethernet  HWaddr ee:ee:ee:ee:ee:ee  
          inet addr:10.1.1.1  Bcast:10.255.255.255  Mask:255.0.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:20 Base address:0x2000 

lo        Link encap:Локальная петля (Loopback)  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:484108 errors:0 dropped:0 overruns:0 frame:0
          TX packets:484108 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:182401129 (182.4 MB)  TX bytes:182401129 (182.4 MB)

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:172.16.130.1  P-t-P:172.16.130.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:56258 errors:0 dropped:0 overruns:0 frame:0
          TX packets:36244 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:4824487 (4.8 MB)  TX bytes:6445844 (6.4 MB)

11.22.33.205 - наш выделенный IP-адрес

# iptables -tnat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       tcp  --  0.0.0.0/0            11.22.33.205      tcp dpt:2447 to:192.168.1.247:22 

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       all  --  10.1.1.5             0.0.0.0/0           mark match !0x1 to:11.22.33.205 
SNAT       all  --  172.16.130.0/24      0.0.0.0/0           to:192.168.1.240 
SECOND_ROUTE  all  --  192.168.1.0/24       0.0.0.0/0           

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain SECOND_ROUTE (1 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            192.168.1.0/24       
SNAT       all  --  192.168.1.0/24       0.0.0.0/0           mark match !0x1 to:11.22.33.205 
# iptables -tmangle -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
MARK       all  --  0.0.0.0/0            192.168.3.0/24      MARK xset 0x1/0xffffffff 
MARK       all  --  0.0.0.0/0            10.10.10.0/24       MARK xset 0x1/0xffffffff 

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
MARK       all  --  0.0.0.0/0            192.168.3.0/24      MARK xset 0x1/0xffffffff 

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
# iptables -tfilter -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
# ip rule
0:	from all lookup local 
32766:	from all lookup main 
32767:	from all lookup default
# ip route show table main
55.66.77.20 via 11.22.33.205 dev eth1 
172.16.130.2 dev tun0  proto kernel  scope link  src 172.16.130.1 
172.16.130.0/24 via 172.16.130.2 dev tun0 
11.22.33.0/24 dev eth1  proto kernel  scope link  src 11.22.33.205 
192.168.3.0/24 dev eth1  scope link  src 192.168.1.241 
192.168.1.0/24 dev eth2  proto kernel  scope link  src 192.168.1.241 
192.168.200.0/24 dev eth0  proto kernel  scope link  src 192.168.200.10 
10.0.0.0/8 dev eth2  proto kernel  scope link  src 10.1.1.1 
default via 11.22.33.205 dev eth1  scope link
# ip route show table local
local 192.168.200.10 dev eth0  proto kernel  scope host  src 192.168.200.10 
broadcast 192.168.1.0 dev eth2  proto kernel  scope link  src 192.168.1.241 
broadcast 127.255.255.255 dev lo  proto kernel  scope link  src 127.0.0.1 
broadcast 192.168.200.255 dev eth0  proto kernel  scope link  src 192.168.200.10 
broadcast 11.22.33.0 dev eth1  proto kernel  scope link  src 11.22.33.205 
broadcast 10.0.0.0 dev eth2  proto kernel  scope link  src 10.1.1.1 
local 172.16.130.1 dev tun0  proto kernel  scope host  src 172.16.130.1 
local 192.168.1.240 dev eth2  proto kernel  scope host  src 192.168.1.241 
local 192.168.1.241 dev eth2  proto kernel  scope host  src 192.168.1.241 
broadcast 192.168.1.255 dev eth2  proto kernel  scope link  src 192.168.1.241 
broadcast 10.255.255.255 dev eth2  proto kernel  scope link  src 10.1.1.1 
broadcast 192.168.200.0 dev eth0  proto kernel  scope link  src 192.168.200.10 
broadcast 11.22.33.255 dev eth1  proto kernel  scope link  src 11.22.33.205 
local 10.1.1.1 dev eth2  proto kernel  scope host  src 10.1.1.1 
broadcast 127.0.0.0 dev lo  proto kernel  scope link  src 127.0.0.1 
local 11.22.33.205 dev eth1  proto kernel  scope host  src 11.22.33.205 
local 127.0.0.1 dev lo  proto kernel  scope host  src 127.0.0.1 
local 127.0.0.0/8 dev lo  proto kernel  scope host  src 127.0.0.1
# route -n
Таблица маршутизации ядра протокола IP
Destination Gateway Genmask Flags Metric Ref Use Iface
55.66.77.20  11.22.33.205  255.255.255.255 UGH   0      0        0 eth1
172.16.130.2    0.0.0.0         255.255.255.255 UH    0      0        0 tun0
172.16.130.0    172.16.130.2    255.255.255.0   UG    0      0        0 tun0
11.22.33.0    0.0.0.0         255.255.255.0   U     0      0        0 eth1
192.168.3.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth2
192.168.200.0   0.0.0.0         255.255.255.0   U     0      0        0 eth0
10.0.0.0        0.0.0.0         255.0.0.0       U     0      0        0 eth2
0.0.0.0         11.22.33.205  0.0.0.0         UG    0      0        0 eth1

Есть IPSec, настроен между нашим 11.22.33.205 и удалённым 55.66.77.20 шлюзами. В сети на нескольких компах стоят тестовые веб-сервера, на шлюзе стоит nginx, который проксирует запросы извне в сеть. Плюс ко всему, в iptables существует прямой проброс портов для доступа на компы внутри сети. На данный момент всё работает, как требуется.

В сети есть и другой шлюз - 192.168.1.250. Хочу сделать таким образом, чтобы интернет шёл через него, IPSec же должен гулять по первому каналу. А также должны работать внутренние сайты извне и доступ ко внутренним компам через проброс портов. Перенастраиваю следующим образом:

В iptables таблице nat меняю последнюю строку в цепочке SECOND_ROUTE:

Chain SECOND_ROUTE (1 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            192.168.1.0/24       
SNAT       all  --  192.168.1.0/24       0.0.0.0/0           mark match !0x1 to:192.168.1.241 

После етого:

# route del default
# route add default gw 192.168.1.250
# ip route add 55.66.77.20 via 11.22.33.205
# ip rule add from 11.22.33.205 table 100
# ip route add default via 11.22.33.205 table 100

Получается следующая маршрутизация:

# ip rule
0:	from all lookup local 
32765:	from 11.22.33.205 lookup 100 
32766:	from all lookup main 
32767:	from all lookup default

# ip route show table local
local 192.168.200.10 dev eth0  proto kernel  scope host  src 192.168.200.10 
broadcast 192.168.1.0 dev eth2  proto kernel  scope link  src 192.168.1.241 
broadcast 127.255.255.255 dev lo  proto kernel  scope link  src 127.0.0.1 
broadcast 192.168.200.255 dev eth0  proto kernel  scope link  src 192.168.200.10 
broadcast 11.22.33.0 dev eth1  proto kernel  scope link  src 11.22.33.205 
broadcast 10.0.0.0 dev eth2  proto kernel  scope link  src 10.1.1.1 
local 172.16.130.1 dev tun0  proto kernel  scope host  src 172.16.130.1 
local 192.168.1.240 dev eth2  proto kernel  scope host  src 192.168.1.241 
local 192.168.1.241 dev eth2  proto kernel  scope host  src 192.168.1.241 
broadcast 192.168.1.255 dev eth2  proto kernel  scope link  src 192.168.1.241 
broadcast 10.255.255.255 dev eth2  proto kernel  scope link  src 10.1.1.1 
broadcast 192.168.200.0 dev eth0  proto kernel  scope link  src 192.168.200.10 
broadcast 11.22.33.255 dev eth1  proto kernel  scope link  src 11.22.33.205 
local 10.1.1.1 dev eth2  proto kernel  scope host  src 10.1.1.1 
broadcast 127.0.0.0 dev lo  proto kernel  scope link  src 127.0.0.1 
local 11.22.33.205 dev eth1  proto kernel  scope host  src 11.22.33.205 
local 127.0.0.1 dev lo  proto kernel  scope host  src 127.0.0.1 
local 127.0.0.0/8 dev lo  proto kernel  scope host  src 127.0.0.1
# ip route show table main
55.66.77.20 via 11.22.33.205 dev eth1 
172.16.130.2 dev tun0  proto kernel  scope link  src 172.16.130.1 
172.16.130.0/24 via 172.16.130.2 dev tun0 
11.22.33.0/24 dev eth1  proto kernel  scope link  src 11.22.33.205 
192.168.3.0/24 dev eth1  scope link  src 192.168.1.241 
192.168.1.0/24 dev eth2  proto kernel  scope link  src 192.168.1.241 
192.168.200.0/24 dev eth0  proto kernel  scope link  src 192.168.200.10 
10.0.0.0/8 dev eth2  proto kernel  scope link  src 10.1.1.1 
default via 192.168.1.250 dev eth2
# ip route show table 100
default via 11.22.33.205 dev eth1

Теперь проблемы:

- перестаёт пинговатся 11.22.33.205 с компов из сети. Извне внутренние сайты остаются доступными - nginx отрабатывает нормально.

- не работает проброс портов извне. Последнее действие, которое iptables совершает с пакетом - DNAT, дальше я пакета не вижу нигде.

Как побороть ети проблемы?

С первой разобрался добавлением маршрута:

# ip route add 192.168.1.0/24 via 192.168.1.241 table 100

А вот со вторым пока что неудача.. Есть идеи?

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

Поправил маршруты:

# ip route add 192.168.1.0/24 via 192.168.1.241 scr 192.168.1.241 table 100

И удалил цепочку iptables nat SECOND_ROUTE. Всё работает по-прежнему, всё так же проброс портов не работает.

Как хотя бы правильно сделать ip route get для пакета, у которого после DNAT будут dst=192.168.1.111 src=88.88.88.88?

# ip route get to 192.168.1.111 from 88.88.88.88
RTNETLINK answers: Invalid argument
# ip route get 88.88.88.88 to 192.168.1.111
192.168.1.111 dev eth2  src 192.168.1.241 
    cache  mtu 1500 advmss 1460 hoplimit 64

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

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

Всё оказалось не там, де я искал.

Всего-навсего: http://lartc.org/howto/lartc.kernel.html Суть в том, что если на мой шлюз приходит пакет из вне на адрес 11.22.33.205, а ответ на него будет уходить заведомо через 192.168.1.250, то первый пакет отфильтровывается. Установив значение rp_filter в 2 (в некоторых источниках 0, но я не пробовал), я отключаю такую «фичу» и будущая цепочка пакетов не проверяется. Дальше проще:

# iptables -tmangle -I PREROUTING -d 11.22.33.205 -m state --state NEW -j CONNMARK --set-mark 0xa/0xffffffff
# iptables -tmangle -I PREROUTING -s 11.22.33.205 -j CONNMARK --restore-mark 
# iptables -tmangle -I PREROUTING -s 192.168.1.0/24 -j CONNMARK --restore-mark 

# ip rule add fwmark 0xa table 99
# ip route add default via 11.22.33.205 table 99

И всё. Надо заметить, что параметр -I вставляет запись в начало таблицы, потому порядок трёх вышеописанных правил будет обратным

Я пока что не знаю, что будет, если поменять rp_filter обратно на 1, поскольку при такой настройке мои ответные пакеты заведомо будут уходить через тот же интерфейс, куда и пришли. Как-нть позже проверю. Основная проблема решена!

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