Пошаговое конфигурирование iptables

в среде LINUX

=> Форум технической поддержки <=


Кому нужно описание поумней, то идите сюда Iptables Tutorial 1.1.14

Или сюда Iptables Tutorial 1.1.19

Или сюда Iptables Tutorial 1.2.0

Кому нужно описание породии на iptables под Windows, то идите то сюда

Содержание:

Введение. "Облегчим себе жизнь"

Введение. "Немного теории"

"Мы пойдём простым, самым надёжным, путём"

"Допустим у Вас MAIL-сервер"

"Укажем диапозон IP-адресов"

"Укажем, кроме, диапозона IP-адресов"

"Добавим подмену IP адресов (маскарадинг)"

"Рассмотрим цепочку FORWARD"

Пример 1. "Цепочка FORWARD, шлюзование всех внутренних IP (локальная сеть) на все внешние IP (сеть интернет)"

Пример 2. "Допустим у Вас FTP-сервер"

Пример 3. "Редирект по портам"

Введение.

"Облегчим себе жизнь"

Начнём с того, что автоматизируем конфигурирование этой службы.

Для этого создадим каталог iptables-restore по пути /usr/local/

В этот каталог копируем файл demo т.е. по пути /usr/local/iptables-restore/ копируем файл demo

Далее изменяем файл /etc/rc.d/rc.local, т.е. дописываем в конце этого файла:

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

/sbin/iptables-restore /usr/local/iptables-restore/demo

Поспе перезагрузки применятся правила прописанные в файле demo

А этот файл (demo), сконфигурирован на блокирование прямого шлюзования из локальной сети (подключенную к eth1) во внешнию сеть и обратно, из интернет (подключен к eth0) все порты закрыты, закоментированы "Цепочка FORWARD - шлюзование всех внутренних IP (локальная сеть) на все внешние IP (сеть интернет) и обратно"

Что бы по многу не перегружаться, можно просто стирать и применять конфигурацию из файла demo в реальном времени:

1. Стираем все цепочки командами:

iptables -F

iptables -t nat -F

2. Применяем конфигурацию из файла demo:

iptables-restore /usr/local/iptables-restore/demo

3. Проверям цепочки:

iptables -L -n

iptables -t nat -L -n

4. Сохраняем текущую конфигурацию:

iptables-save > /путь/файл

посмотреть текущию конфигурацию, в консоли, перед сохранением:

iptables-save

Если не нравится, то изменяем файл demo и переходим обратно к пункту 1, до тех пор пока всё не будет вас устраивать.


"Немного теории"

А теперь рассмотрим порядок движения пакета, предназначенного локальному процессу/приложению:

Для локального приложения

Шаг Таблица Цепочка Примечание
1     Кабель (т.е. Интернет)
2     Входной сетевой интерфейс (например, eth0)
3 mangle PREROUTING Обычно используется для внесения изменений в заголовок пакета, например для установки битов TOS и пр.
4 nat PREROUTING Преобразование адресов (Destination Network Address Translation). Фильтрация пакетов здесь допускается только в исключительных случаях.
5     Принятие решения о маршрутизации.
6 mangle INPUT Пакет попадает в цепочку INPUT таблицы mangle. Здесь внесятся изменения в заголовок пакета перед тем как он будет передан локальному приложению.
7 filter INPUT Здесь производится фильтрация входящего трафика. Помните, что все входящие пакеты, адресованные нам, проходят через эту цепочку, независимо от того с какого интерфейса они поступили.
8     Локальный процесс/приложение (т.е., программа-сервер или программа-клиент)

Важно помнить, что на этот раз пакеты идут через цепочку INPUT, а не через FORWARD.

Порядок движения пакетов, созданных локальными процессами.

От локальных процессов

