Tomsk Sysadmins Forum

Unix => Администрирование => Topic started by: vukor on October 28, 2009, 18:07:39

Title: трудности с маркировкой сетевых пакетов
Post by: vukor on October 28, 2009, 18:07:39
приветствую.

На сервере работает squid. Активны 2 интерфейса:
Quote
eth0 - статический линк к провайдеру
ppp0 - впн-подключние с дешёвой внешкой

Возникла задача пускать squid (т.е. весь трафик юзеров, сидящих через прокси) через впн, для остальных маршрут по умолчанию через eth0.
Решил промаркировать пакеты, исходящие от squid, и применять к ним маршрут через ppp0 средствами iproute2

Вот как это выглядит:

правило маркировки

Quote
[root@polygon ppp]# iptables -t mangle --list
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

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
MARK       tcp  --  anywhere             anywhere            tcp spt:squid MARK set 0x1

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

лог

Quote
[root@polygon ppp]# iptables -t filter --list
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
LOG        tcp  --  anywhere             anywhere            MARK match 0x1 LOG level debug prefix `fwmark 1: '

вывод лога

Quote
[root@polygon ppp]# cat /var/log/iptables
Oct 28 17:58:46 polygon kernel: fwmark 1: IN= OUT=eth0 SRC=192.168.51.74 DST=192.168.51.50 LEN=48 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=3128 DPT=1273 WINDOW=5840 RES=0x00 ACK SYN URGP=0
Oct 28 17:58:46 polygon kernel: fwmark 1: IN= OUT=eth0 SRC=192.168.51.74 DST=192.168.51.50 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=2952 DF PROTO=TCP SPT=3128 DPT=1273 WINDOW=6432 RES=0x00 ACK URGP=0
Oct 28 17:58:48 polygon kernel: fwmark 1: IN= OUT=eth0 SRC=192.168.51.74 DST=192.168.51.50 LEN=1500 TOS=0x00 PREC=0x00 TTL=64 ID=2953 DF PROTO=TCP SPT=3128 DPT=1273 WINDOW=6432 RES=0x00 ACK URGP=0
Oct 28 17:58:48 polygon kernel: fwmark 1: IN= OUT=eth0 SRC=192.168.51.74 DST=192.168.51.50 LEN=51 TOS=0x00 PREC=0x00 TTL=64 ID=2954 DF PROTO=TCP SPT=3128 DPT=1273 WINDOW=6432 RES=0x00 ACK PSH URGP=0
Oct 28 17:58:48 polygon kernel: fwmark 1: IN= OUT=eth0 SRC=192.168.51.74 DST=192.168.51.50 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=2955 DF PROTO=TCP SPT=3128 DPT=1273 WINDOW=6432 RES=0x00 ACK FIN URGP=0
Oct 28 17:58:51 polygon kernel: fwmark 1: IN= OUT=eth0 SRC=192.168.51.74 DST=192.168.51.50 LEN=1500 TOS=0x00 PREC=0x00 TTL=64 ID=2956 DF PROTO=TCP SPT=3128 DPT=1273 WINDOW=6432 RES=0x00 ACK URGP=0
Oct 28 17:58:51 polygon kernel: fwmark 1: IN= OUT=eth0 SRC=192.168.51.74 DST=192.168.51.50 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=3128 DPT=1273 WINDOW=6432 RES=0x00 ACK URGP=0


маршруты

Quote
[root@polygon ppp]# ip r l
77.106.109.139 via 192.168.51.254 dev eth0
77.106.109.142 via 192.168.51.254 dev eth0
192.168.52.254 via 192.168.51.254 dev eth0
192.168.51.0/24 dev eth0  proto kernel  scope link  src 192.168.51.74
169.254.0.0/16 dev eth0  scope link
default via 192.168.51.254 dev eth0

Quote
[root@polygon ppp]# ip rule ls
0:      from all lookup 255
32765:  from all fwmark 0x1 lookup vneshka
32766:  from all lookup main
32767:  from all lookup default

Quote
[root@polygon ppp]# ip r l t vneshka
default via 192.168.52.58 dev ppp0

через прокси захожу на http://ip.xss.ru/ (http://ip.xss.ru/) вижу что хожу через интерфейс eth0

p.s. возможно маршрут получается не симметричным (исходящие пакеты валятся через ppp0, входящие - через eth0), а может мне нужно учить мат. часть tcp/ip-соединения
Title: трудности с маркировкой сетевых пакетов
Post by: deepwalker on October 28, 2009, 18:42:01
Может проще как нибудь так
в /etc/squid/squid.conf :
tcp_outgoing_address ppp0-ip

и source routing?
Title: трудности с маркировкой сетевых пакетов
Post by: .05 on October 28, 2009, 20:04:58
Вот вам готовый policy routing с маркировкой, пользуйтесь  
в /etc/iproute2/rt_tables добавляем таблицы
[div class=\'codetop\']CODE[div class=\'codemain\' style=\'height:200px;white-space:pre;overflow:auto\']
1      TETH
2      TPPP

заполняем таблички по маршрутам
[div class=\'codetop\']CODE[div class=\'codemain\' style=\'height:200px;white-space:pre;overflow:auto\']
ETH_NET=сетка eth
PPP_NET=сетка РРР, обычно кончается на /32
ETHIF='eth1'
PPPIF='ppp0'
GWETH= шлюз основного прова
GWPPP=шлюз ppp
IPETH= ип на наземном ифэйсе
IPPPP=  ип на ифэйсе впн

ip route flush table TETH
ip route flush table TPPP
ip route add $ETH_NET dev $ETHIF src $IPETH table TETH
ip route add default via $GWETH dev $ETHIF table TETH
ip route add $PPP_NET dev $PPPIF src $IPPPP table TPPP
ip route add default via $GWPPP dev $PPPIF table TPPP

ip route add $ETH_NET dev $ETHIF src $IPETH
ip route add $PPP_NET dev $PPPIF src $IPPPP
ip route add default dev $ETHIF
ip route add default dev $PPPIF

ip rule delete table TETH
ip rule delete table TPPP
ip rule delete table TETH
ip rule delete table TPPP

ip rule add from $IPETH table TETH
ip rule add from $IPPPP table TPPP
ip rule add fwmark 1 table TETH
ip rule add fwmark 2 table TPPP
ip route flush cache

что в иптаблес
[div class=\'codetop\']CODE[div class=\'codemain\' style=\'height:200px;white-space:pre;overflow:auto\']
IPTABLES= где иптаблес
TOMSK_NETS= файлик с томскими сетками
PPPIF2='ppp0'
INTIF='eth0'
LOCAL_NET='192.168.0.0/24'

$IPTABLES -t mangle -A PREROUTING -s $LOCAL_NET -d ! $LOCAL_NET -j MARK --set-mark 2
$IPTABLES -t nat -A POSTROUTING  -o $PPPIF2  -m mark --mark 2  -j MASQUERADE

for a in `cat $TOMSK_NETS`; do
    $IPTABLES -t mangle -A PREROUTING -s $LOCAL_NET -d  $a -j MARK --set-mark 1
    $IPTABLES -t nat -A POSTROUTING  -o $EXTIF  -m mark --mark 1  -j MASQUERADE
done
Title: трудности с маркировкой сетевых пакетов
Post by: vukor on October 29, 2009, 10:13:49
Спасибо за ответы. Проверю оба варианта. Отпишусь позже о результатах.
Title: трудности с маркировкой сетевых пакетов
Post by: vukor on October 29, 2009, 14:43:54
Quote from: deepwalker
Может проще как нибудь так
в /etc/squid/squid.conf :
tcp_outgoing_address ppp0-ip

и source routing?

воспользовался данным советом.
имеем:
eth0 192.168.51.74
ppp0 192.168.52.58
default gw 192.168.51.254

отрывок из /etc/squid/squid.conf:
Quote
acl lan src 192.168.51.0/255.255.255.0
tcp_outgoing_address 192.168.52.58 lan

Quote
[root@polygon ~]# cat /etc/iproute2/rt_tables
#
# reserved values
#
255     local
254     main
253     default
0       unspec
#
# local
#
#1      inr.ruhep
200     PROV
100     vneshka

Quote
ip route add default via 192.168.51.254 table PROV
ip route add default dev ppp0 table vneshka
ip rule add from 192.168.51.74/32 table PROV
ip rule add from 192.168.52.58/32 table vneshka
ip ro flush cache

p.s. теперь squid ходит через интерфейс ppp0, осталось настроить для сквида маршруты в томские сети через eth0. Думаю сделать это через acl и tcp_outgoing_address...

deepwalker, еще раз спасибо.

p.p.s. .05, благодарю за пример, воспользуюсь в будущем, если понадобится. В данном случае не подошел, т.к. на сервере крутится также почта и поэтому требовалось оставить дефолтовый маршрут через eth0, иначе корреспонденция с не томских сетей не долетит.

тему закрываю.
Title: трудности с маркировкой сетевых пакетов
Post by: .05 on October 29, 2009, 20:06:29
Quote from: bugor
p.p.s. .05, благодарю за пример, воспользуюсь в будущем, если понадобится. В данном случае не подошел, т.к. на сервере крутится также почта и поэтому требовалось оставить дефолтовый маршрут через eth0, иначе корреспонденция с не томских сетей не долетит.
как раз таки долетит
Title: трудности с маркировкой сетевых пакетов
Post by: bav on October 30, 2009, 08:27:53
А не проще маркировать пакеты по uid squid'a? Ну и пара таблиц, в одной дефолтом ppp. Пользуюсь довольно давно.

IPTABLES -A OUTPUT -t mangle -m owner --uid-owner proxy -j MARK --set-mark 1