Пренаправление smtp траффика на другой интерфейс.

Добрый день,я настраиваю шлюз с тремя интерфейсами. Один из которых смотрит в локальную сеть,а два других в сторону интернет. На шлюзе установлен iptables для NAT. Необходимо отправить исходящий траффик по протоколу smtp через другой интерфейс. Можно ли обойтись только средствами iptables не прибегая к созданию дополнительных таблиц маршрутизации?

eth2 192.168.2.0/24 адрес в локальной сети 192.168.2.225
eth0 192.168.1.0/24 адрес в сети 192.168.1.3 шлюз 192.168.1.1 #Первый интерфейс и его шлюз по умолчанию
eth3 93.168.230.236/30 адрес в сети 93.168.230.238 шлюз 93.168.230.237 #второй интерфейс на который будет перенаправляться почта.
192.168.2.198 адрес моего компьютера

Если добавить в сценарий iptables
$IPT -t mangle -A PREROUTING -i eth2 -s 192.168.2.198 -p tcp -m tcp --dport 25 -j MARK --set-mark 11
$IPT -A FORWARD -i eth2 -s 192.168.2.198 -o eth3 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -i eth2 -s 192.168.2.198 -o eth3 -p tcp --dport 25 -m state --state NEW -j ACCEPT
$IPT -A FORWARD -i eth3 -o eth2 -d 192.168.2.198 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -t nat -A POSTROUTING -o eth3 -j SNAT --to-source 93.168.230.238

Или вообще вот так
$IPT -A FORWARD -i eth2 -s 192.168.2.198 -o eth3 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -i eth2 -s 192.168.2.198 -o eth3 -p tcp --dport 25 -m state --state NEW -j ACCEPT
$IPT -A FORWARD -i eth3 -o eth2 -d 192.168.2.198 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -t nat -A POSTROUTING -o eth3 -j SNAT --to-source 93.168.230.238

То будет работать?
Или все же придется таблицы маршрутов настраивать и помечать пакеты фаерволлом?

Привожу файлы конфигураций.
/etc/conf.d/net

config_eth0=( "192.168.1.3/24" )
routes_eth0=( "default via 192.168.1.1" )

config_eth3=( "93.168.230.238/30" )
routes_eth3=( "93.168.230.236/30 via 93.168.230.237" )

config_eth2=( "192.168.2.225/24" )

NAT_Firewall

IPT="/sbin/iptables"
IF_LPB="lo"
IP_LPB="127.0.0.1"

IF_LAN="eth2"
IP_LAN="192.168.2.225"
LAN="192.168.2.0/24"

IF_WAN="eth0"
IP_WAN="192.168.1.3"
WAN=”192.168.1.0./24”

IF_WAN2="eth3"
IP_WAN2="93.168.230.238"
WAN2=”93.168.230.236/30”

IP_ADM="192.168.2.198"

IP_DNS1="192.168.2.3"
IP_DNS2="192.168.2.4"

CLASS_A="10.0.0.0/8"  
CLASS_B="172.16.0.0/22"  
CLASS_C="192.168.0.0/16"
CLASS_D_MULTICAST="224.0.0.0/4"   
CLASS_E_RESERVED_NET="240.0.0.0/5" 
INTBC="192.168.2.255"
EXTBC="192.168.1.255"

if [ "$1" = "start" ]
 then
	echo "Starting firewall..."

	$IPT -Z
	$IPT -F
	
	$IPT -P INPUT		DROP		
	$IPT -P OUTPUT	DROP
	$IPT -P FORWARD	DROP

	$IPT -N bad_packets
	$IPT -N icmp_in
	$IPT -N icmp_out
		
	$IPT -A INPUT		-i lo -j ACCEPT
	$IPT -A OUTPUT 	-o lo -j ACCEPT
	
	$IPT -t nat -A POSTROUTING		-o $IF_WAN	-j SNAT	--to-source $IP_WAN

	$IPT -A FORWARD -i $IF_LAN -s $LAN	-o $IF_WAN	-m state --state ESTABLISHED,RELATED		-j ACCEPT