Шаг Таблица Цепочка Примечание
1     Локальный процесс (т.е., программа-сервер или программа-клиент).
2     Принятие решения о маршрутизации. Здесь решается куда пойдет пакет дальше -- на какой адрес, через какой сетевой интерфейс и пр.
3 mangle OUTPUT Здесь производится внесение изменений в заголовок пакета. Выполнение фильтрации в этой цепочке может иметь негативные последствия.
4 nat OUTPUT Эта цепочка используется для трансляции сетевых адресов (NAT) в пакетах, исходящих от локальных процессов брандмауэра.
5 Filter OUTPUT Здесь фильтруется исходящий траффик.
6 mangle POSTROUTING Цепочка POSTROUTING таблицы mangle в основном используется для правил, которые должны вносить изменения в заголовок пакета перед тем, как он покинет брандмауэр, но уже после принятия решения о маршрутизации. В эту цепочку попадают все пакеты, как транзитные, так и созданные локальными процессами брандмауэра.
7 nat POSTROUTING Здесь выполняется Source Network Address Translation. Не следует в этой цепочке производить фильтрацию пакетов во избежание нежелательных побочных эффектов. Однако и здесь можно останавливать пакеты, применяя политику по-умолчанию DROP.
8     Сетевой интерфейс (например, eth0)
9     Кабель (т.е., Internet)

Порядок движения транзитных пакетов

Шаг Таблица Цепочка Примечание
1     Кабель (т.е. Интернет)
2     Сетевой интерфейс (например, eth0)
3 mangle PREROUTING Обычно эта цепочка используется для внесения изменений в заголовок пакета, например для изменения битов TOS и пр..
4 nat PREROUTING Эта цепочка используется для трансляции сетевых адресов (Destination Network Address Translation). Source Network Address Translation выполняется позднее, в другой цепочке. Любого рода фильтрация в этой цепочке может производиться только в исключительных случаях
5     Принятие решения о дальнейшей маршрутизации, т.е. в этой точке решается куда пойдет пакет -- локальному приложению или на другой узел сети.
6 mangle FORWARD Далее пакет попадает в цепочку FORWARD таблицы mangle, которая должна использоваться только в исключительных случаях, когда необходимо внести некоторые изменения в заголовок пакета между двумя точками принятия решения о маршрутизации.
7 Filter FORWARD В цепочку FORWARD попадают только те пакеты, которые идут на другой хост Вся фильтрация транзитного трафика должна выполняться здесь. Не забывайте, что через эту цепочку проходит траффик в обоих направлениях, обязательно учитывайте это обстоятельство при написании правил фильтрации.
8 mangle POSTROUTING Эта цепочка предназначена для внесения изменений в заголовок пакета уже после того как принято последнее решение о маршрутизации.
9 nat POSTROUTING Эта цепочка предназначена в первую очередь для Source Network Address Translation. Не используйте ее для фильтрации без особой на то необходимости. Здесь же выполняется и маскарадинг (Masquerading).
10     Выходной сетевой интерфейс (например, eth1).
11     Кабель (пусть будет LAN).

Теперь мы знаем, что есть три различных варианта прохождения пакетов.

1. Из вне на локальную службу (сервер) этого компьютера (INPUT).

2. От локальной службы (сервера) этого компьютера во вне (OUTPUT).

3. Прохождение мимо, шлюзование, мимо этого сетевого интерфейса этого компьютера (FORWARD).

1. "Мы пойдём простым, самым надёжным, путём" (таблица filter):

Допустим ваш компьютер смотрит одним сетевым интерфейсом (eth0, с IP адресом 10.10.10.10) в интернет, а вторым (eth1, с IP 101.101.101.101) в локальную сеть.

1. Защищаемся от "интернет"

-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j LOG --log-level 7 --log-tcp-options

-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j REJECT --reject-with icmp-port-unreachable

-A FORWARD -o eth0 -p tcp -j DROP

Т.е. всё логируем и блокируем. Со стороны интернета (по входу) всё заблокировано. FORWARD по выходу с eth0 заперт.

На этом можно остановиться, если вам не нужно открывать порты для доступа из интернет. (доступ к портам вашего копьютера со стороны "Интернет").


2. Допустим, что у Вас почтовый сервер (открываем доступ к вашему копьютеру со стороны интернет):

-A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT

-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j LOG --log-level 7 --log-tcp-options

-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j REJECT --reject-with icmp-port-unreachable

-A FORWARD -o eth0 -p tcp -j DROP

Заметьте, что 110 порт остаётся запертым. (запрет получения почты со стороны интернет)

Соответственно, если нужно получать почту со стороны интенет с вашего почтового сервера, то:

-A INPUT -i eth0 -p tcp --dport 110 -j ACCEPT

-A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT

-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j LOG --log-level 7 --log-tcp-options

-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j REJECT --reject-with icmp-port-unreachable

-A FORWARD -o eth0 -p tcp -j DROP

