Статья обновлена 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.