$IPT -A FORWARD -i $IF_LAN -s $LAN	-o $IF_WAN      -p tcp -m multiport --dport 25,110,995,465,587,1688 -m state --state NEW -j ACCEPT
$IPT -A FORWARD -i $IF_LAN -s $LAN	-o $IF_WAN	-p tcp --dport 21 --sport 1024:65535	-m state --state NEW	-j ACCEPT	
	$IPT -A FORWARD -i $IF_WAN -o $IF_LAN -d $LAN		-m state --state ESTABLISHED,RELATED		-j ACCEPT

	$IPT -A FORWARD -i $IF_WAN -o $IF_LAN -d $LAN         -p tcp --sport 20 --dport 1024:65535 	-m state --state NEW -j ACCEPT

	$IPT -A INPUT	-m state --state ESTABLISHED,RELATED -j ACCEPT
	$IPT -A INPUT   -i $IF_LAN -s $LAN	-p tcp -m multiport --dport 3128,80	 -m state --state NEW -j ACCEPT 

	$IPT -A INPUT   -i $IF_LAN -s $IP_ADM   -p tcp --dport 22               -m state --state NEW -j ACCEPT

	$IPT -A INPUT   -i $IF_LAN -s $LAN      -p tcp --dport 514       -m state --state NEW -j ACCEPT
	$IPT -A INPUT   -i $IF_LAN -s $LAN      -p udp --dport 514       -m state --state NEW -j ACCEPT

	$IPT -A OUTPUT	-m state --state ESTABLISHED,RELATED 	-j ACCEPT
	$IPT -A OUTPUT  -o $IF_WAN -p tcp --dport 80	-m state --state NEW	-j ACCEPT
	$IPT -A OUTPUT  -o $IF_WAN -p tcp --dport 8080  -m state --state NEW	-j ACCEPT

	$IPT -A OUTPUT  -o $IF_WAN -p tcp --dport 443	-m state --state NEW    -j ACCEPT
	$IPT -A OUTPUT  -o $IF_WAN -p tcp --dport 21	-m state --state NEW    -j ACCEPT
	$IPT -A OUTPUT  -o $IF_WAN -p tcp --dport 873	-m state --state NEW    -j ACCEPT
	$IPT -A OUTPUT  -o $IF_WAN -p udp --dport 873	-m state --state NEW    -j ACCEPT
	
	$IPT -A OUTPUT  -o $IF_WAN -p tcp --dport 5190  -m state --state NEW    -j ACCEPT
	$IPT -A OUTPUT  -o $IF_WAN -p tcp --dport 5222  -m state --state NEW    -j ACCEPT
	$IPT -A OUTPUT  -o $IF_WAN -p tcp --dport 5223  -m state --state NEW    -j ACCEPT
	$IPT -A OUTPUT  -o $IF_LAN -p tcp -d 192.168.2.3 --dport 389 -m state --state NEW -j ACCEPT
	$IPT -A OUTPUT  -o $IF_LAN -p udp -d 192.168.2.3 --dport 389 -m state --state NEW -j ACCEPT
	$IPT -A OUTPUT  -o $IF_LAN -p tcp -d 192.168.2.4 --dport 389 -m state --state NEW -j ACCEPT
	$IPT -A OUTPUT  -o $IF_LAN -p udp -d 192.168.2.4 --dport 389 -m state --state NEW -j ACCEPT

	$IPT -A OUTPUT  -o $IF_LAN -p tcp -d 192.168.2.3  --dport 88 -m state --state NEW -j ACCEPT
	$IPT -A OUTPUT  -o $IF_LAN -p udp -d 192.168.2.3  --dport 88 -m state --state NEW -j ACCEPT
	$IPT -A OUTPUT  -o $IF_LAN -p tcp -d 192.168.2.4  --dport 88 -m state --state NEW -j ACCEPT
      	$IPT -A OUTPUT  -o $IF_LAN -p udp -d 192.168.2.4  --dport 88 -m state --state NEW -j ACCEPT

	$IPT -A OUTPUT  -o $IF_LAN -p udp -m multiport --dport 137,138,139,445	-m state --state NEW -j ACCEPT
	$IPT -A OUTPUT  -o $IF_LAN -p tcp -m multiport --dport 139,445		-m state --state NEW -j ACCEPT

	$IPT -A OUTPUT -o $IF_LAN -p udp -d $IP_DNS1 --dport 53 --sport $UNPRIVPORTS -m state --state NEW -j ACCEPT
	$IPT -A OUTPUT  -o $IF_LAN -p tcp -d $IP_DNS1 --dport 53 --sport $UNPRIVPORTS -m state --state NEW -j ACCEPT
	
	$IPT -A OUTPUT  -o $IF_LAN -p udp -d $IP_DNS2 --dport 53 --sport $UNPRIVPORTS -m state --state NEW -j ACCEPT
	$IPT -A OUTPUT  -o $IF_LAN -p tcp -d $IP_DNS2 --dport 53 --sport $UNPRIVPORTS -m state --state NEW -j ACCEPT

	$IPT -A OUTPUT  -o $IF_WAN -p udp --dport 123 -m state --state NEW -j ACCEPT
 	$IPT -A OUTPUT  -o $IF_WAN -p udp --dport 1024: -m state --state NEW -j ACCEPT

	$IPT -A icmp_in -p icmp --icmp-type destination-unreachable	-m state --state NEW -j ACCEPT
	$IPT -A icmp_in -p icmp --icmp-type 4				-m state --state NEW -j ACCEPT
	$IPT -A icmp_in -p icmp --icmp-type echo-request -m limit --limit 180/minute	-m state --state NEW -j ACCEPT
	$IPT -A icmp_in -p icmp --icmp-type time-exceeded			-m state --state NEW -j ACCEPT
	$IPT -A icmp_in -p icmp --icmp-type 12				-m state --state NEW -j ACCEPT
	
	$IPT -A icmp_out -p icmp --icmp-type destination-unreachable		-m state --state NEW	-j ACCEPT
	$IPT -A icmp_out -p icmp --icmp-type 4 								-j ACCEPT
	$IPT -A icmp_out -p icmp --icmp-type 8 -m limit --limit 180/minute 	-m state --state NEW	-j ACCEPT
	$IPT -A icmp_out -p icmp --icmp-type time-exceeded			-m state --state NEW	-j ACCEPT
	$IPT -A icmp_out -p icmp --icmp-type 12 							-j ACCEPT

	$IPT -A bad_packets -p tcp ! --syn -m state --state NEW -j ULOG --ulog-prefix "NEW not --syn"
	$IPT -A bad_packets -p tcp ! --syn -m state --state NEW -j DROP

	$IPT -A bad_packets -f -j LOG --log-prefix "Fragmented packets"
	$IPT -A bad_packets -f -j DROP
	
	$IPT -A bad_packets -s 10.0.0.0/8 -j LOG --log-prefix "illegal_souce_address"
	$IPT -A bad_packets -s 10.0.0.0/8 -j DROP
	$IPT -A bad_packets -s 172.16.0.0/12 -j LOG --log-prefix "illegal_souce_address"
	$IPT -A bad_packets -s 172.16.0.0/12 -j DROP
	$IPT -A bad_packets -s 169.254.0.0/16 	-j LOG --log-prefix "illegal_souce_address"
	$IPT -A bad_packets -s 169.254.0.0/16   -j DROP
	$IPT -A bad_packets -s 192.0.2.0/16 	-j LOG --log-prefix "illegal_souce_address"
	$IPT -A bad_packets -s 192.0.2.0/16     -j DROP
	$IPT -A bad_packets -s 224.0.0.0/4 	-j LOG --log-prefix "illegal_souce_address"
	$IPT -A bad_packets -s 224.0.0.0/4      -j DROP
	$IPT -A bad_packets -s 240.0.0.0/5	-j LOG --log-prefix "illegal_souce_address"
	$IPT -A bad_packets -s 240.0.0.0/5      -j DROP
	$IPT -A bad_packets -s $BROADCAST_SRC   -j DROP
	$IPT -A bad_packets -d $BROADCAST_DEST  -j DROP
	$IPT -A bad_packets -i $IF_WAN  -d  $BROADCAST_DEST  -j DROP
	$IPT -A bad_packets -i $IF_LAN  -d  $INTBC  -j DROP
	$IPT -A bad_packets -o $IF_LAN  -d  $INTBC  -j DROP
	$IPT -A bad_packets -i $IF_WAN  -d  $EXTBC  -j DROP
	$IPT -A bad_packets -o $IF_WAN  -d  $EXTBC  -j DROP

	$IPT -I INPUT		-j bad_packets
	$IPT -A INPUT 		-j icmp_in

	$IPT -I OUTPUT	-j bad_packets
	$IPT -A OUTPUT 	-j icmp_out
	$IPT -I FORWARD	-j bad_packets