Теперь будьте внимательны, вы открыли 110 порт для всех IP адресов со стороны интернета.

Можно ограничить доступ IP адресов на ваш 110 порт. Допустим, что вы точно знаете, что доступ для получения почты (на 110 порт) со стороны интернет будут IP адресов с 100.100.100.110, то:

-A INPUT -s 100.100.100.110 -i eth0 -p tcp --dport 110 -j ACCEPT

-A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT

-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j LOG --log-level 7 --log-tcp-options

-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j REJECT --reject-with icmp-port-unreachable

-A FORWARD -o eth0 -p tcp -j DROP

Теперь допустим, что нужен доступ с ещё одного IP, к примеру с 88.88.88.88, то:

-A INPUT -s 88.88.88.88 -i eth0 -p tcp --dport 110 -j ACCEPT

-A INPUT -s 100.100.100.110 -i eth0 -p tcp --dport 110 -j ACCEPT

-A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT

-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j LOG --log-level 7 --log-tcp-options

-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j REJECT --reject-with icmp-port-unreachable

-A FORWARD -o eth0 -p tcp -j DROP

Или допустим, что нужен доступ с диапазоном IP адресов, к примеру с 88.88.88.0 по 88.88.88.255, то:

-A INPUT -s 88.88.88.0/24 -i eth0 -p tcp --dport 110 -j ACCEPT

-A INPUT -s 100.100.100.110 -i eth0 -p tcp --dport 110 -j ACCEPT

-A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT

-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j LOG --log-level 7 --log-tcp-options

-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j REJECT --reject-with icmp-port-unreachable

-A FORWARD -o eth0 -p tcp -j DROP

Или допустим, что нужен доступ кроме диапазона IP адресов, к примеру кроме с 88.88.88.0 по 88.88.88.255, то:

-A INPUT -s ! 88.88.88.0/24 -i eth0 -p tcp --dport 110 -j ACCEPT

-A INPUT -s 100.100.100.110 -i eth0 -p tcp --dport 110 -j ACCEPT

-A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT

-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j LOG --log-level 7 --log-tcp-options

-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j REJECT --reject-with icmp-port-unreachable

-A FORWARD -o eth0 -p tcp -j DROP

Этого вполне достаточно для почтового сервера. Если нужен доступ к вашему копьютеру со стороны интернет по другим портам, соответственно просто добавляем соответствующий порт путём добавления строки:

-A INPUT -i eth0 -p tcp --dport порт -j ACCEPT

где порт - это номер порта который вы открываете. Но есть условия, открываем порты (добавляем строки input) по входу только перед двумя строками:

-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j LOG --log-level 7 --log-tcp-options

-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j REJECT --reject-with icmp-port-unreachable


3. Теперь добавим подмену IP адресов (маскарадинг). Таблица NAT.

Допустим, что со стороны локальной сети (eth1) вам нужно пустить своих пользователей в интернет (по всем портам), т.е. пропустить от eth1 на eth0 c IP адресом 10.10.10.10, что соответствует IP адресу на интерфейсе eth0. Это будет совершаться в обход кэшируюших служб, к примеру прокси-сервера. Соответственно добавляем строку:

-A POSTROUTING -o eth0 -j SNAT --to-source 10.10.10.10

и что же у нас получилось:

*nat

-A POSTROUTING -o eth0 -j SNAT --to-source 10.10.10.10

COMMIT

*filter

-A INPUT -s 88.88.88.88 -i eth0 -p tcp --dport 110 -j ACCEPT

-A INPUT -s 100.100.100.110 -i eth0 -p tcp --dport 110 -j ACCEPT

-A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT

-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j LOG --log-level 7 --log-tcp-options

-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j REJECT --reject-with icmp-port-unreachable

-A FORWARD -o eth0 -p tcp -j DROP

COMMIT

Но пока подмена локальных IP на внешний пока происходить не будет, т.к. цепочка FORWARD закрыта (-A FORWARD -o eth0 -p tcp -j DROP), см. далее "Рассмотрим цепочку FORWARD"

Что же мы получили POSTROUTING-гом:

В данном случии, по выходу с интерфейса eth0 все локальные IP адреса преобзазуются в один внешний IP адрес 10.10.10.10

Т.е. все компьютеры в локальной сети, как бы, объединяются в один компьютер с одним внешним IP адресом, соответственно получают доступ в интернет по всем портам. (при условии если по цепочке FORWARD будет открыт доступ)

