LINUX.ORG.RU
ФорумAdmin

интернет через 2 провайдеров+проброс портов - решение проблемы


0

1

Немало помучившись с решением проблемы, публикую результат. Выражаю благодарность Pinkbype и somestuff за оказанную неоценимую помощь. Итак была задача: имеем двух провайдеров. Необходимо обеспечить доступ в интернет из локальной сети и доступ из интернета к нашим ресурсам по портам 21, 80, 8004, 8005. Чтобы упростить задачу были созданы две локальные подсети, работающие каждая через своего провайдера. Весь http-трафик идет через первого провайдера.

Решение. OS - Ubuntu server 10.10 Установлены dnsmasq и squid

Прошу сильно не бить за ошибки. Но все работает.

Настройка сетевых интерфейсов

##########/etc/network/interfaces

# The loopback network interface

auto lo

iface lo inet loopback

# The primary network interface

# Локальная сеть

auto eth0

iface eth0 inet static

address 192.168.0.8

netmask 255.255.255.0

network 192.168.0.0

broadcast 192.168.0.255

# Сеть провайдера 1

auto eth1

iface eth1 inet static

address 192.168.1.5

netmask 255.255.255.0

network 192.168.1.0

broadcast 192.168.1.255

# Сеть провайдера 2

auto eth2

iface eth2 inet static

address 192.168.2.5

netmask 255.255.255.0

network 192.168.2.0

broadcast 192.168.2.255

# Запускаем маршрутизатор

post-up /etc/start-router

############## конец файла

Cоздаем таблицы маршрутизации Т1 и Т2

########## файл /etc/iprouter2/rt_tables

#

# reserved values

#

255 local

254 main

253 default

0 unspec

#

# local

#

#1 inr.rule

10 T1

20 T2

############## конец файла

И собственно запускаем наш маршрутизатор

############# /etc/start-router

#! /bin/sh

echo 1 > /proc/sys/net/ipv4/ip_forward

IP_LOCAL=«192.168.0.8» # адрес маршрутизатора в локальной сети

IP_INET1=«192.168.1.5» # адрес маршрутизатора в сети провайдера 1

IP_INET2=«192.168.2.5» # адрес маршрутизатора в сети провайдера 2

IF_LOCAL=«eth0» # интерфейс маршрутизатора в локальной сети

IF_INET1=«eth1» # интерфейс маршрутизатора в сети провайдера 1

IF_INET2=«eth2» # интерфейс маршрутизатора в сети провайдера 2

NET_LOCAL=«192.168.0.0/24» # локальная сеть

NET_INET1=«192.168.1.0/24» # сеть провайдера 1

NET_INET2=«192.168.2.0/24» # сеть провайдера 2

SUB_NET1=«192.168.0.0/25» # локальная подсеть 1

SUB_NET2=«192.168.0.128/25» # локальная подсеть 2

GW_INET1=«192.168.1.8» # шлюз в сеть провайдера 1

GW_INET2=«192.168.2.1» # шлюз в сеть провайдера 2

IP_WEB1=«192.168.0.4» # адреса web+ftp сервера IP_WEB2=«192.168.0.134» # адреса web+ftp сервера

IP_SOMS1=«192.168.0.3» # адреса RTK сервера

IP_SOMS2=«192.168.0.133» # адреса RTK сервера

IP_LOCAL_BROADCAST1=«192.168.1.127» # широковещательный адрес подсети 1

IP_LOCAL_BROADCAST2=«192.168.1.255» # широковещательный адрес подсети 2

IP_INET_BROADCAST1=«192.168.1.255» # широковещательный адрес сети провайдера 1

IP_INET_BROADCAST2=«192.168.2.255» # широковещательный адрес сети провайдера 2

# T1 -таблица маршрутизации для провайдера 1

# T2 -таблица маршрутизации для провайдера 2

# очищаем таблицы маршрутизации

ip route flush table T1

ip route flush table T2

# добавляем правила маршрутизации для провайдера 1

ip route add $NET_INET1 dev $IF_INET1 src $IP_INET1 table T1

ip route add $NET_LOCAL dev $IF_LOCAL table T1

ip route add $NET_INET2 dev $IF_INET2 table T1

ip route add 127.0.0.0/8 dev lo table T1

ip route add default via $GW_INET1 table T1

# добавляем правила маршрутизации для провайдера 2

ip route add $NET_INET2 dev $IF_INET2 src $IP_INET2 table T2

ip route add $NET_LOCAL dev $IF_LOCAL table T2

ip route add $NET_INET1 dev $IF_INET1 table T2

ip route add 127.0.0.0/8 dev lo table T2

ip route add default via $GW_INET2 table T2

# добавляем правила маршрутизации в таблицу main

ip route add $NET_INET1 dev $IF_INET1 src $IP_INET1

ip route add $NET_INET2 dev $IF_INET2 src $IP_INET2

# добавляем маршрут по умолчанию

ip route add default via $GW_INET1

# очищаем правила

ip rule delete table T1

ip rule delete 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 fwmark 10 table T1

ip rule add fwmark 20 table T2

# добавляем правила для входящего трафика

ip rule add from $IP_INET1 table T1

ip rule add from $IP_INET2 table T2

# добавляем правила для входящего трафика

ip rule add from $SUB_NET1 table T1

ip rule add from $SUB_NET2 table T2

ip route flush cache

продолжение

IPT=«/sbin/iptables»

# очищаем таблицы

$IPT -F

$IPT -t nat -F

$IPT -t mangle -F

# маркируем пакеты в соответствии с локальными подсетями

$IPT -t mangle -A PREROUTING -s $SUB_NET1 -j MARK --set-mark 10

$IPT -t mangle -A PREROUTING -s $SUB_NET2 -j MARK --set-mark 20

