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

fwmark для локалхоста через недефолтный рут

 , , ,


0

1

В однатысячапятьсяотдвацотседьмой раз про LARTS, iproutev2, nexthop и fwmark.

Есть два канала в интернет - ppp1 и ppp3. Адреса динамические. Eth0 - интерфейс для LAN (192.168.0.0/23)

На этой машине работает почтовик. Задача - пустить почтовик наружу только через ppp1. ppp1 - недефолтный. Все остальное пустить через дефолтный ppp3.

cat /etc/iproute2/rt_tables
#
# reserved values
#
255    local
254    main
253    default
0    unspec
#
# local
#
#1    inr.ruhep
11   beeline30
13   mts
ip route ls
10.64.64.67 dev ppp3  proto kernel  scope link  src 10.17.19.207
10.64.64.65 dev ppp1  proto kernel  scope link  src 10.215.43.32
192.168.0.0/23 dev eth1  proto kernel  scope link  src 192.168.0.88
ip route ls table beeline30
192.168.0.0/23 dev eth1  scope link
127.0.0.0/8 dev lo  scope link
default via 10.64.64.65 dev ppp1
ip route ls table mts
192.168.0.0/23 dev eth1  scope link
127.0.0.0/8 dev lo  scope link
default via 10.64.64.67 dev ppp3
ip rule ls
0:    from all lookup local
32762:    from all fwmark 0xd lookup mts
32763:    from 10.17.19.207 lookup mts
32764:    from all fwmark 0xb lookup beeline30
32765:    from 10.215.43.32 lookup beeline30
32766:    from all lookup main
32767:    from all lookup default
cat /etc/setfirewall
#!/bin/bash

/etc/firewall/clearfirewall
echo "1" > /proc/sys/net/ipv4/ip_forward
IPT=/sbin/iptables

#LO
LO_IF=lo
LO_IP="127.0.0.1"
#LAN
LAN_IF=eth1
LAN_IP="192.168.0.88"
TN1="192.168.0.0/24"
#beeline gsm
outif1=ppp1
#mts gsm
outif3=ppp3

#Default Policy
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT

# Permit related connections
$IPT -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

#Permit localhost everywhere
$IPT -A INPUT -s $LO_IP -j ACCEPT
$IPT -A FORWARD -s $LO_IP -j ACCEPT
$IPT -A INPUT -s $LAN_IP -j ACCEPT
$IPT -A FORWARD -s $LAN_IP -j ACCEPT

#На почту smtp tcp 25 ставим метку 11
$IPT -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark 11

#NAT OUR LAN
#gsm
$IPT -t nat -A POSTROUTING -m mark --mark 11 --out-interface $outif1 -j MASQUERADE
$IPT -t nat -A POSTROUTING -s $TN1 --out-interface $outif3 -j MASQUERADE

Почта упрямо ломится через ppp3

telnet smtp.mail.ru 25
Trying 94.100.177.1...
Connected to smtp.mail.ru.
Escape character is '^]'.
220 smtp27.mail.ru ESMTP ready
quit
221 2.0.0 Bye
Connection closed by foreign host.
netstat -nt |grep 25
tcp        0      0 10.17.19.207:60043      94.100.177.1:25         ESTABLISHED

iptables говорит,

iptables -L -vn -t mangle
Chain PREROUTING (policy ACCEPT 564 packets, 51992 bytes)
pkts bytes target     prot opt in     out     source               destination        

Chain INPUT (policy ACCEPT 564 packets, 51992 bytes)
pkts bytes target     prot opt in     out     source               destination        

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination        

Chain OUTPUT (policy ACCEPT 364 packets, 42506 bytes)
pkts bytes target     prot opt in     out     source               destination        
    7   386 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:25 MARK set 0xb

Chain POSTROUTING (policy ACCEPT 364 packets, 42506 bytes)
pkts bytes target     prot opt in     out     source               destination

что он-таки исправно маркирует пакеты.

Кстати, если убрать маршрут по умолчанию из main

ip route del default

,то

telnet smtp.mail.ru 25
Trying 2a00:1148:1:1322::a1...
Trying 94.100.177.1...
telnet: Unable to connect to remote host: Network is unreachable

если нет шлюза по умолчанию, системе, как я погляжу, плевать и на метки, и на правила, и на то што default gateway есть в таблице beeline30, куда следовало бы по-правилу направить почту по метке.