А Если у Вас динамический IP от провайдера (подлючении по протоколу PPPoE), то маскарадинг делается так:

*nat

-A POSTROUTING -o ppp0 -j MASQUERADE

4. Цепочка FORWARD в таблице filter

FORWARD - это то, что мы пропускаем мимо локальных служб (серверов), т.е. организуем шлюз локальной сети во внешнию сеть.

Это можно увидеть наглядно на русунке:












Как видно из нашей конфигурации (см. выше), мы указали:

-A FORWARD -o eth0 -p tcp -j DROP

Мы запретили FORWARD по выходу с интерфейса eth0 для всех портов tcp.

Что мы из этого получили:

Мы не пустим пакеты tcp из интернета в нашу локальную сеть и наоборот из локали в интернет. Т.е. из интернета к нам в локалку никто не попадёт и наоборот из локальной сети, напрямую в интернет никто не попадёт.

Можно сделать в обратном порядке, т.е. что то пропустить, к примеру, определенному пользователю (ip: 88.88.88.88) из интернет (eth0) нужно попасть в Вашу локальную сеть по порту 139:

-A FORWARD -p tcp -d 88.88.88.88 -m tcp --dport 139 -o eth0 -j ACCEPT

-A FORWARD -o eth0 -p tcp -j DROP

А если нужен диапазон, то всё так же, -d 88.88.88.0/24 или исключение диапазона -d ! 88.88.88.0/24

-A FORWARD -p tcp -d ! 88.88.88.0/24 -o eth0 -p tcp -j DROP

Диапазон можно ещё указать так:

-A FORWARD -m iprange --src-range 88.88.88.5-88.88.88.124 -j ACCEPT

-A FORWARD -m iprange --dst-range 10.0.0.0-10.255.255.255 -j ACCEPT

Пример 1. Теперь шлюзование всех внутренних IP на все внешние IP

Допустим, что диапозон локальных IP адресов 168.192.1.1-168.192.1.254, что можно записать так: 168.192.1.0/24

К сетевому интерфейсу eth1 подключена локальная сеть (с диапозоном IP адресов 168.192.1.2-168.192.1.254) и имеет IP 168.192.1.1 с маской подсети 255.255.255.0

В локальной сети компьютеры в свойствах сети, протокола TCP/IP имеют IP адреса в диапозоне 168.192.1.2-168.192.1.254 с маской подсети 255.255.255.0, шлюзом 168.192.1.1 и первичным DNS указан IP адрес DNS вашего провайдера.

Сетевой интерфейс eth0 подключен к внешней сети (интернет), если к интернет другой интерфейс, к примеру ppp0, то в конфиге вместо eth0 указать интерфейс ppp0 (можно ppp+, что означает все интерфейсы ppp).

1. по всем портам будет так:

Код:

-A FORWARD -s 168.192.1.0/24 -i eth1 -j ACCEPT

-A FORWARD -d 168.192.1.0/24 -o eth1 -j ACCEPT

-A FORWARD -o eth0 -p tcp -j DROP

-A FORWARD -o eth1 -p tcp -j DROP

2. по определённому порту (80 порт TCP) так:

Код:

-A FORWARD -s 168.192.1.0/24 -p tcp -m tcp --dport 80 -i eth1 -j ACCEPT

-A FORWARD -d 168.192.1.0/24 -p tcp -m tcp --sport 80 -o eth1 -j ACCEPT

-A FORWARD -o eth0 -p tcp -j DROP

-A FORWARD -o eth1 -p tcp -j DROP

3. А по нескольким определённым TCP портах, так:

Код:

-A FORWARD -s 168.192.1.0/24 -p tcp -m multiport --dports 20,21,25,110 -i eth1 -j ACCEPT

-A FORWARD -d 168.192.1.0/24 -p tcp -m multiport --sports 20,21,25,110 -o eth1 -j ACCEPT

-A FORWARD -o eth0 -p tcp -j DROP

-A FORWARD -o eth1 -p tcp -j DROP

4. И в конечном итоге мы получаем конфиг для IPTABLES:

Код:


*nat

:PREROUTING ACCEPT [0:0]

:POSTROUTING ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

-A POSTROUTING -o eth0 -j MASQUERADE

COMMIT

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j LOG --log-level 7 --log-tcp-options