echo "Firewall started"
	 
elif [ "$1" = "stop" ]
 then
	echo "Stopping firewall..."

 	$IPT -P INPUT				ACCEPT
	$IPT -P OUTPUT			ACCEPT
	$IPT -P FORWARD			ACCEPT

	$IPT -t nat	-P PREROUTING	ACCEPT
	$IPT -t nat	-P POSTROUTING	ACCEPT
	$IPT -t nat	-P OUTPUT		ACCEPT
	$IPT -t mangle	-P PREROUTING	ACCEPT
	$IPT -t mangle	-P OUTPUT		ACCEPT

	$IPT 		-F
	$IPT -t nat	-F 
	$IPT -t mangle	-F

	$IPT -X
	$IPT -t nat	-X
	$IPT -t mangle	-X
	
	echo "Firewall stopped"
fi

Routing

#!/bin/sh   


ip route flush table T1		#обнуляем первую таблицу маршрутов
ip route flush table T2		#обнуляем вторую таблицу маршрутов

ip route add 192.168.1.0/24 dev eth0 src 192.168.1.3 table T1	#заполняю в первую таблицу инф. о сети первого провайдера
ip route add 192.168.2.0/24 dev eth2 table T1			#заполняю в первую таблицу инф. о том, что у нас существует локальная сеть
ip route add 127.0.0.0/8 dev lo   table T1			#заполняю в первую таблицу инф. о существовании лупбека
ip route add default via 192.168.1.1 table T1			#заполняю в первую таблицу дефолтный гейт на первого провайдера