Да, и

cat /proc/sys/net/ipv4/conf/all/rp_filter
0

ЧЯДНТ?

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

Ответ на: комментарий от rusya_rr

netstat -nt |grep 25 tcp 0 0 10.17.19.207:60043 94.100.177.1:25 ESTABLISHED

Это тебе не нравится? :) Но!

$IPT -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark 11

32764: from all fwmark 0xb lookup beeline30

ip route ls table beeline30 192.168.0.0/23 dev eth1 scope link 127.0.0.0/8 dev lo scope link default via 10.64.64.65 dev ppp1

10.64.64.65 dev ppp1 proto kernel scope link src 10.215.43.32

dev ppp1 !!!

и как ты хочешь чтобы через ppp3 то шло???

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

и как ты хочешь чтобы через ppp3 то шло???

Да прочитай ты исходное сообщение. Я хочу почту направить через ppp1. ppp1! Он - недефолтный. Выдохни. :)

rusya_rr ()
Ответ на: комментарий от shell-script

Маркировать надо в PREROUTING'е.

Махнул OUTPUT на PREROUTING. То же самое.

Корень зла не здесь. А вот где:

Кстати, если убрать маршрут по умолчанию из main

ip route del default

,то

telnet smtp.mail.ru 25

Trying 2a00:1148:1:1322::a1... Trying 94.100.177.1... telnet: Unable to connect to remote host: Network is unreachable

если нет шлюза по умолчанию, системе, как я погляжу, плевать и на метки, и на правила, и на то што default gateway есть в таблице beeline30, куда следовало бы по-правилу направить почту по метке.

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

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

пардон, >почему она не игнорирует правила следует читать как «почему она игнорирует правила»

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

Сразу не заметил. А почему не прописаны маршруты для исходящих интерфейсов внутри таблиц mts и beeline?

Я имею ввиду вот эти:

10.64.64.67 dev ppp3  proto kernel  scope link  src 10.17.19.207
10.64.64.65 dev ppp1  proto kernel  scope link  src 10.215.43.32

shell-script ★★★★★ ()
Ответ на: комментарий от shell-script

10.64.64.67 dev ppp3 proto kernel scope link src 10.17.19.207

10.64.64.65 dev ppp1 proto kernel scope link src 10.215.43.32

Добавил, хотя, в общем-то, это и не нужно. Без изменений.

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

Странно. Сейчас у себя проверил, всё пашет. Или я что-то упустил?