-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j REJECT --reject-with icmp-port-unreachable

-A FORWARD -s 168.192.1.0/24 -p icmp -i eth1 -j ACCEPT

-A FORWARD -d 168.192.1.0/24 -p icmp -o eth1 -j ACCEPT

-A FORWARD -s 168.192.1.0/24 -p udp -m udp --dport 53 -i eth1 -j ACCEPT

-A FORWARD -d 168.192.1.0/24 -p udp -m udp --sport 53 -o eth1 -j ACCEPT

-A FORWARD -s 168.192.1.0/24 -p tcp -m multiport --dports 20,21,25,80,110,8080 -i eth1 -j ACCEPT

-A FORWARD -d 168.192.1.0/24 -p tcp -m multiport --sports 20,21,25,80,110,8080 -o eth1 -j ACCEPT

-A FORWARD -s 168.192.1.0/24 -p ! icmp -m state --state INVALID -i eth1 -j DROP

-A FORWARD -d 168.192.1.0/24 -p ! icmp -m state --state INVALID -o eth1 -j DROP

-A FORWARD -o eth0 -j DROP

-A FORWARD -o eth1 -j DROP

COMMIT


Что означает:

1. Маскарадинг локальных IP адресов в один внешний.

2. Закрыть доступ для внешних IP адресов (из интернет) на все локальные службы сервера (шлюза).

3. Разрешить, по умолчанию, локальным службам сервера (шлюза) доступ к внешней сети (интернет).

4. Разрешить шлюзование диапозона локальных IP адресов (168.192.1.1-168.192.1.254) на все внешние IP, но только по TCP портам: 20,21,25,80,110,8080 (для транзита HTTP, FTP и Mail протоколов)

5. Разрешить шлюзование диапозона локальных IP адресов (168.192.1.1-168.192.1.254) на все внешние IP, для служебных запросов (для транзита UDP 53 и icmp из локальной сети)

6. Остальное запретить!

Этот конфиг можно скачать здесь

подгрузить конфиг в IPTABLES, в командной строке:

iptables-restore /путь к файлу/demo

Пример 2 "Теперь допустим у Вас FTP-сервер":

Допустим ваш компьютер смотрит одним сетевым интерфейсом (eth0) в интернет, а вторым (eth1) в локальную сеть.

Сейчас нужно вспомнить мануал, а именно:

Трассировка комплексных протоколов Имеется ряд комплексных протоколов, корректная трассировка которых более сложна. Прмером могут служить протоколы ICQ, IRC и FTP. Каждый из этих протоколов несет дополнительную информацию о соединении в области данных пакета. Соответственно корректная трассировка таких соеднений требует подключения дополнительных вспомогательных модулей. В качестве первого примера рассмотрим протокол FTP. Протокол FTP сначала открывает одиночное соединение, которое называется "сеансом управления FTP" (FTP control session). При выполнении команд в пределах этого сеанса, для передачи сопутствующих данных открываются дополнительные порты. Эти соединения могут быть активными или пассивными. При создании активного соединения клент передает FTP серверу номер порта и IP адрес для соединения. Затем клент открывает порт, сервер подключает к заданному порту клиента свой порт с номером 20 (известный как FTP-Data) и передает данные через установленное соединение. Проблема состоит в том, что брандмауэр ничего не знает об этих дополнительных подключениях, поскольку вся информация о них передается через область данных пакета. Из-за этого брандмауэр не позволит серверу соединиться с указанным портом клиента. Решение проблемы состоит в добавлении специального вспомогательного модуля трассировки, который отслеживает, специфичную для данного протокола, информацию в области данных пакетов, передаваемых в рамках сеанса управления. При создании такого соединения, вспомогательный модуль корректно воспримет передаваемую информацию и создаст соответствующую запись в таблице трассировщика со статусом RELATED, благодаря чему соединение будет установлено.Рисунок ниже поясняет порядок выполнения подобного соединения.
















От сюда следует, что нужно добавить две цепочки:

-A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT

-A INPUT -i eth0 -p tcp --dport 21 -j ACCEPT

1. Шарим 21 порт и Защищаемся от "интернет":

*filter

-A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT

-A INPUT -i eth0 -p tcp --dport 21 -j ACCEPT

-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j LOG --log-level 7 --log-tcp-options

-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j REJECT --reject-with icmp-port-unreachable

