Tomsk Sysadmins Forum
Unix => Администрирование => Topic started by: vukor on October 28, 2009, 18:07:39
-
приветствую.
На сервере работает squid. Активны 2 интерфейса:
eth0 - статический линк к провайдеру
ppp0 - впн-подключние с дешёвой внешкой
Возникла задача пускать squid (т.е. весь трафик юзеров, сидящих через прокси) через впн, для остальных маршрут по умолчанию через eth0.
Решил промаркировать пакеты, исходящие от squid, и применять к ним маршрут через ppp0 средствами iproute2
Вот как это выглядит:
правило маркировки
[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
лог
[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: '
вывод лога
[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
маршруты
[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
[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
[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-соединения
-
Может проще как нибудь так
в /etc/squid/squid.conf :
tcp_outgoing_address ppp0-ip
и source routing?
-
Вот вам готовый 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
-
Спасибо за ответы. Проверю оба варианта. Отпишусь позже о результатах.
-
Может проще как нибудь так
в /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:
acl lan src 192.168.51.0/255.255.255.0
tcp_outgoing_address 192.168.52.58 lan
[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
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, иначе корреспонденция с не томских сетей не долетит.
тему закрываю.
-
p.p.s. .05, благодарю за пример, воспользуюсь в будущем, если понадобится. В данном случае не подошел, т.к. на сервере крутится также почта и поэтому требовалось оставить дефолтовый маршрут через eth0, иначе корреспонденция с не томских сетей не долетит.
как раз таки долетит
-
А не проще маркировать пакеты по uid squid'a? Ну и пара таблиц, в одной дефолтом ppp. Пользуюсь довольно давно.
IPTABLES -A OUTPUT -t mangle -m owner --uid-owner proxy -j MARK --set-mark 1