┌┤~├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤root@frontier├─ 
└─> ip r l
109.124.32.0/22 dev eth1  proto kernel  scope link  src 109.124.35.175                                                                                                                                     
10.0.0.0/22 dev eth0  proto kernel  scope link  src 10.0.0.11                                                                                                                                              
default via 109.124.32.1 dev eth1                                                                                                                                                                          
┌┤~├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤root@frontier├─ 
└─> ip r l t lor                                                                                                                                                                    
109.124.32.0/22 dev eth1  proto kernel  scope link  src 109.124.35.175                                                                                                                                     
10.0.0.0/22 dev eth0  proto kernel  scope link  src 10.0.0.11                                                                                                                                              
default via 10.0.0.10 dev eth0                                                                                                                                                                             
┌┤~├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤root@frontier├─
└─> iptables -t mangle -nvL
Chain PREROUTING (policy ACCEPT 306K packets, 291M bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain INPUT (policy ACCEPT 10886 packets, 1369K bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 286K packets, 288M bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 1132 packets, 251K bytes)
 pkts bytes target     prot opt in     out     source               destination         
   17   952 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:25 MARK set 0x10 

Chain POSTROUTING (policy ACCEPT 287K packets, 289M bytes)
 pkts bytes target     prot opt in     out     source               destination         
┌┤~├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤root@frontier├─
└─> telnet smtp.mail.ru 25
Trying 94.100.177.1...
^C

Это на сервере. При попытке телнета tcpdump на машине с ip 10.0.0.10 видит, что попытка подключения идёт:
┌┤~├────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤root@damned├─
└─> tcpdump -ntpi eth0 tcp port 25
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
IP 109.124.35.175.46662 > 94.100.177.1.25: Flags [S], seq 123784583, win 5840, options [mss 1460,sackOK,TS val 220646209 ecr 0,nop,wscale 4], length 0
IP 109.124.35.175.46662 > 94.100.177.1.25: Flags [S], seq 123784583, win 5840, options [mss 1460,sackOK,TS val 220646959 ecr 0,nop,wscale 4], length 0
Т.е. всё нормально. Убираем заворачивающее правило и всё ходит.
┌┤~├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤root@frontier├─
└─> ip rule del fwmark 0x10
┌┤~├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤root@frontier├─
└─> telnet smtp.mail.ru 25
Trying 94.100.177.1...
Connected to smtp.mail.ru.
Escape character is '^]'.
220 smtp21.mail.ru ESMTP ready
quit
221 2.0.0 Bye
Connection closed by foreign host.

shell-script ★★★★★ ()

Поставьте оба «ip rule fwmark» перед «ip rule from». Не забудьте сбросить кеш маршрутов. Маскарад сделайте для всех пакетов через ppp-интерфейсы, а не только для промаркированных. Как ходят пакеты смотрите с помощью tcpdump'а, а не с помощью netstat.

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

Поставьте оба «ip rule fwmark» перед «ip rule from».

Итак стоят.

Не забудьте сбросить кеш маршрутов.

Не забыл.

Маскарад сделайте для всех пакетов через ppp-интерфейсы, а не только для промаркированных.

Ну пляски же. По-всякому плясал. И так, естественно, тоже.

Как ходят пакеты смотрите с помощью tcpdump'а, а не с помощью netstat.

Ну естественно. Выше писал, что нетстат привел, чтоб не постить портянки tcpdump

rusya_rr ()
Ответ на: комментарий от shell-script

Или я что-то упустил?

Да, у тебя все пришло через дефолтный гейт

ip r l

109.124.32.0/22 dev eth1 proto kernel scope link src 109.124.35.175 10.0.0.0/22 dev eth0 proto kernel scope link src 10.0.0.11 default via 109.124.32.1 dev

tcpdump -ntpi eth0 tcp port 25

IP 109.124.35.175.46662 > 94.100.177.1.25: Flags , seq 123784583, win 5840, options

Опусти его, и увидишь фигушки.

rusya_rr ()

Короче, вдумчиво покурив вот это, вернувшись к истокам, вспоминаем, что решение о маршрутизации пакетов, рожденных локалхостом, принимается ДО всяких там марков и прочего. Через откуда уходить, решается приложением, опцией его байндинга. если таковой нет - через шлюз по умолчанию. Моя же задача решается вот так Большое спасибо всем за участие.

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

вспоминаем, что решение о маршрутизации пакетов, рожденных локалхостом, принимается ДО всяких там марков и прочего.

Оставьте свои заблуждения себе и не вводит в заблуждение других. У меня работала балансировка канала — связь между двумя серверами с помощь двух тунелей через разных провайдеров на основании маркировки в iptables (-m statistic в 2.6 и -m nth в 2.4) и «ip rule fwmark». Пакеты одного соединения шли по разным тунелям.

Через откуда уходить, решается приложением

Через откуда уходить решается таблицей маршрутизации и «ip rule». Опция «байдинга» определяет src-ip адрес пакета (сокета). Если явного «байдинга» нет, данный адрес будет выбран ядром на основании основной таблицы маршрутизации и основного ip-адреса интерфейса, если в маршруте не указана опция «src». И при выборе этого адреса ядру плевать, как маркируется пакет в iptables.

чтоб не постить портянки tcpdump

Чтобы не получать портянки от tcpdump, нужно его запускать сразу для перехвата только нужных пакетов, допустим:

tcpdump -i ppp3 -n -nn tcp and dst host 94.100.177.1 and dst port 25

Ну пляски же.

Маскарад всех уходящих через интерфейс пакетов это не пляска, а культура поведения. Зачем допускать прохождение пакета с левым ip-адресом?

Итак стоят.

Не знаю, как у вас там сейчас стоят «ip rule», сегодня как-то плохо с телепатией. В стартовом посте у вас было, что всё, что идёт с адреса «10.17.19.207», пойдёт по таблице mts, независимо от маркировки. Ядро выбирало для smtp-соединений адрес 10.17.19.207, и от того, что вы маркировали эти пакеты маркером «11», они всё одно шли по правилу «32763», попадали в таблицу mts и уходили через ppp3.

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