#!/bin/bash
IP_LOCAL="192.168.0.1" # адрес нашего маршрутизатора в локальной сети.
IP_INET1="aaa.aaa.aaa.93" # адрес нашего маршрутизатора в сети первого провайдера.
IP_INET2="bbb.bbb.bbb.6" # адрес нашего марщрутизатора в сети второго провайдера.
IF_LOCAL="vmbr0" # имя интерфейса на локальную сеть
IF_INET1="eth0" # имя интерфейса на первого провайдера.
IF_INET2="eth1" # имя интерфейса на второго провайдера.
NET_LOCAL="192.168.0.0/16" # локальная сеть.
NET_INET1="aaa.aaa.aaa.0/24" # адрес сети в которой гейт нашего первого провайдера.
NET_INET2="bbb.bbb.bbb.0/24" # адрес сети в которой гейт нашего второго провайдера.
NET_SUB1="192.168.0.0/24" # подсеть пользователей на первого провайдера
NET_SUB2="192.168.1.0/24" # подсеть пользователей на второго провайдера
GW_INET1="aaa.aaa.aaa.1" # гейт первого провайдера.
GW_INET2="bbb.bbb.bbb.1" # гейт второго провайдера.
IPT="/sbin/iptables"
for interface in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo "0" > ${interface}
done
ip route flush table T1 #обнуляем первую таблицу маршрутов
ip route flush table T2 #обнуляем вторую таблицу маршрутов
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 #закидываем в первую таблицу дефолтный гейт на первого провайдера
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 #закидываем во вторую таблицу дефолтный гейт на второго провайдера
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 add from $IP_INET1 table T1 #все пакеты от ip адреса первого провайдера маршрутизировать по таблице T1
ip rule add from $IP_INET2 table T2 #все пакеты от ip адреса второго провайдера маршрутизировать по таблице T2
ip rule add fwmark 10 table T1 #все пакеты, которые имеют метку 10 маршрутизировать по таблице T1
ip rule add fwmark 11 table T2 #все пакеты, которые имеют метку 11 маршрутизировать по таблицу T2
ip route flush cache #ну и на последок очистить кеш
$IPT -t nat -F #очищаем таблицу nat
$IPT -t mangle -F #очищаем таблицу mangle
$IPT -t filter -F #очищаем таблицу filter
#все пакеты, которые попали в цепочку PREROUTING таблицы mangle обрабатываем по двум правилам:
$IPT -t mangle -A PREROUTING -s $NET_SUB1 -d ! $NET_LOCAL -j MARK --set-mark 10 # все пакеты которые идут от $NET_SUB1 и не в $NET_LOCAL маркируем меткой 10
$IPT -t mangle -A PREROUTING -s 192.168.0.150 -d ! $NET_LOCAL -j MARK --set-mark 11 # все пакеты которые идут от $NET_SUB1 и не в $NET_LOCAL маркируем меткой 11
$IPT -t nat -A PREROUTING -d $IP_INET2 -p tcp -m tcp --dport 21 -j DNAT --to-destination 192.168.0.150
$IPT -t nat -A OUTPUT -d $IP_INET2 -p tcp -m tcp --dport 21 -j DNAT --to-destination 192.168.0.150
#$IPT -t nat -A POSTROUTING -d 192.168.0.150 -p tcp -m tcp --dport 21 -j SNAT --to-source $IP_INET2
$IPT -t nat -A PREROUTING -d $IP_INET1 -p tcp -m tcp --dport 53 -j DNAT --to-destination 192.168.0.150
$IPT -t nat -A OUTPUT -d $IP_INET1 -p tcp -m tcp --dport 53 -j DNAT --to-destination 192.168.0.150
#$IPT -t nat -A POSTROUTING -d 192.168.0.150 -p tcp -m tcp --dport 53 -j SNAT --to-source $IP_INET1
$IPT -t nat -A PREROUTING -d $IP_INET2 -p tcp -m tcp --dport 53 -j DNAT --to-destination 192.168.0.150
$IPT -t nat -A OUTPUT -d $IP_INET2 -p tcp -m tcp --dport 53 -j DNAT --to-destination 192.168.0.150
#$IPT -t nat -A POSTROUTING -d 192.168.0.150 -p tcp -m tcp --dport 53 -j SNAT --to-source $IP_INET2
$IPT -t nat -A PREROUTING -d $IP_INET2 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.0.150
$IPT -t nat -A OUTPUT -d $IP_INET2 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.0.150
#$IPT -t nat -A POSTROUTING -d 192.168.0.150 -p tcp -m tcp --dport 80 -j SNAT --to-source $IP_INET2
$IPT -t nat -A PREROUTING -d $IP_INET2 -p tcp -m tcp --dport 10000 -j DNAT --to-destination 192.168.0.150
$IPT -t nat -A OUTPUT -d $IP_INET2 -p tcp -m tcp --dport 10000 -j DNAT --to-destination 192.168.0.150
#$IPT -t nat -A POSTROUTING -d 192.168.0.150 -p tcp -m tcp --dport 10000 -j SNAT --to-source $IP_INET2
$IPT -t nat -A PREROUTING -d $IP_INET2 -p tcp -m tcp --dport 443 -j DNAT --to-destination 192.168.0.150
$IPT -t nat -A OUTPUT -d $IP_INET2 -p tcp -m tcp --dport 443 -j DNAT --to-destination 192.168.0.150
#$IPT -t nat -A POSTROUTING -d 192.168.0.150 -p tcp -m tcp --dport 443 -j SNAT --to-source $IP_INET2
$IPT -t nat -A PREROUTING -d $IP_INET2 -p tcp -m tcp --dport 22 -j DNAT --to-destination 192.168.0.150
$IPT -t nat -A OUTPUT -d $IP_INET2 -p tcp -m tcp --dport 22 -j DNAT --to-destination 192.168.0.150
#$IPT -t nat -A POSTROUTING -d 192.168.0.150 -p tcp -m tcp --dport 22 -j SNAT --to-source $IP_INET2
$IPT -t nat -A PREROUTING -d $IP_INET2 -p tcp -m tcp --dport 25 -j DNAT --to-destination 192.168.0.150
$IPT -t nat -A OUTPUT -d $IP_INET2 -p tcp -m tcp --dport 25 -j DNAT --to-destination 192.168.0.150
#$IPT -t nat -A POSTROUTING -d 192.168.0.150 -p tcp -m tcp --dport 25 -j SNAT --to-source $IP_INET2
$IPT -t nat -A PREROUTING -d $IP_INET2 -p tcp -m tcp --dport 143 -j DNAT --to-destination 192.168.0.150
$IPT -t nat -A OUTPUT -d $IP_INET2 -p tcp -m tcp --dport 143 -j DNAT --to-destination 192.168.0.150
#$IPT -t nat -A POSTROUTING -d 192.168.0.150 -p tcp -m tcp --dport 143 -j SNAT --to-source $IP_INET2
$IPT -t nat -A PREROUTING -d $IP_INET2 -p tcp -m tcp --dport 110 -j DNAT --to-destination 192.168.0.150
$IPT -t nat -A OUTPUT -d $IP_INET2 -p tcp -m tcp --dport 110 -j DNAT --to-destination 192.168.0.150
#$IPT -t nat -A POSTROUTING -d 192.168.0.150 -p tcp -m tcp --dport 110 -j SNAT --to-source $IP_INET2
$IPT -t nat -A PREROUTING -d $IP_INET2 -p tcp -m tcp --dport 587 -j DNAT --to-destination 192.168.0.150
$IPT -t nat -A OUTPUT -d $IP_INET2 -p tcp -m tcp --dport 587 -j DNAT --to-destination 192.168.0.150
#$IPT -t nat -A POSTROUTING -d 192.168.0.150 -p tcp -m tcp --dport 587 -j SNAT --to-source $IP_INET2
$IPT -t nat -A PREROUTING -d $IP_INET2 -p tcp -m tcp --dport 993 -j DNAT --to-destination 192.168.0.150
$IPT -t nat -A OUTPUT -d $IP_INET2 -p tcp -m tcp --dport 993 -j DNAT --to-destination 192.168.0.150
#$IPT -t nat -A POSTROUTING -d 192.168.0.150 -p tcp -m tcp --dport 993 -j SNAT --to-source $IP_INET2
$IPT -t nat -A PREROUTING -d $IP_INET2 -p tcp -m tcp --dport 995 -j DNAT --to-destination 192.168.0.150
$IPT -t nat -A OUTPUT -d $IP_INET2 -p tcp -m tcp --dport 995 -j DNAT --to-destination 192.168.0.150
#$IPT -t nat -A POSTROUTING -d 192.168.0.150 -p tcp -m tcp --dport 995 -j SNAT --to-source $IP_INET2
#все пакеты, которые попали в цепочку POSTROUTING таблицы nat обрабатываем по двум правилам:
#$IPT -t nat -A POSTROUTING -m mark --mark 10 -j MASQUERADE # натим все пакеты которые имеют метку 10
#$IPT -t nat -A POSTROUTING -m mark --mark 11 -j MASQUERADE # натим все пакеты которые имеют метку 11
$IPT -t nat -A POSTROUTING -s 192.168.0.0/16 ! -d 192.168.0.0/16 -j MASQUERADE
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -A INPUT -m state --state INVALID -j DROP
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#Используя возможности модуля state мы отбрасываем некорректные пакеты и принимаем пакеты относящиеся к уже установленным соединениям либо ко вторичными соединениям (таким как передача данных в ftp).
$IPT -A INPUT -p tcp --dport 22 --syn -m state --state NEW -j ACCEPT
$IPT -A INPUT -i $IF_INET1 -p tcp --dport 443 --syn -m state --state NEW -j ACCEPT
$IPT -A INPUT -i $IF_INET1 -p tcp --dport 5900 --syn -m state --state NEW -j ACCEPT
$IPT -A INPUT -i $IF_INET1 -p tcp --dport 10000 --syn -m state --state NEW -j ACCEPT
#Принимаем подключения по SSH отовсюду.
$IPT -A INPUT -i $IF_LOCAL -s $NET_LOCAL -j ACCEPT
#Локальный трафик будет ходить без ограничений, хотя это не всегда правильно.
$IPT -A INPUT -i lo -j ACCEPT
#Тоже на localhost.
$IPT -A OUTPUT -m state --state INVALID -j DROP
$IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#Эти правила аналогичны правилам в цепочке INPUT.
$IPT -A OUTPUT -o $IF_INET1 -p udp --dport 53 -j ACCEPT
#Мы разрешили работать нашему DNS серверу через основного провайдера
$IPT -A OUTPUT -o $IF_INET1 -p tcp --dport 22 --syn -m state --state NEW -j ACCEPT
#А также разрешили выходить наружу по SSH.
$IPT -A OUTPUT -o $IF_LOCAL -d $NET_LOCAL -m state --state NEW -j ACCEPT
#Опять же на исходящий локальный трафик ограничений нет.
#Переходим к обработке трафика из локальной сети:
echo "
- Setting up FORWARD chain..."
$IPT -A FORWARD -m state --state INVALID -j DROP
$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
#Все те же два удобных правила.
$IPT -A FORWARD -i $IF_INET2 -d 192.168.0.150 -p tcp --dport 21 --syn -m state --state NEW -j ACCEPT
$IPT -A FORWARD -i $IF_INET2 -d 192.168.0.150 -p tcp --dport 22 --syn -m state --state NEW -j ACCEPT
$IPT -A FORWARD -i $IF_INET2 -d 192.168.0.150 -p tcp --dport 25 --syn -m state --state NEW -j ACCEPT
#$IPT -A FORWARD -p tcp --dport 25 -s 192.168.0.150 --syn -m state --state NEW -j ACCEPT
$IPT -A FORWARD -i $IF_INET1 -d 192.168.0.150 -p tcp --dport 53 --syn -m state --state NEW -j ACCEPT
$IPT -A FORWARD -i $IF_INET2 -d 192.168.0.150 -p tcp --dport 53 --syn -m state --state NEW -j ACCEPT
$IPT -A FORWARD -i $IF_INET2 -d 192.168.0.150 -p tcp --dport 80 --syn -m state --state NEW -j ACCEPT
$IPT -A FORWARD -i $IF_INET2 -d 192.168.0.150 -p tcp --dport 110 --syn -m state --state NEW -j ACCEPT
$IPT -A FORWARD -i $IF_INET2 -d 192.168.0.150 -p tcp --dport 143 --syn -m state --state NEW -j ACCEPT
$IPT -A FORWARD -i $IF_INET2 -d 192.168.0.150 -p tcp --dport 443 --syn -m state --state NEW -j ACCEPT
$IPT -A FORWARD -i $IF_INET2 -d 192.168.0.150 -p tcp --dport 587 --syn -m state --state NEW -j ACCEPT
$IPT -A FORWARD -i $IF_INET2 -d 192.168.0.150 -p tcp --dport 993 --syn -m state --state NEW -j ACCEPT
$IPT -A FORWARD -i $IF_INET2 -d 192.168.0.150 -p tcp --dport 995 --syn -m state --state NEW -j ACCEPT
$IPT -A FORWARD -i $IF_INET2 -d 192.168.0.150 -p tcp --dport 10000 --syn -m state --state NEW -j ACCEPT
#Так у нас получается, что пакеты приходящие на первого провайдера пропускаются только на первый айпишник сервера, второго — на второй.
$IPT -A FORWARD -m conntrack -s $NET_LOCAL -j ACCEPT --ctstate NEW
#$IPT -A FORWARD -m conntrack -j ACCEPT --ctstate RELATED,ESTABLISHED
#разрешаем инет для локалки
exit 0