ip route add 93.168.230.236/30 dev eth3 src 93.168.230.238 table T2	#заполняю во вторую таблицу инф. о сети второго провайдера	
ip route add 192.168.2.0/24 dev eth2 table T2           #заполняю во вторую таблицу инф. о том, что существует локальная сеть.
ip route add 127.0.0.0/8 dev lo   table T2	        #заполняем вторую таблицу инф. о существовании лупбека.
ip route add default via 93.168.230.237 table T2	#закидываем вторую таблицу дефолтный гейт на второго провайдера

ip rule delete table T1		#удаляем наши таблицы, если они присутсвуют в текущей конфигурации (вдруг мы просто перезапускаем скрипт?)
ip rule delete table T2		#аналогично для второй.
ip rule delete table T1		#и делаем это два раза, так как у нас два правила на каждую таблицу.
ip rule delete table T2		#аналогично для второй.

ip rule add from 192.168.1.3    table T1	
ip rule add from 93.168.230.238 table T2	
    
ip rule add fwmark 10 table T1	#все пакеты, которые имеют метку 10 маршрутизировать по таблице T1
ip rule add fwmark 11 table T2	#все пакеты, которые имеют метку 11 маршрутизировать по таблицe T2
    
ip route flush cache		#ну и на последок очистить кеш


