Эта тема неоднократно обсасывалась на куче форумов, но всё же.
Часто бывает такая ситуация, что на работе есть два канала - основной и резервный. Основной всем хорош - и широкий, и стабильный, и как вообще. Но и второй канал тоже неплох и обидно, что пользуется только в экстренных случаях.
Кому интересно, как это дело настроить, прошу.
Исходные данные:
ПК с Gentoo, iptables и ip route
Ну а потом берем скрипт с роутингом и делаем его исполняемым:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
|
#!/bin/bash echo "Preparing routing tables for 2 ISP" # Описываем переменные, используемые в скрипте: IP_LOCAL1="192.168.0.x" #Адрес нашего маршрутизатора в локальной сети. IP_INET1="192.168.1.x" #Адрес нашего маршрутизатора в сети провайдера 1. IP_INET2="192.168.2.x" #Адрес нашего марщрутизатора в сети провайдера 2. IF_LOCAL1="eth1" #Имя интерфейса на локальную сеть. IF_INET1="eth2" #Имя интерфейса на провайдера 1. IF_INET2="eth3" #Имя интерфейса на провайдера 2. NET_LOCAL1="192.168.0.0/24" #Локальная сеть. NET_INET1="192.168.1.0/24" #Адрес сети, в которой гейт провайдера 1. NET_INET2="192.168.2.0/24" #Адрес сети, в которой гейт провайдера 2. GW_INET1="192.168.1.1" #Шлюз провайдера 1. GW_INET2="192.168.2.1" #Шлюз провайдера 2. #Включаем фильтрацию на всех интерфейсах: for interface in /proc/sys/net/ipv4/conf/*/rp_filter do echo "0" > ${interface} done #Создаем новые таблицы маршрутизации: echo "1 T1" >> /etc/iproute2/rt_tables echo "2 T2" >> /etc/iproute2/rt_tables #Настраиваем таблицы маршрутизации: ip route flush table T1 #Обнуляем первую таблицу маршрутов. ip route flush table T2 #Обнуляем вторую таблицу маршрутов. ip rule delete table T1 #Удаляем наши таблицы, если они присутсвуют в текущей конфигурации (вдруг мы просто перезапускаем скрипт?) ip rule delete table T2 #Аналогично для второй. ip rule delete table T1 #И делаем это два раза, так как у нас два правила на каждую таблицу. ip rule delete table T2 #Аналогично для второй. #Заполнение первой таблицы: ip route add $NET_LOCAL1 dev $IF_LOCAL1 src $IP_LOCAL1 table T1 ip route add $NET_INET1 dev $IF_INET1 src $IP_INET1 table T1 ip route replace $NET_INET2 dev $IF_INET2 src $IP_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_LOCAL1 dev $IF_LOCAL1 src $IP_LOCAL1 table T2 ip route add $NET_INET1 dev $IF_INET1 src $IP_INET1 table T2 ip route replace $NET_INET2 dev $IF_INET2 src $IP_INET2 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 replace $NET_INET1 dev $IF_INET1 src $IP_INET1 #Заполняем основную таблицу адресов для сети провайдера 1. ip route replace $NET_INET2 dev $IF_INET2 src $IP_INET2 #Заполняем основную таблицу адресов для сеть провайдера 2. 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 20 table T2 #Все пакеты, которые имеют метку 20, маршрутизировать по таблицу T2. ip route del default ip route add default via $GW_INET1 #Заполняем основную таблицу адресов, устанавливаем дефолтный шлюз. ip route flush cache #Чистим кэш. #Настраиваем распределение трафика: #Очистка таблиц и цепочек: iptables --flush iptables --delete-chain iptables --table nat --flush iptables --table filter --flush iptables --table mangle --flush iptables --table nat --delete-chain iptables --table filter --delete-chain iptables --table mangle --delete-chain #Назначение глобальных политик файервола: iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT iptables -F INPUT iptables -F OUTPUT iptables -F FORWARD #Весь трафик, не описанный ниже, метим меткой 10 (провайдер 1): iptables -t mangle -A PREROUTING -s $NET_LOCAL1 -j MARK --set-mark 10 #Трафик по 3389 (rdp) метим меткой 20 (провайдер 2): iptables -t mangle -A PREROUTING -s $NET_LOCAL1 -p tcp --dport 3389 -j MARK --set-mark 20 #SNAT: iptables -t nat -A POSTROUTING -o $IF_INET1 -j SNAT --to-source $IP_INET1 iptables -t nat -A POSTROUTING -o $IF_INET2 -j SNAT --to-source $IP_INET2 #Исполняем скрипт файерволла: /scripts/firewall.sh echo "Routing OK" exit 0
|
И с файерволлом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
#!/bin/bash echo "Preparing iptables firewall..." # Описываем переменные, используемые в скрипте: IP_LOCAL1="192.168.0.x" #Адрес нашего маршрутизатора в локальной сети. IP_INET1="192.168.1.x" #Адрес нашего маршрутизатора в сети провайдера 1. IP_INET2="192.168.2.x" #Адрес нашего марщрутизатора в сети провайдера 2. IF_LOCAL1="eth1" #Имя интерфейса на локальную сеть. IF_INET1="eth2" #Имя интерфейса на провайдера 1. IF_INET2="eth3" #Имя интерфейса на провайдера 2. NET_LOCAL1="192.168.0.0/24" #Локальная сеть. NET_INET1="192.168.1.0/24" #Адрес сети, в которой гейт провайдера 1. NET_INET2="192.168.2.0/24" #Адрес сети, в которой гейт провайдера 2. GW_INET1="192.168.1.1" #Шлюз провайдера 1. GW_INET2="192.168.2.1" #Шлюз провайдера 2. UNPRIPORTS="1024:65535" #Номера непривилегированных портов #Настраиваем iptables (общие правила и параметры): #Загружаем модули, для корректной работы Active ftp и DCC, которые будут идти через NAT. modprobe ip_nat_ftp modprobe ip_conntrack_ftp #Включаем форвардинг: echo "1" > /proc/sys/net/ipv4/ip_forward #Порты NETBIOS: iptables -A FORWARD -p udp -m multiport --ports 135,136,137,138,139,445 -j ACCEPT #Разрешаем форвард NetBIOS. #Разрешаем все ранее запрошенные/установленные соединения: iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -m state --state NEW ! -i $IF_INET1 -j ACCEPT iptables -A INPUT -m state --state NEW ! -i $IF_INET2 -j ACCEPT iptables -A FORWARD -i $IF_INET1 -o $IF_LOCAL1 -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -i $IF_INET2 -o $IF_LOCAL1 -m state --state ESTABLISHED,RELATED -j ACCEPT #Разрешаем прохождение пакетов по интерфейсу обратной петли: iptables -A INPUT -i lo -j ACCEPT #Разрешаем DNS: iptables -A OUTPUT -p udp -m udp -o $IF_INET1 --dport 53 --sport $UNPRIPORTS -j ACCEPT iptables -A OUTPUT -p tcp -m tcp -o $IF_INET1 --dport 53 --sport $UNPRIPORTS -j ACCEPT iptables -A INPUT -p udp -m udp -i $IF_INET1 --dport $UNPRIPORTS --sport 53 -j ACCEPT iptables -A INPUT -p tcp -m tcp -i $IF_INET1 --dport $UNPRIPORTS --sport 53 -j ACCEPT iptables -A OUTPUT -p udp -m udp -o $IF_INET2 --dport 53 --sport $UNPRIPORTS -j ACCEPT iptables -A OUTPUT -p tcp -m tcp -o $IF_INET2 --dport 53 --sport $UNPRIPORTS -j ACCEPT iptables -A INPUT -p udp -m udp -i $IF_INET2 --dport $UNPRIPORTS --sport 53 -j ACCEPT iptables -A INPUT -p tcp -m tcp -i $IF_INET2 --dport $UNPRIPORTS --sport 53 -j ACCEPT # FTP iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT #PASSIVE FTP iptables -t filter -A INPUT -p tcp -m tcp --dport 50000:50500 -m state --state NEW -j ACCEPT iptables -t filter -A INPUT -p udp -m udp --dport 50000:50500 -m state --state NEW -j ACCEPT #Разрешаем доступ по ssh на внешние интерфейсы только с определенных адресов, с остальных закрываем: iptables -A INPUT -s 192.168.1.x -i $IF_INET1 -p tcp --dport 22 -j ACCEPT iptables -A INPUT -i $IF_INET1 -p tcp --dport 22 -j DROP iptables -A INPUT -s 192.168.1.x -i $IF_INET2 -p tcp --dport 22 -j ACCEPT iptables -A INPUT -i $IF_INET2 -p tcp --dport 22 -j DROP #Закрываем известные троянские порты: iptables -A FORWARD -p udp -m multiport --sport 16355,21111,1349,26274,29891,31337,31338,47262 -j DROP iptables -A FORWARD -p tcp -m multiport --sport 555,666,1001,1025,1026,1028,1243,2000,5000,6667,6670,6711 -j DROP iptables -A FORWARD -p tcp -m multiport --sport 6969,7000,12345,21554,22222,27374,29559,31337,31338 -j DROP #Запрещаем часть рекламы (режем известные серверы рекламы): iptables -A FORWARD -j DROP -s 194.67.32.247 iptables -A FORWARD -j REJECT -d 194.67.32.247 iptables -A FORWARD -j DROP -s 81.222.128.0/24 iptables -A FORWARD -j REJECT -d 81.222.128.0/24 iptables -A FORWARD -j DROP -s 80.68.240.245 iptables -A FORWARD -j REJECT -d 80.68.240.245 iptables -A FORWARD -j DROP -s 81.19.80.0/26 iptables -A FORWARD -j REJECT -d 81.19.80.0/26 iptables -A FORWARD -j DROP -s 85.12.15.12 iptables -A FORWARD -j REJECT -d 85.12.15.12 iptables -A FORWARD -j DROP -s 80.68.242.108 iptables -A FORWARD -j REJECT -d 80.68.242.108 iptables -A FORWARD -j DROP -s 88.212.200.101 iptables -A FORWARD -j REJECT -d 88.212.200.101 iptables -A FORWARD -j DROP -s 88.212.200.102 iptables -A FORWARD -j REJECT -d 88.212.200.102 iptables -A FORWARD -j DROP -s 88.212.200.103 iptables -A FORWARD -j REJECT -d 88.212.200.103 iptables -A FORWARD -j DROP -s 88.212.200.104 iptables -A FORWARD -j REJECT -d 88.212.200.104 iptables -A FORWARD -j DROP -s 88.212.200.105 iptables -A FORWARD -j REJECT -d 88.212.200.105 iptables -A FORWARD -j DROP -s 88.212.200.106 iptables -A FORWARD -j REJECT -d 88.212.200.106 iptables -A FORWARD -j DROP -s 88.212.200.107 iptables -A FORWARD -j REJECT -d 88.212.200.107 iptables -A FORWARD -j DROP -s 88.212.200.108 iptables -A FORWARD -j REJECT -d 88.212.200.108 iptables -A FORWARD -j DROP -s 200.124.141.73 iptables -A FORWARD -j REJECT -d 200.124.141.73 iptables -A FORWARD -j DROP -s 213.95.1.55 iptables -A FORWARD -j REJECT -d 213.95.1.55 iptables -A FORWARD -j DROP -s 78.140.139.98 iptables -A FORWARD -j REJECT -d 78.140.139.98 iptables -A FORWARD -j DROP -s 87.98.205.19 iptables -A FORWARD -j REJECT -d 87.98.205.19 iptables -A FORWARD -j DROP -s 91.194.91.210 iptables -A FORWARD -j REJECT -d 91.194.91.210 iptables -A FORWARD -j DROP -s 208.43.125.105 iptables -A FORWARD -j REJECT -d 208.43.125.105 iptables -A FORWARD -j DROP -s 80.93.49.141 iptables -A FORWARD -j REJECT -d 80.93.49.141 iptables -A FORWARD -j DROP -s 80.93.58.59 iptables -A FORWARD -j REJECT -d 80.93.58.59 iptables -A FORWARD -j DROP -s 213.174.137.32 iptables -A FORWARD -j REJECT -d 213.174.137.32 iptables -A FORWARD -j DROP -s 213.174.136.0/24 iptables -A FORWARD -j REJECT -d 213.174.136.0/24 iptables -A FORWARD -j DROP -s 209.160.65.196 iptables -A FORWARD -j REJECT -d 209.160.65.196 iptables -A FORWARD -j DROP -s 83.229.248.167 iptables -A FORWARD -j REJECT -d 83.229.248.167 iptables -A FORWARD -j DROP -s 83.229.249.92 iptables -A FORWARD -j REJECT -d 83.229.249.92 echo "Iptables OK" exit 0
|
В скриптах довольно подробные комментарии, так что надеюсь, что всё понятно :3
И хотелось бы узнать, как это можно поправить/оптимизировать.
Ещё я думаю, что эти серверы не делают запросы на ваш шлюз, поэтому строк с DROP должно быть достаточно.
Не понял насчёт троянских портов. Вы наверное хотите запретить соединения НА определенные порты? Тогда --dport, а не --sport.