[Sysadmins] два шлюза и проброс во внутреннюю сеть

Igor Solovyov =?iso-8859-1?q?gosha_=CE=C1_anti=2Esu?=
Вс Ноя 11 20:21:34 MSK 2007


Hi!
On Fri, 2 Nov 2007 15:54:18 +0300
"Peter V. Saveliev" <peet на altlinux.ru> wrote:

> Давайте посмотрим, как вообще можно управлять классами маршрутизации
> в Linux....

В общем докладываю. 
На всякий случай напомню, схема такова: маршрутизатор, два канала,
оба с приватными адресами на моей стороне, но один из них nat-ится
циской, которая имеет реальный ip:

канал 2 - сюда нужно выпустить web-трафик
adsl-модем
(192.168.1.1)
|
192.168.1.2
маршрутизатор
(прокси, почта)
192.168.151.22
|
|<- локалка 192.168.151.0/24
|
(192.168.151.254)
cisco
канал 1 - сюда нужно выпустить почту

интрефейсы:
# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:80:48:22:BA:94  
          inet addr:192.168.151.22  Bcast:192.168.151.255
.....
eth1      Link encap:Ethernet  HWaddr 00:80:48:4F:A1:E3  
          inet addr:192.168.1.2  Bcast:192.168.151.255
....
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
....

Слушающие сервисы:

192.168.151.22:25   0.0.0.0:*  LISTEN 4838/master
192.168.151.22:110  0.0.0.0:*  LISTEN 4761/cyrmaster
192.168.151.22:143  0.0.0.0:*  LISTEN 4761/cyrmaster
192.168.151.22:8080 0.0.0.0:*  LISTEN 4987/(squid)
192.168.151.22:53   0.0.0.0:*  LISTEN 4710/named
127.0.0.1:53        0.0.0.0:*  LISTEN 4710/named
127.0.0.1:953       0.0.0.0:*  LISTEN 4710/named

т.е. почта и прокси слушают только на eth0, глядящий в локалку
и на циску с реальным айпишником снаружи (канал 1).

маршрут по умолчанию установлен на канал 2:
# route -n

Kernel IP routing table
Destination     Gateway         Genmask     Flags Metric Ref Use
Iface 
192.168.151.0   0.0.0.0      255.255.255.0   U     0     0   0 eth0
192.168.1.0     0.0.0.0      255.255.255.0   U     0     0   0 eth1
0.0.0.0         192.168.1.1     0.0.0.0      UG    100   0   0 eth1


Теперь iproute:

# cat /etc/iproute2/rt_tables
255     local
254     main
253     default
0       unspec
150     adsltab # таблица для канала 2
151     dtab    # таблица для канала 1

# ip ru l

0:      from all lookup local 
150:    from all iif eth1 lookup adsltab 
151:    from all iif eth0 lookup dtab 
200:    from all fwmark 0x19 lookup dtab 
201:    from all fwmark 0x6e lookup dtab 
202:    from all fwmark 0x8f lookup dtab 
204:    from all fwmark 0xe4 lookup adsltab 
32766:  from all lookup main 
32767:  from all lookup default 

# ip ro l t adsltab
default via 192.168.1.1 dev eth1 

# ip ro l t dtab
default via 192.168.151.254 dev eth0 

так выглядит маркировка пакетов:

# iptables -t mangle -nL

Chain PREROUTING (policy ACCEPT)
target     prot opt source     destination         

Chain INPUT (policy ACCEPT)
target     prot opt source     destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source     destination         
MARK       tcp  --  0.0.0.0/0  0.0.0.0/0  tcp dpt:25   MARK set 0x19
MARK       tcp  --  0.0.0.0/0  0.0.0.0/0  tcp dpt:110  MARK set 0x6e
MARK       tcp  --  0.0.0.0/0  0.0.0.0/0  tcp dpt:143  MARK set 0x8f
MARK       tcp  --  0.0.0.0/0  0.0.0.0/0  tcp dpt:8080 MARK set 0xe4 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination 


В результате всего этого squid исправно выгоняет трафик в канал 2(eth1)
как и задумывалось, а вот postfix тоже упорно пытается выйти наружу
через этот же канал 2 вместо канала 1, что наблюдается tcpdump-ом. :-(

В общем пока получилось только наполовину. Squid выходит в нужный канал,
но он бы и так туда выходил бы, раз default gw туда прописан. :-(

Где же грабли порылись? Уже второй день эротикой занимаюсь...

-- 
Best Regars!
Igor Solovyov



Подробная информация о списке рассылки Sysadmins