В однатысячапятьсяотдвацотседьмой раз про 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
,то
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
ЧЯДНТ?
Пусть вас не смущает почтовик. Пусть это будет любое приложение, которое стучится на определенный порт. Видимость снаружи этого приложения не нужна. Нужно трафик с локалхоста определенного вида выпустить через определенный интерфейс.