-A FORWARD -o eth0 -p tcp -j DROP

COMMIT

2. А лучше, так:

*filter

-A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT

-A INPUT -i eth0 -p tcp --dport 21 -j ACCEPT

-A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j REJECT

-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j LOG --log-level 7 --log-tcp-options

-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j REJECT --reject-with icmp-port-unreachable

-A FORWARD -o eth0 -p tcp -j DROP

COMMIT

Если и после этого из интернета нет доступа, до добавте в таблице mangle (таблица mangle стоит перед таблицей filter):

*mangle

:PREROUTING ACCEPT [0:0]

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

:POSTROUTING ACCEPT [0:0]

:outtos - [0:0]

:pretos - [0:0]

-A PREROUTING -j pretos

-A OUTPUT -j outtos

-A outtos -p tcp -m tcp --dport 22 -j TOS --set-tos 0x10

-A outtos -p tcp -m tcp --sport 22 -j TOS --set-tos 0x10

-A outtos -p tcp -m tcp --dport 21 -j TOS --set-tos 0x10

-A outtos -p tcp -m tcp --sport 21 -j TOS --set-tos 0x10

-A outtos -p tcp -m tcp --sport 20 -j TOS --set-tos 0x08

-A outtos -p tcp -m tcp --dport 20 -j TOS --set-tos 0x08

-A pretos -p tcp -m tcp --dport 22 -j TOS --set-tos 0x10

-A pretos -p tcp -m tcp --sport 22 -j TOS --set-tos 0x10

-A pretos -p tcp -m tcp --dport 21 -j TOS --set-tos 0x10

-A pretos -p tcp -m tcp --sport 21 -j TOS --set-tos 0x10

-A pretos -p tcp -m tcp --sport 20 -j TOS --set-tos 0x08

-A pretos -p tcp -m tcp --dport 20 -j TOS --set-tos 0x08

COMMIT

Т.е. конфигурационный файл iptables для FTP-сервера будет выглядеть примерно так:

*mangle

:PREROUTING ACCEPT [0:0]

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

:POSTROUTING ACCEPT [0:0]

:outtos - [0:0]

:pretos - [0:0]

-A PREROUTING -j pretos

-A OUTPUT -j outtos

-A outtos -p tcp -m tcp --dport 22 -j TOS --set-tos 0x10

-A outtos -p tcp -m tcp --sport 22 -j TOS --set-tos 0x10

-A outtos -p tcp -m tcp --dport 21 -j TOS --set-tos 0x10

-A outtos -p tcp -m tcp --sport 21 -j TOS --set-tos 0x10

-A outtos -p tcp -m tcp --sport 20 -j TOS --set-tos 0x08

-A outtos -p tcp -m tcp --dport 20 -j TOS --set-tos 0x08

-A pretos -p tcp -m tcp --dport 22 -j TOS --set-tos 0x10

-A pretos -p tcp -m tcp --sport 22 -j TOS --set-tos 0x10

-A pretos -p tcp -m tcp --dport 21 -j TOS --set-tos 0x10

-A pretos -p tcp -m tcp --sport 21 -j TOS --set-tos 0x10

-A pretos -p tcp -m tcp --sport 20 -j TOS --set-tos 0x08

-A pretos -p tcp -m tcp --dport 20 -j TOS --set-tos 0x08

COMMIT

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

-A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT

-A INPUT -i eth0 -p tcp --dport 21 -j ACCEPT

-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j LOG --log-level 7 --log-tcp-options

-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j REJECT --reject-with icmp-port-unreachable

-A FORWARD -o eth0 -p tcp -j DROP

COMMIT

Пример 3 "Редирект по портам"

Допустим Вам нужно переадресовать с одного порта на другой, к примеру вы хотите сделать редирект с 80 порта на 8080:

*nat

-I PREROUTING -d 10.1.0.20 -p tcp --dport 80 -J DNAT --to-destination 10.1.0.20:8080

-I POSTROUTING -s 10.1.0.20 -o eth0 -p tcp -j SNAT --to-source 10.1.0.20:8080

COMMIT

где 10.1.0.20 ip-адрес web-сервера.

Или просто редирект с одного порта на другой.

*nat

-A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128

Продолжение, следует ... (обновлено 6.11.2006)

=> Форум технической поддержки <=


Рейтинг@Mail.ru