Перечитал на форуме ВСЕ. уже голова кругом идет. Поумнел на целый килограм :) НО.....Есть задача:
2 провайдера, сделать сервак доступным из вне как с одного так и с другого провайдера.
ОСь: Debian Lenny 5.0
Конфиг сети:
# cat /etc/network/interfacesallow-hotplug eth0
iface eth0 inet static #локалка
address 192.168.0.2
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255allow-hotplug eth1
iface eth1 inet static #провайдер 1
address 172.16.0.2
netmask 255.255.255.0
network 172.16.0.0
broadcast 172.16.0.255
gateway 172.16.0.1
dns-nameservers 172.16.0.1allow-hotplug eth2 #провайдер 2
iface eth2 inet static
address 172.16.1.2
netmask 255.255.255.0
network 172.16.1.0
broadcast 172.16.1.255
gateway 172.16.1.1
dns-nameservers 172.16.1.1Добавляю 2 таблички:
echo "101 T1" >> /etc/iproute2/rt_tables
echo "102 T2" >> /etc/iproute2/rt_tablesТаблици маршрутизации заполняются следующим сткиптом:
#cat routes
IF1=eth1
IF2=eth2IP1=172.16.0.2
IP2=172.16.1.2P1=172.16.0.1
P2=172.16.1.1P1_NET=172.16.0.0/24
P2_NET=172.16.1.0/24SRV1=192.168.0.237
SRV2=192.168.0.238ip route add $P1_NET dev $IF1 src $IP1 table T1
ip route add default via $IP1 table T1ip route add $P2_NET dev $IF2 src $IP2 table T2
ip route add default via $IP2 table T2ip route add $P1_NET dev $IF1 src $IP1
ip route add $P2_NET dev $IF2 src $IP2
ip route add default via $P1 metric 10ip rule add from $IP1 table T1
ip rule add from $IP2 table T2ip rule add from $SRV1 fwmark 10 table T1
ip rule add from $SRV2 fwmark 20 table T2Фаервол таким скриптом:
#cat firewall
echo 1 > /proc/sys/net/ipv4/ip_forward
EXT1_DEV=eth1
EXT1_IP=172.16.0.2EXT2_DEV=eth2
EXT2_IP=172.16.1.2DMZ0_DEV=eth0
DMZ0_IP=192.168.0.2
DMZ0_NET=192.168.0.0/24iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -Xiptables -P INPUT DROP
iptables -P FORWARD DROPiptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p icmp --icmp-type any -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type any -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type any -j ACCEPTiptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i $DMZ0_DEV -s $DMZ0_NET -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i $DMZ0_DEV -s $DMZ0_NET -p tcp --dport 3389 -j ACCEPT
iptables -A INPUT -i $DMZ0_DEV -s $DMZ0_NET -p udp --dport 53 -j ACCEPT
iptables -A INPUT -i $DMZ0_DEV -s $DMZ0_NET -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -i $DMZ0_DEV -s $DMZ0_NET -p tcp --dport 143 -j ACCEPT
iptables -A INPUT -i $DMZ0_DEV -s $DMZ0_NET -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -i $DMZ0_DEV -s $DMZ0_NET -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -i $DMZ0_DEV -s $DMZ0_NET -p tcp --dport 465 -j ACCEPT
iptables -A INPUT -i $DMZ0_DEV -s $DMZ0_NET -p tcp --dport 995 -j ACCEPTiptables -A FORWARD -i $DMZ0_DEV -o $EXT1_DEV -s 192.168.0.0/24 -j ACCEPT
iptables -A FORWARD -i $EXT1_DEV -o $DMZ0_DEV -m state --state ESTABLISHED,RELATED -j ACCEPTiptables -A FORWARD -i $DMZ0_DEV -o $EXT2_DEV -s 192.168.0.0/24 -j ACCEPT
iptables -A FORWARD -i $EXT2_DEV -o $DMZ0_DEV -m state --state ESTABLISHED,RELATED -j ACCEPTiptables -A FORWARD -i $EXT1_DEV -o $DMZ0_DEV -p tcp -d 192.168.0.237 --dport 3389 -j ACCEPT
iptables -A FORWARD -i $EXT2_DEV -o $DMZ0_DEV -p tcp -d 192.168.0.238 --dport 3389 -j ACCEPTiptables -t nat -A PREROUTING -i $EXT1_DEV -d $EXT1_IP -p tcp --dport 3389 -j DNAT --to-destination 192.168.0.237:3389
iptables -t nat -A PREROUTING -i $EXT2_DEV -d $EXT2_IP -p tcp --dport 3389 -j DNAT --to-destination 192.168.0.238:3389iptables -t mangle -A PREROUTING -i eth0 -s 192.169.0.237 -p tcp -j MARK --set-mark 10
iptables -t mangle -A PREROUTING -i eth0 -s 192.169.0.238 -p tcp -j MARK --set-mark 20iptables -A INPUT -s 0/0 -p tcp --dport 22 -j ACCEPT
Как видно из скрипта виндовая машина имеет 2 айпихи 192.168.0.237 и 192.168.0.238. Так вот, после всех этих манипуляций я могу работать из вне по интерфейсу первого провайдера и не могу по второму. Тыкните, пожалуйста, носом, где я провтыкал.... Принимается любой конструктив. Спасибо
http://www.opennet.me/tips/2009_policy_route_linux.shtml
http://www.opennet.me/tips/1651_route_iptables_linux_nat.shtml
просветляйтесь. будут вопросы - задавайте.
>http://www.opennet.me/tips/2009_policy_route_linux.shtml
>http://www.opennet.me/tips/1651_route_iptables_linux_nat.shtml
>
>
>просветляйтесь. будут вопросы - задавайте.Спасибо. Первое очень помогло, вторую читал до Вашего совета. Благодаря первой статье нашел у себя мелкую ошибку. В фаервол тоже закралась мелкая ошибка в маркировке. Спасибо еще раз.
>Перечитал на форуме ВСЕ. уже голова кругом идет. Поумнел на целый килограм
>:) НО.....
>
>Есть задача:
>2 провайдера, сделать сервак доступным из вне как с одного так и
>с другого провайдера.
>ОСь: Debian Lenny 5.0
>Конфиг сети:
># cat /etc/network/interfacesapt-get install rinetd
Вот теперь работает. Ура.# cat /etc/network/interfaces
allow-hotplug eth0
iface eth0 inet static #локалка
address 192.168.0.2
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255allow-hotplug eth1
iface eth1 inet static #провайдер 1
address 172.16.0.2
netmask 255.255.255.0
network 172.16.0.0
broadcast 172.16.0.255
gateway 172.16.0.1
dns-nameservers 172.16.0.1allow-hotplug eth2 #провайдер 2
iface eth2 inet static
address 172.16.1.2
netmask 255.255.255.0
network 172.16.1.0
broadcast 172.16.1.255
gateway 172.16.1.1
dns-nameservers 172.16.1.1Добавляю 2 таблички:
echo "101 T1" >> /etc/iproute2/rt_tables
echo "102 T2" >> /etc/iproute2/rt_tablesТаблици маршрутизации заполняются следующим сткиптом:
#cat routes
IF1=eth1
IF2=eth2IP1=172.16.0.2
IP2=172.16.1.2P1=172.16.0.1
P2=172.16.1.1P1_NET=172.16.0.0/24
P2_NET=172.16.1.0/24SRV1=192.168.0.237
SRV2=192.168.0.238ip route add $P1_NET dev $IF1 src $IP1 table T1
ip route add default via $P1 table T1ip route add $P2_NET dev $IF2 src $IP2 table T2
ip route add default via $P2 table T2ip route add $P1_NET dev $IF1 src $IP1
ip route add $P2_NET dev $IF2 src $IP2
ip route add default via $P1 metric 10ip rule add from $IP1 table T1
ip rule add from $IP2 table T2ip rule add from $SRV1 fwmark 10 table T1
ip rule add from $SRV2 fwmark 20 table T2Фаервол таким скриптом:
#cat firewall
echo 1 > /proc/sys/net/ipv4/ip_forward
EXT1_DEV=eth1
EXT1_IP=172.16.0.2EXT2_DEV=eth2
EXT2_IP=172.16.1.2DMZ0_DEV=eth0
DMZ0_IP=192.168.0.2
DMZ0_NET=192.168.0.0/24iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -Xiptables -P INPUT DROP
iptables -P FORWARD DROPiptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p icmp --icmp-type any -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type any -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type any -j ACCEPTiptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i $DMZ0_DEV -s $DMZ0_NET -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i $DMZ0_DEV -s $DMZ0_NET -p tcp --dport 3389 -j ACCEPT
iptables -A INPUT -i $DMZ0_DEV -s $DMZ0_NET -p udp --dport 53 -j ACCEPT
iptables -A INPUT -i $DMZ0_DEV -s $DMZ0_NET -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -i $DMZ0_DEV -s $DMZ0_NET -p tcp --dport 143 -j ACCEPT
iptables -A INPUT -i $DMZ0_DEV -s $DMZ0_NET -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -i $DMZ0_DEV -s $DMZ0_NET -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -i $DMZ0_DEV -s $DMZ0_NET -p tcp --dport 465 -j ACCEPT
iptables -A INPUT -i $DMZ0_DEV -s $DMZ0_NET -p tcp --dport 995 -j ACCEPTiptables -A FORWARD -i $DMZ0_DEV -o $EXT1_DEV -s 192.168.0.0/24 -j ACCEPT
iptables -A FORWARD -i $EXT1_DEV -o $DMZ0_DEV -m state --state ESTABLISHED,RELATED -j ACCEPTiptables -A FORWARD -i $DMZ0_DEV -o $EXT2_DEV -s 192.168.0.0/24 -j ACCEPT
iptables -A FORWARD -i $EXT2_DEV -o $DMZ0_DEV -m state --state ESTABLISHED,RELATED -j ACCEPTiptables -A FORWARD -i $EXT1_DEV -o $DMZ0_DEV -p tcp -d 192.168.0.237 --dport 3389 -j ACCEPT
iptables -A FORWARD -i $EXT2_DEV -o $DMZ0_DEV -p tcp -d 192.168.0.238 --dport 3389 -j ACCEPTiptables -t nat -A PREROUTING -i $EXT1_DEV -d $EXT1_IP -p tcp --dport 3389 -j DNAT --to-destination 192.168.0.237:3389
iptables -t nat -A PREROUTING -i $EXT2_DEV -d $EXT2_IP -p tcp --dport 3389 -j DNAT --to-destination 192.168.0.238:3389iptables -t mangle -A PREROUTING -i eth0 -s 192.168.0.237 -p tcp -j MARK --set-mark 10
iptables -t mangle -A PREROUTING -i eth0 -s 192.168.0.238 -p tcp -j MARK --set-mark 20iptables -A INPUT -s 0/0 -p tcp --dport 22 -j ACCEPT
Еще вопрос, у меня тунель (OpenVPN) работает по udp... Тунелирование идет на сервак в который входят 2 провайдера (прямо в него, не ДНАТ). Так вот что-то по этому протоколу не очень получается... Тоесть, если по первому каналу конектишся - все гуд, а когда по второму - ответы возвращаются по первому. Заставляеш работать тунель по tcp - все отлично работает на обеих каналах.Куда копать?
>(OpenVPN) работает по udp...
>по tcp - все отлично работает на обеих каналах.
>Куда копать?В сторону "-p tcp" в --
>>iptables -t mangle -A PREROUTING -i eth0 -s 192.168.0.237 -p tcp -j MARK --set-mark 10
>>iptables -t mangle -A PREROUTING -i eth0 -s 192.168.0.238 -p tcp -j MARK --set-mark 20
>>(OpenVPN) работает по udp...
>>по tcp - все отлично работает на обеих каналах.
>>Куда копать?
>
>В сторону "-p tcp" в --
>
>>>iptables -t mangle -A PREROUTING -i eth0 -s 192.168.0.237 -p tcp -j MARK --set-mark 10
>>>iptables -t mangle -A PREROUTING -i eth0 -s 192.168.0.238 -p tcp -j MARK --set-mark 20оно то так, но пакеты по udp проходят только мимо eth1 и eth2 (пункт назначения и есть сервак)... при выходе по идее они должны ити согласо правил первого скрипта т.е.
ip rule add from $IP1 table T1
ip rule add from $IP2 table T2но, почему-то, с udp этого не происходит
как вариант попробовать тоже маркировать, в OUTPUT
>[оверквотинг удален]
>>>>iptables -t mangle -A PREROUTING -i eth0 -s 192.168.0.238 -p tcp -j MARK --set-mark 20
>
>оно то так, но пакеты по udp проходят только мимо eth1 и
>eth2 (пункт назначения и есть сервак)... при выходе по идее они
>должны ити согласо правил первого скрипта т.е.
>
>ip rule add from $IP1 table T1
>ip rule add from $IP2 table T2
>
>но, почему-то, с udp этого не происходитпотому что надо посмотреть на результирующий ip ru sh и содержимое всех таблиц по порядку совпадения правил.
Если сервисы расположены на разных айпи одного хоста, то никакой маркировки не требуется, поскольку разделение ответных пакетов по каналам будет идти на основании IP-адреса, с которого идет ответный пакет.
Маркировка требуется, если сервис слушает один айпи:порт, но нужно к нему обеспечить доступ с разных каналов, путем пропускания сквозь DNAT (статья по ссылке в первом ответе темы писалась именно для openvpn, насколько я помню, всё работало как в tcp так и в udp вариантах).
>>[оверквотинг удален]С тестового переехали на боевую машину. сейчас конфиг такой
eth1 - провайдер 1
eth4 - тот же провайдер, другая линия
eth3 - провайдер 2
Влан можно игнорировать, как и остальные фейсы, они без шлюзов.по tcp все отлично разрулилось, по udp возвращается не тудой, куда пришел.
#ip ru sh
0: from all lookup local
32763: from 172.16.1.2 lookup Ukrtelecom2
32764: from 172.16.0.2 lookup Ukrtelecom1
32765: from xxx.xxx.xxx.xxx lookup CiNet
32766: from all lookup main
32767: from all lookup default#ip ro sh table local
broadcast 10.30.30.15 dev vlan7 proto kernel scope link src 10.30.30.13
broadcast 192.168.0.255 dev eth2 proto kernel scope link src 192.168.0.21
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
local 10.10.10.1 dev tun0 proto kernel scope host src 10.10.10.1
local 10.30.30.13 dev vlan7 proto kernel scope host src 10.30.30.13
broadcast 10.30.30.12 dev vlan7 proto kernel scope link src 10.30.30.13
broadcast 10.86.66.15 dev eth3 proto kernel scope link src 10.86.66.11
broadcast 10.86.66.8 dev eth3 proto kernel scope link src 10.86.66.11
broadcast 172.0.0.0 dev eth1 proto kernel scope link src 172.0.0.1
broadcast 172.16.1.255 dev eth4 proto kernel scope link src 172.16.1.2
broadcast 172.16.0.0 dev eth0 proto kernel scope link src 172.16.0.2
local 172.0.0.1 dev eth1 proto kernel scope host src 172.0.0.1
broadcast 212.86.104.127 dev eth3 proto kernel scope link src xxx.xxx.xxx.xxx
local 10.86.66.11 dev eth3 proto kernel scope host src 10.86.66.11
local 172.16.0.2 dev eth0 proto kernel scope host src 172.16.0.2
local 192.168.0.1 dev eth2 proto kernel scope host src 192.168.0.21
broadcast 192.168.0.0 dev eth2 proto kernel scope link src 192.168.0.21
broadcast xxx.xxx.xxx.yyy dev eth3 proto kernel scope link src xxx.xxx.xxx.xxx
broadcast xxx.xxx.xxx.aaa dev eth3 proto kernel scope link src xxx.xxx.xxx.xxx
local xxx.xxx.xxx.xxx dev eth3 proto kernel scope host src xxx.xxx.xxx.xxx
broadcast 10.30.30.19 dev vlan51 proto kernel scope link src 10.30.30.17
local 192.168.0.21 dev eth2 proto kernel scope host src 192.168.0.21
broadcast 172.0.0.255 dev eth1 proto kernel scope link src 172.0.0.1
broadcast 172.16.1.0 dev eth4 proto kernel scope link src 172.16.1.2
broadcast 172.16.0.255 dev eth0 proto kernel scope link src 172.16.0.2
local 10.30.30.17 dev vlan51 proto kernel scope host src 10.30.30.17
broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
broadcast 10.30.30.16 dev vlan51 proto kernel scope link src 10.30.30.17
local 172.16.1.2 dev eth4 proto kernel scope host src 172.16.1.2
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1#ip ro sh table Ukrtelecom1
172.16.0.0/24 dev eth0 scope link src 172.16.0.2
default via 172.16.0.1 dev eth0#ip ro sh table Ukrtelecom2
172.16.1.0/24 dev eth4 scope link src 172.16.1.2
default via 172.16.0.1 dev eth4xxx.xxx.xxx.yyy/30 dev eth3 scope link src xxx.xxx.xxx.xxx
default via xxx.xxx.xxx.zzz dev eth3
>по tcp все отлично разрулилось, по udp возвращается не тудой, куда пришел.multihome спасет отца русской демократии :D
>multihome спасет отца русской демократии :Dспасет, но хотелось бы понять от куда ноги растут ;)
>>multihome спасет отца русской демократии :D
>
>спасет, но хотелось бы понять от куда ноги растут ;)почитать в гугле, man openvpn или списках рассылки openvpn, нее? :)
--multihome
Configure a multi-homed UDP server. This option can be used when OpenVPN has been configured to listen on all interfaces, and will attempt to bind client sessions to the interface on which packets are being received, so that outgoing packets will be sent out of the same interface. Note that this option is only relevant for UDP servers and currently is only implemented on Linux.
Note: clients connecting to a --multihome server should always use the --nobind option.
>[оверквотинг удален]
>Configure a multi-homed UDP server. This option can be used when OpenVPN
> has been configured to listen on all
>interfaces, and will attempt to bind client sessions to the interface
>on which packets are being received, so that outgoing packets will
>be sent out of the same interface. Note that this
>option is only relevant for UDP servers and currently is only
>implemented on Linux.
>
>Note: clients connecting to a --multihome server should always use the --nobind
>option.Прочитал, осмыслил, получилось, спасибо ;) Не поверил сразу, что все так просто;) Еще раз ДАНКЕ :)
>[оверквотинг удален]
>>>>iptables -t mangle -A PREROUTING -i eth0 -s 192.168.0.238 -p tcp -j MARK --set-mark 20
>
>оно то так, но пакеты по udp проходят только мимо eth1 и
>eth2 (пункт назначения и есть сервак)... при выходе по идее они
>должны ити согласо правил первого скрипта т.е.
>
>ip rule add from $IP1 table T1
>ip rule add from $IP2 table T2
>
>но, почему-то, с udp этого не происходитдобавь опцию multihome в конфиг openvpn. Появилась в ветке 2.1 кажись