aleteya 05.08.2011 10:33

Скрипты на bashLinux + 2 ISP

Эта тема неоднократно обсасывалась на куче форумов, но всё же.
Часто бывает такая ситуация, что на работе есть два канала - основной и резервный. Основной всем хорош - и широкий, и стабильный, и как вообще. Но и второй канал тоже неплох и обидно, что пользуется только в экстренных случаях.
Кому интересно, как это дело настроить, прошу.
Исходные данные:
ПК с 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
И хотелось бы узнать, как это можно поправить/оптимизировать.


Тэги: bash iptables script
+ 7 -
Похожие Поделиться

albibek 05.08.2011 11:30 #
Я бы объявил рекламные серверы в массивчике, а потом уже из массивчика делал бы DROP-REJECT.
Ещё я думаю, что эти серверы не делают запросы на ваш шлюз, поэтому строк с DROP должно быть достаточно.
Не понял насчёт троянских портов. Вы наверное хотите запретить соединения НА определенные порты? Тогда --dport, а не --sport.
aleteya 05.08.2011 11:38 #
Ох, спасибо.
h31 05.08.2011 12:54 #
Я бы объявил рекламные серверы в массивчике, а потом уже из массивчика делал бы DROP-REJECT

А ещё есть ipset.
mealsforall 05.08.2011 15:41 #
Какие такие прыщи?
aleteya 05.08.2011 15:55 #
Линукс же.
mealsforall 05.08.2011 15:57 #
А с чего бы это линукс -- прыщи??
aleteya 05.08.2011 17:21 #
Линукс - красноглазие - прыщи.
exelens 05.08.2011 18:08 #
Убрал прыщи из топика
aleteya 06.08.2011 20:07 #
Как будто что-то плохое.
Astramak 11.08.2011 12:44 #
клерасил :))
ZED 05.08.2011 20:12 #
Это полноценная балансировка трафика?
aleteya 06.08.2011 20:09 #
Вполне.
m912 06.08.2011 22:29 #
Не думаю, тут просто часть юзеров(подсеть) ходит в инет через одного провайдера, остальные через второго.
Балансировкой иное называтется.
aleteya 07.08.2011 05:21 #
На подсети можно и не делить.
flameflower 05.08.2011 23:01 #
Простите, а зачем маркировать пакеты в данном топике не указано, что с ними делается дальше?
aleteya 07.08.2011 05:21 #
Пакеты маркируются для того, чтобы ходить по разным таблицам.
flameflower 07.08.2011 12:55 #
Да, извиняюсь.
Упустил момент, где указали пакетам с какими метками куда ходить.
1
2
ip rule add fwmark 10 table T1			#Все пакеты, которые имеют метку 10, маршрутизировать по таблице T1.
ip rule add fwmark 20 table T2			#Все пакеты, которые имеют метку 20, маршрутизировать по таблицу T2.

flameflower 05.08.2011 23:04 #
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
Не особо понятно предназначение, при
flameflower 05.08.2011 23:07 #
Извиняюсь, миссклик.
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 -P OUTPUT ACCEPT
===
По моему, получается, что правила на исходящие соединения просто не нужны.
===
Поправьте если не прав. :)
aleteya 07.08.2011 05:27 #
Да, косяк.
flameflower 05.08.2011 23:17 #
#Включаем фильтрацию на всех интерфейсах:
for interface in /proc/sys/net/ipv4/conf/*/rp_filter
do
echo "0" > ${interface}
done

Это можно выставить в sysclt, только мы не включаем, а наоборот - отключаем.
aleteya 07.08.2011 05:23 #
Принцип фильтрования в rp_filter:
Если ответ на текущий пакет не может уйти через тот же интерфейс (когда
приходит через один интерфейс, а уходит через другой), пакет отфильтровывается.
flameflower 07.08.2011 12:46 #
Поэтому и отключаем, задавая значение rp_filter в 0. Если значение rp_filter будет = 1 пакет отфильтруется. У вас в скрипте в цикле идет именно отключение фильтрации.
alex 08.08.2011 12:41 #
#Создаем новые таблицы маршрутизации:
echo "1 T1" >> /etc/iproute2/rt_tables
echo "2 T2" >> /etc/iproute2/rt_tables

мне кажется, или со временем в "/etc/iproute2/rt_tables" будем иметь кучу строк:
1 T1
2 T2
1 T1
2 T2
flameflower 08.08.2011 20:20 #
Так и будет.
aleteya 09.08.2011 11:04 #
Вполне очевидно, что после первого прохода скрипта эти строки нужно удалить.
manki 23.08.2011 17:11 #
а как при данных настройках будет вести себя почта (прием/отправка) и RDP, оно в кэш iproute2 не забъется? спасибо
aleteya 24.08.2011 11:47 #
С почтой не проверялось, мне нужен был только RDP. Маршруты кэшируются, и никуда от этого не денешься. Но их можно же чистить :3