$IPT -t mangle -A PREROUTING -i eth2 -s 192.168.2.198	-p tcp -m tcp		--dport 25 	-j MARK --set-mark 11
$IPT -t mangle -A PREROUTING -i eth2 -s 192.168.2.198	-p tcp -m multiport	--dport 80,443	-j MARK --set-mark 10
		
$IPT -A FORWARD -i eth2 -s 192.168.2.198	-o eth3		-m state --state ESTABLISHED,RELATED    -j ACCEPT
$IPT -A FORWARD -i eth2 -s 192.168.2.198	-o eth3 -p tcp  --dport 25  -m state --state NEW        -j ACCEPT
$IPT -A FORWARD -i eth3	-o eth2	-d 192.168.2.198		-m state --state ESTABLISHED,RELATED	-j ACCEPT

$IPT -A FORWARD -i eth2 -s 192.168.2.198        -o eth0         -m state --state ESTABLISHED,RELATED    -j ACCEPT
$IPT -A FORWARD -i eth2 -s 192.168.2.198 -o eth0 -p tcp -m multiport --dport 80,443 -m state --state NEW -j ACCEPT
$IPT -A FORWARD -i eth0 -o eth2 -d 192.168.2.198                -m state --state ESTABLISHED,RELATED    -j ACCEPT

#Правило NAT для T2
$IPT -t nat -A POSTROUTING	-o eth3	-m mark --mark 11 -j SNAT --to-source 93.168.230.238	
#Правило NAT для T1 
$IPT -t nat -A POSTROUTING      -o eth0	-m mark --mark 10 -j SNAT --to-source 192.168.1.3	

	
exit 0

Beelzebub написал(а): ip

Beelzebub написал(а):
ip rule add from 192.168.2.198 table T1
ip rule add from 192.168.2.198 table T2 #все пакеты от ip 192.168.2.198

Обьясните пожалуйста, что нужно указывать в моем случае, адрес машины в локальной сети или ip адрес который смотрит в интернет?

Много текста, сильно

Много текста, сильно внимательно не читал. Однако, судя по приведенным вами конфигам почтовый траффик и так побежит через указанный вами интерфейс. Т.е. - вы УЖЕ добились того, чего хотели. Не совсем понятна суть вопроса... :)

Не знаю, подойдёт ли Вам,

но тут господин slepnoga приводит красивый пример
альтернативного перенаправления трафика, с помощью net-firewall/xtables-addons.
Но - сколько я не пытался собрать этот пакет - не получается. Скорее всего - дело в установленных
на машине sys-kernel/zen-sources.

дело скорее всего в

дело скорее всего в установленных linux-headers, вернее в их версии.

Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)

Спасибо за ответы. Буду

Спасибо за ответы. Буду тестировать.

Я понимаю, что не совсем в

Я понимаю, что не совсем в тему, но , имхо, smtp прокси был бы гораздо уместнее и наверно таки вменяемее. При работе на L3 с L7 у меня всегда один вопрос к писателям правил - какие гарантии того, что l7 протокол не пойдет по другим каналан/портам, и что это именно тот l7 протокол, который нам надо :)

P.S маил.ру:2525, гмаил:456 гмаил:5чтототут, и .т.д

Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)

Спасибо за ответы, буду

Спасибо за ответы, буду тестировать.

Хм,

slepnoga написал(а):
дело скорее всего в установленных linux-headers, вернее в их версии.

I sys-kernel/linux-headers (2.6.34@23.08.2010): Linux system headers
I sys-kernel/zen-sources (2.6.34_p1-r2(2.6.34_p1-r2)@23.08.2010): The Zen Kernel Live Sources

Млин, у меня с gentoo-sources net-firewall/ipset не собирался...

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".