Группа IP адресов при составления правил в IPTABLES NAT

Статья обновлена 12 января 2014г.

Существует компьютерная сеть офиса. На шлюзе стоит ОС Linux Fedora, ядро версии 2.6.39, NAT, заворот web портов на squid(прозрачно).

В рабеоте требуются несколько сайтов написанных полностью на java. Открытие этих сайтов с использованием squid вызывает некорректную их работу, причем в логах это никак не описывается. Все нормально и ппц… После копания в дебрях интернета и обсуждения на форумах мной было принято решение просто исключить данные сайты из заворота на squid. И тут возникла другая проблема: сайты имеют разные IP и перечислить их в правеле заворота стандартными методами невозможно. Еслибы это были цепочки INPUT, OUTPUT, FORWARD то эти сайты можно прописать в разных строчках. Но только не в таблице NAT.

Задача такая, найти способ ввода нескольких ip в одно правило NAT. (Пример: iptables -t nat -A PREROUTING -s 192.168.0.0/24 ! -d (1.1.1.1,2.2.2.2,3.3.3.3 и т.д.) -p tcp —dport 80 -j REDIRECT —to-ports 3128 ).


Для этого подходит несколько методов 1) использование коммерческой программы — отпадает из-за дороговизны; 2) отключить заворот на squid — неподходит, нужно смотреть чем занимается Иванов в рабочее время; 3)Использовать ipset

Существует 2 способа установки: 1) сборки из исходников; 2) установка из репозиториев yum

1 способ.

Для этого нам понадобится ядро, iptables, ipset

Ядро нужно собирать самому, скачиваем c kernel.org последнее ядро ветки 2.6.х [последнее на момент написания статьи]

ipset скачиваем отсюда http://ipset.netfilter.org/install.html

iptables скачиваем отсюда http://ftp.netfilter.org/pub/iptables/

Мной использовались ядро 2.6.39.1, iptables 1.4.11.1, ipset 6.7 версий. На тот момент самые новые.

Как собирать и насраивать ядро в этой статье не описывается. Возможно статья появиться позднее, а пока ищите в интернете таких статей полно.

И так скачав и и установив ядро перезагружаем систему с использованием нового ядра. Войдя в систему и написав uname -r должны увидеть ответ 2.6.39.1-mist.fc14 или другую версию ядра которую вы собирали. Если надпись такая то значит вы все сделали правильно и ваше ядро запустилось и работает нормально.

Следующий этап это установка новой версии iptables.

wget http://ftp.netfilter.org/pub/iptables/iptables-1.4.11.1.tar.bz2
tar jxvf iptables-1.4.11.1.tar.bz2
cd iptables-1.4.11.1
./configure --prefix=/
make && make install

Все с установкой iptables покончено. Приступаем к установке ipset.

wget http://ipset.netfilter.org/ipset-6.9.tar.bz2
tar jxvf ipset-6.9.tar.bz2
cd ipset-6.9
./autogen.sh
./configure --prefix=/
make && make modules
make install && make modules_install

Все перегружаемся.

2 сопособ

Если у вас ядро версии 3.1.x и выше сборку модуля ipset можно сразу пропустить, т.к. он уже есть в ядре. нужно только установить программу управления модулем.

yum -y install ipset

Также хочу отметить что в системе CentOS c версии 6.2 модуль ipset уже включен в ядро по умолчанию хоть оно и версии 2.6.32. Поэтому нужно просто установить соответствующую программу.

На этом этапе различия закончились, и написанное далее относится к управлению модулем.

Теперь создаем правила ipset

ipset -N NET88_68 nethash     -- создаем переменную
ipset -A NET88_68 1.1.1.1/32  -- вводим ip наших сайтов
ipset -A NET88_68 2.2.2.2/32
ipset -A NET88_68 3.3.3.3/32

Добавляем правило в таблицу NAT.

iptables -t nat -A PREROUTING -m set -s 192.168.0.0/24 ! —match-set NET88_68 dst -p tcp -m tcp —dport 80 -j REDIRECT —to-ports 3128

Главные параметры -m set и [!] —match-set NET88_68 src,dst. При указании src проверяются ip на входящие подключения, при dst исходящие. В моем случае написано что все подключения из сети 192.168.0.0/24 на все ip кроме указанных в переменной NET88_68 ( ! —match-set NET88_68 dst ) будут заворачиваться на squid.

Вот и все. Записываем правила в исполняемые файлы и запускаем при старте системы. Незабываем про порядок, сначала ipset потом iptables.

Оставьте комментарий