URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 93916
[ Назад ]

Исходное сообщение
"fwmark для локалхоста через недефолтный рут."

Отправлено rusya_rr , 16-Окт-12 17:39 
В однатысячапятьсяотдвацотседьмой раз про 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

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

ЧЯДНТ?

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


Содержание

Сообщения в этом обсуждении
"fwmark для локалхоста через недефолтный рут."
Отправлено PavelR , 16-Окт-12 17:46 
>Почта упрямо ломится через ppp3

Поясните, как вы определяете, куда идет почта?

Рекомендую открыть несколько (2) консолек, и в них запустить

tcpdump -ni ppp1 port 25
tcpdump -ni ppp3 port 25


"fwmark для локалхоста через недефолтный рут."
Отправлено rusya_rr , 16-Окт-12 18:06 
>>Почта упрямо ломится через ppp3
> Поясните, как вы определяете, куда идет почта?

Специально привел, чтоб портянки tcpdump не постить
netstat -nt |grep 25
tcp        0      0 10.17.19.207:60043      94.100.177.1:25         ESTABLISHED


> Рекомендую открыть несколько (2) консолек, и в них запустить
> tcpdump -ni ppp1 port 25
> tcpdump -ni ppp3 port 25

Ну конечно же смотрел, по ppp1 - молчание, все идет по ppp3.


"fwmark для локалхоста через недефолтный рут."
Отправлено PavelR , 16-Окт-12 17:51 
> #NAT OUR LAN
> #gsm
> $IPT -t nat -A POSTROUTING -m mark --mark 11 --out-interface $outif1 -j
> MASQUERADE

Маркер тут проверять вредно. Решение, маршрутизировать или нет в данный интерфейс, уже было принято на более другом уровне. Теперь надо уже выпускать пакет, а следовательно безусловно натить. Маркер - признак выбора маршрута, а вы делаете из него признак "натить или нет", закапывая себе грабли.


"fwmark для локалхоста через недефолтный рут."
Отправлено rusya_rr , 16-Окт-12 18:08 
>> #NAT OUR LAN
>> #gsm
>> $IPT -t nat -A POSTROUTING -m mark --mark 11 --out-interface $outif1 -j
>> MASQUERADE
> Маркер тут проверять вредно. Решение, маршрутизировать или нет в данный интерфейс, уже
> было принято на более другом уровне. Теперь надо уже выпускать пакет,
> а следовательно безусловно натить. Маркер - признак выбора маршрута, а вы
> делаете из него признак "натить или нет", закапывая себе грабли.

Неа, здесь просто подменяется адрес src ip на нужный для маркированных пакетов.



"fwmark для локалхоста через недефолтный рут."
Отправлено rusya_rr , 16-Окт-12 18:26 
Решение, маршрутизировать или нет в данный интерфейс, уже
> было принято на более другом уровне.

Угу, только не маршрутизирует. Метка есть, правило есть, дефолтный гейт в таблице, на кот указывает правило - есть. И - не работает.

Кстати, если убрать маршрут по умолчанию из 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, куда следовало бы по-правилу направить почту по метке.


"fwmark для локалхоста через недефолтный рут."
Отправлено PavelR , 16-Окт-12 19:24 
простое решение - при установлении исходящего соединения используйте опцию bind


telnet -b 1.2.3.4 ....


"fwmark для локалхоста через недефолтный рут."
Отправлено rusya_rr , 16-Окт-12 18:12 
Да, и

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


"fwmark для локалхоста через недефолтный рут."
Отправлено rusya_rr , 19-Окт-12 09:32 
> В однатысячапятьсяотдвацотседьмой раз про LARTS, iproutev2, nexthop и fwmark.
> ЧЯДНТ?

Короче, вдумчиво покурив вот [url=http://forum.ixbt.com/post.cgi?id=print:76:9522]это[/url], вернувшись к [url=http://www.opennet.me/docs/RUS/iptables/#TRAVERSINGOFTABLES&...истокам[/url]истокам, вспоминаем, что решение о маршрутизации пакетов, рожденных локалхостом, принимается ДО всяких там марков и прочего. Через откуда уходить, решается приложением, опцией его байндинга. если таковой нет - через шлюз по умолчанию. Моя же задача решается вот [url=http://www.linux.org.ru/forum/admin/4517322]так[/url].
Большое спасибо всем за участие.