# правила для НАТ

$IPT -t nat -A POSTROUTING -m mark --mark 10 -j MASQUERADE

$IPT -t nat -A POSTROUTING -m mark --mark 20 -j MASQUERADE

# правила для входящих пакетов

# убиваем ошибочные и широковещательные пакеты

$IPT -A INPUT -m state --state INVALID -j DROP

$IPT -A INPUT -i $IF_INET1 -m state --state NEW -j DROP

$IPT -A INPUT -i $IF_INET2 -m state --state NEW -j DROP

$IPT -A INPUT -i lo -j ACCEPT

$IPT -A INPUT -d $IP_LOCAL_BROADCAST1 -j DROP

$IPT -A INPUT -d $IP_LOCAL_BROADCAST2 -j DROP

$IPT -A INPUT -d $IP_INET_BROADCAST1 -j DROP

$IPT -A INPUT -d $IP_INET_BROADCAST2 -j DROP

# правила для транзитных пакетов

# пропускаем наружу все пакеты

$IPT -A FORWARD -i $IF_LOCAL -o $IF_INET1 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

$IPT -A FORWARD -i $IF_LOCAL -o $IF_INET2 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

# пропускаем назад только пакеты по установленным соединениям

$IPT -A FORWARD -i $IF_INET1 -m state --state RELATED,ESTABLISHED -j ACCEPT

$IPT -A FORWARD -i $IF_INET2 -m state --state RELATED,ESTABLISHED -j ACCEPT

# правила проброса портов # в подсеть 1

$IPT -A FORWARD -d $IP_WEB1 -i $IF_INET1 -p tcp -m tcp --dport 80 -j ACCEPT

$IPT -A FORWARD -d $IP_WEB1 -i $IF_INET1 -p tcp -m tcp --dport 21 -j ACCEPT

$IPT -A FORWARD -d $IP_SOMS1 -i $IF_INET1 -p tcp -m tcp --dport 8004 -j ACCEPT

$IPT -A FORWARD -d $IP_SOMS1 -i $IF_INET1 -p tcp -m tcp --dport 8005 -j ACCEPT

# в подсеть 2

$IPT -A FORWARD -d $IP_WEB2 -i $IF_INET2 -p tcp -m tcp --dport 80 -j ACCEPT

$IPT -A FORWARD -d $IP_WEB2 -i $IF_INET2 -p tcp -m tcp --dport 21 -j ACCEPT

$IPT -A FORWARD -d $IP_SOMS2 -i $IF_INET2 -p tcp -m tcp --dport 8004 -j ACCEPT

$IPT -A FORWARD -d $IP_SOMS2 -i $IF_INET2 -p tcp -m tcp --dport 8005 -j ACCEPT

# убиваем широковещательные пакеты

$IPT -A FORWARD -d $IP_LOCAL_BROADCAST1 -j DROP

$IPT -A FORWARD -d $IP_LOCAL_BROADCAST2 -j DROP

$IPT -A FORWARD -d $IP_INET_BROADCAST1 -j DROP

$IPT -A FORWARD -d $IP_INET_BROADCAST2 -j DROP

# правила для исходящих пакетов

# убиваем ошибочные и широковещательные пакеты

$IPT -A OUTPUT -d $IP_LOCAL_BROADCAST1 -j DROP

$IPT -A OUTPUT -d $IP_LOCAL_BROADCAST2 -j DROP

$IPT -A OUTPUT -d $IP_INET_BROADCAST1 -j DROP

$IPT -A OUTPUT -d $IP_INET_BROADCAST2 -j DROP

$IPT -A OUTPUT -m state --state INVALID -j DROP

$IPT -A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

# перенаправляем http трафик на прозрачный прокси

$IPT -t nat -A PREROUTING -i $IF_LOCAL -p tcp -m multiport --dports 80,8080 -j DNAT --to-destination $IP_LOCAL:3128

# правила проброса портов

$IPT -t nat -A PREROUTING -d $IP_INET1 -p tcp -m tcp --dport 80 -j DNAT --to-destination $IP_WEB1:80

$IPT -t nat -A PREROUTING -d $IP_INET1 -p tcp -m tcp --dport 21 -j DNAT --to-destination $IP_WEB1:21

$IPT -t nat -A PREROUTING -d $IP_INET1 -p tcp -m tcp --dport 8004 -j DNAT --to-destination $IP_SOMS1:8004

$IPT -t nat -A PREROUTING -d $IP_INET1 -p tcp -m tcp --dport 8005 -j DNAT --to-destination $IP_SOMS1:8005

# в подсеть 2

$IPT -t nat -A PREROUTING -d $IP_INET2 -p tcp -m tcp --dport 80 -j DNAT --to-destination $IP_WEB2:80

$IPT -t nat -A PREROUTING -d $IP_INET2 -p tcp -m tcp --dport 21 -j DNAT --to-destination $IP_WEB2:21

$IPT -t nat -A PREROUTING -d $IP_INET2 -p tcp -m tcp --dport 8004 -j DNAT --to-destination $IP_SOMS2:8005

$IPT -t nat -A PREROUTING -d $IP_INET2 -p tcp -m tcp --dport 8005 -j DNAT --to-destination $IP_SOMS2:8005

# идем пить пиво :-)

exit 0

################ конец файла

glombert ()
Ответ на: продолжение от glombert

Ага, ну 2-е локальных подсети мне не интересно, а вот заставить отвечать сервис в локалке на два внешних IP...

Если мы на локальную машину повесим алиасом 2-ой IP на ее единственную сетевушку, то тогда все просто. DNAT'ом заворачиваем соответственно каждый внешний IP, на каждый внутренний, а ответы маркируем по -s и --sport для iproute2.

Надо попробовать.

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