Всем привет. решил разобраться в конфигурировании фаервола iptables, т.к он применяется в одной небольшой сети где через сквид раздает инет итд. Но там частенько происходят различного плана глюки и поэтому было принято решение разобраться в некоторых моментах и перенастроить.
Начать я решил с днс форвардинга.
Скажем в случае если фаер настраивается по политике, запрещено все что не разрешено и на всех клиентских компах у меня в роли днс сервера будет прописан маршрутизатор. Достаточно ли для реализации этого iptables ? Может это делается как то иначе ?
1. для серфинга через прокси сервер dns не нужен
2. если все таки нужно раздавать днс то тут два варианта
1) поднимать свой днс сервер (bind, djbdns и др)
2) использовать прозрачный днс сервер (dnsmasq)
что до iptables, то одних "установленных" соединений не достаточно, нужно пускать и "новые" пакеты
по моему лучше сделать так:
iptables -A INPUT -m state --state ESTABLISHED,RELATES -j ACCEPT
потом открывать порты уже буз указания состояния пакета
и советую разобраться какой протокол и для какой цели используется в dns
Всем привет. решил разобраться в конфигурировании фаервола iptables, т.к он применяется в одной небольшой сети где через сквид раздает инет итд. Но там частенько происходят различного плана глюки и поэтому было принято решение разобраться в некоторых моментах и перенастроить.
Начать я решил с днс форвардинга.
Скажем в случае если фаер настраивается по политике, запрещено все что не разрешено и на всех клиентских компах у меня в роли днс сервера будет прописан маршрутизатор. Достаточно ли для реализации этого iptables ? Может это делается как то иначе ?
Для ограничения всего на маршрутизаторе iptables достаточно. Насколько удобно через него делать днс-форвардинг - не знаю. Обычно ставиться промежуточный dns-proxy (можно и кэширующий). Лично я использую pdnsd.
iptables -P FORWARD DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -A OUTPUT -p TCP -d $DNS --dport 53 -j ACCEPT
iptables -A OUTPUT -p UDP -d $DNS --dport 53 -j ACCEPT
iptables -A INPUT -p UDP -s $DNS -m state --state ESTABLISHED --sport 53 -j ACCEPT
Это хмм что? разрешение использовать днс для маршрутизатора? если да то насчет --sport 53 в строке iptables -A INPUT -p UDP -s $DNS -m state --state ESTABLISHED --sport 53 -j ACCEPT не уверен. Я бы просто разрешил уже установленные соединения. Но если вы проверяли и это работает то почему бы и нет. И днс работает через UDP.
и вот дальше у меня вопрос, пользоваться таблицей filter и прописывать форвардинг или же здесь надо исолпьзовать SNAT и DNAT ?
Таблица filter только для фильтрации(т е запрещения и разрешения) - как вы в ней собираетесь форвардинг прописать?(под форвардингом лично я подразумеваю перенаправление пакетов, например действием REDIRECT). Или вы имеете в виду правила для цепочки FORWARD?
Если вы хотите перебрасывать запросы днс от клиентов к провайдеру то надо пользоваться DNAT в цепочке PREROUTING. Но я бы на вашем месте подумал о кэширующем днс.
PS пока писал сообщение уже появилось сообщ от expdot.
1. для серфинга через прокси сервер dns не нужен
2. если все таки нужно раздавать днс то тут два варианта
1) поднимать свой днс сервер (bind, djbdns и др)
2) использовать прозрачный днс сервер (dnsmasq)
что до iptables, то одних "установленных" соединений не достаточно, нужно пускать и "новые" пакеты
по моему лучше сделать так:
iptables -A INPUT -m state --state ESTABLISHED,RELATES -j ACCEPT
потом открывать порты уже буз указания состояния пакета
и советую разобраться какой протокол и для какой цели используется в dns
Для ограничения всего на маршрутизаторе iptables достаточно. Насколько удобно через него делать днс-форвардинг - не знаю. Обычно ставиться промежуточный dns-proxy (можно и кэширующий). Лично я использую pdnsd.
Таблица filter только для фильтрации(т е запрещения и разрешения) - как вы в ней собираетесь форвардинг прописать?(под форвардингом лично я подразумеваю перенаправление пакетов, например действием REDIRECT). Или вы имеете в виду правила для цепочки FORWARD?
да речь шла о цепочке форвард.
Спасибо за ответы, сейчас попробую установить днс сервер, после связать его с правилами.
iptables -P FORWARD DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP
//все пакеты на установку соединения
iptables -A INPUT -p TCP ! --syn -m state --state NEW -j DROP
//из сети принимаю пакеты на днс порт
iptables -a INPUT -p TCP -s $NET -d $SERV --dport 53 -j ACCEPT
iptables -a INPUT -p UDP -s $NET -d $SERV --dport 53 -j ACCEPT
iptables -A OUTPUT -d $NET -j ACCEPT
//разрешить доступ к днс
iptables -A OUTPUT -p TCP -d $DNS_1 --dport 53 -j ACCEPT
iptables -A OUTPUT -p UDP -d $DNS_1 --dport 53 -j ACCEPT
//уже установленные соединения от днс
iptables -A INPUT -s $DNS_1 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -P FORWARD DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP
//все пакеты на установку соединения
iptables -A INPUT -p TCP ! --syn -m state --state NEW -j DROP
//из сети принимаю пакеты на днс порт
iptables -a INPUT -p TCP -s $NET -d $SERV --dport 53 -j ACCEPT
iptables -a INPUT -p UDP -s $NET -d $SERV --dport 53 -j ACCEPT
iptables -A OUTPUT -d $NET -j ACCEPT
//разрешить доступ к днс
iptables -A OUTPUT -p TCP -d $DNS_1 --dport 53 -j ACCEPT
iptables -A OUTPUT -p UDP -d $DNS_1 --dport 53 -j ACCEPT
//уже установленные соединения от днс
iptables -A INPUT -s $DNS_1 -m state --state ESTABLISHED,RELATED -j ACCEPT
вот таким образом работает. все ли я учел?
1. iptables -A INPUT -p TCP ! --syn -m state --state NEW -j DROP - это зачем - у вас же политика DROP
2. DNS в основном по udp работает - хотя в IANA прописано 53 TCP и UDP. Можно оставить а можно tcp выкинуть.
3. iptables -A OUTPUT -d $NET -j ACCEPT - это куда разрешение? Если в ответы в сеть то наверно лучше просто разрешить уже установленные соединения для цепочки OUTPUT - iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
4. Я бы просто разрешил в цепочке INPUT уже установленные соединения а не только от $DNS_1 - iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT - для других правил может пригодиться - не днс единым
1. iptables -A INPUT -p TCP ! --syn -m state --state NEW -j DROP - это зачем - у вас же политика DROP
2. DNS в основном по udp работает - хотя в IANA прописано 53 TCP и UDP. Можно оставить а можно tcp выкинуть.
3. iptables -A OUTPUT -d $NET -j ACCEPT - это куда разрешение?
4. $SERV, $DNS_1 и $NET это что за переменные - хоть скажите что они описывают а то логика до конца не ясна
1. присмотрел это на opennet.ru от применения решил не отказываться, хотя видимо вы правы т.к что она есть что ее нет, ничего не изменяется.
2. согласен, но одна строка не сильно мешает зато есть )
по переменным $net - подсеть офиса 192.168.1.0/24, то бишь все компы кот будут смотреть инет через сервер
$Serv - Ip самого копмьютера
$DNS_1 - Днс сервер (в конечном итоге будет провайдера, пока просто сетевой)
3. следовательно это разрешения на все соединения в внутреннюю сеть.
Вопрос между делом, для squid в iptables надо прописывать какие либо разрешения ?
1. iptables -A INPUT -p TCP ! --syn -m state --state NEW -j DROP - это зачем - у вас же политика DROP
2. DNS в основном по udp работает - хотя в IANA прописано 53 TCP и UDP. Можно оставить а можно tcp выкинуть.
3. iptables -A OUTPUT -d $NET -j ACCEPT - это куда разрешение?
4. $SERV, $DNS_1 и $NET это что за переменные - хоть скажите что они описывают а то логика до конца не ясна
1. присмотрел это на opennet.ru от применения решил не отказываться, хотя видимо вы правы т.к что она есть что ее нет, ничего не изменяется.
2. согласен, но одна строка не сильно мешает зато есть )
по переменным $net - подсеть офиса 192.168.1.0/24, то бишь все компы кот будут смотреть инет через сервер
$Serv - Ip самого копмьютера
$DNS_1 - Днс сервер (в конечном итоге будет провайдера, пока просто сетевой)
3. следовательно это разрешения на все соединения в внутреннюю сеть.
Вопрос между делом, для squid в iptables надо прописывать какие либо разрешения ?
Пока вы писали я изменял свое сообщение - гляньте на новую версию
1. От нее ничего точно не измениться - есть некоторая выгода на ОЧЕНЬ загруженных каналах - сначала читаются все правила в таблице а только потом применяется политика ( если не срабатывает ни одно правило). Если самые распространенные правила поместить сверху то в принципе должно быстрее работать - но это не для мелкой офисной сети.
3. См. отредактированное мое собщение
Для сквида нужно прописывать пока почти все то же самое в принципе.
И не забывайте что $Serv у вас будет разным для внутреннего и внешнего интерфейсов.
dns tcp - это т.н. zone transfer. Когда сервер держит доменное имя. В вашем случае это на сколько я понял не нужно
и вообще не понятно для чего вам dns тем более bind. на мой взгляд это толсто ))
хотя не мне решать. может и пригодится
и еще забыли
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
dns tcp - это т.н. zone transfer. Когда сервер держит доменное имя. В вашем случае это на сколько я понял не нужно
и вообще не понятно для чего вам dns тем более bind. на мой взгляд это толсто ))
хотя не мне решать. может и пригодится
и еще забыли
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -P FORWARD DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP
//все пакеты на установку соединения
iptables -A INPUT -p TCP ! --syn -m state --state NEW -j DROP
//из сети принимаю пакеты на днс порт
iptables -a INPUT -p TCP -s $NET -d $SERV --dport 53 -j ACCEPT
iptables -a INPUT -p UDP -s $NET -d $SERV --dport 53 -j ACCEPT
iptables -a INPUT -p UDP -d $DNS_1 --dport 53 -j ACCEPT
//уже установленные соединения
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
DNS перенаправляет, все ок. запустил сквид, добавил подсеть в http_access. как быть теперь ? открыть доступ на шлюз провайдера для того чтобы инет приходил на сам сервер ?, открыть 3128 порт на входящие ?
dns tcp - это т.н. zone transfer. Когда сервер держит доменное имя. В вашем случае это на сколько я понял не нужно
и вообще не понятно для чего вам dns тем более bind. на мой взгляд это толсто ))
хотя не мне решать. может и пригодится
и еще забыли
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -P FORWARD DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP
//все пакеты на установку соединения
iptables -A INPUT -p TCP ! --syn -m state --state NEW -j DROP
//из сети принимаю пакеты на днс порт
iptables -a INPUT -p TCP -s $NET -d $SERV --dport 53 -j ACCEPT
iptables -a INPUT -p UDP -s $NET -d $SERV --dport 53 -j ACCEPT
iptables -a INPUT -p UDP -d $DNS_1 --dport 53 -j ACCEPT
//уже установленные соединения
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
DNS перенаправляет, все ок. запустил сквид, добавил подсеть в http_access. как быть теперь ? открыть доступ на шлюз провайдера для того чтобы инет приходил на сам сервер ?, открыть 3128 порт на входящие ?
Правило с DROP выкинте - странно смотриться.
Теперь о сквиде. Придеться разрешить исходящие по порту 80 в цепочке OUTPUT и разрешить входящие на порт сквида (3128?) из локальной сети. Это все при условии что разрешены установленные соединения. Т е получим такое
iptables -a OUTPUT -p TCP --dport 80 -j ACCEPT
iptables -a OUTPUT -p TCP --dport 443 -j ACCEPT
iptables -a INPUT -p TCP -s $NET -d $SERV --dport 3128 -j ACCEPT
Конечно не заработает - сквид не ждет пакеты идущие на 80 порт (в заголовках указан порт) - настраивайте прозрачное прксирование если хотите так сделать. Да и зачем вам так делать? какая выгода?
Конечно не заработает - сквид не ждет пакеты идущие на 80 порт (в заголовках указан порт) - настраивайте прозрачное прксирование если хотите так сделать. Да и зачем вам так делать? какая выгода?
все верно идея была такая, открыт 80 порт на него идет пакет а сервер его перенаправляет на 3128 где его встречает сквид.
таким образом я и хотел сделать прозрачный прокси.
наверное не хватило строки - http_port 3128 transparent, не помогло )
все верно идея была такая, открыт 80 порт на него идет пакет а сервер его перенаправляет на 3128 где его встречает сквид.
таким образом я и хотел сделать прозрачный прокси.
наверное не хватило строки - http_port 3128 transparent, не помогло )
Да именно такая строка нужна.
Смотрите что в логах сквида - может он не пущает. Лупбэк разрешили? Приведите полную конфигу ваших правил iptables на текущий момент и конфиг сквида тоже.
iptables -F
iptables -t nat -F
iptables -P FORWARD DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP
DNS_1="192.168.1.70"
NET="192.168.1.0/24"
SERV="192.168.1.250"
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
//из сети принимаю пакеты на днс порт
iptables -A INPUT -p TCP -s $NET -d $SERV --dport 53 -j ACCEPT
iptables -A INPUT -p UDP -s $NET -d $SERV --dport 53 -j ACCEPT
iptables -A INPUT -p UDP -d $DNS_1 --dport 53 -j ACCEPT
//squid
iptables -A INPUT -p TCP -s $NET -d $SERV --dport 3128 -j ACCEPT
iptables -A INPUT -p TCP -s $NET -d $SERV --dport 80 -j ACCEPT
iptables -A INPUT -p TCP -s $NET -d $SERV --dport 443 -j ACCEPT
//v inet
iptables -A OUTPUT -p TCP --dport 80 -j ACCEPT
iptables -A OUTPUT -p TCP --dport 443 -j ACCEPT
//уже установленные соединения
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A PREROUTING -p TCP -s $NET -d $SERV --dport 80 -j REDIRECT --to-port 3128
что касается сквид, я им не заморачивался т.к пока делал тока сам факт раздачи инета, т.е я в конфе по умолчанию прописал visible_hostname, acl lan 192.168.1.0/24,http_access allow lan и transparent
iptables -F
iptables -t nat -F
iptables -P FORWARD DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP
DNS_1="192.168.1.70"
NET="192.168.1.0/24"
SERV="192.168.1.250"
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
//из сети принимаю пакеты на днс порт
iptables -A INPUT -p TCP -s $NET -d $SERV --dport 53 -j ACCEPT
iptables -A INPUT -p UDP -s $NET -d $SERV --dport 53 -j ACCEPT
iptables -A INPUT -p UDP -d $DNS_1 --dport 53 -j ACCEPT
//squid
iptables -A INPUT -p TCP -s $NET -d $SERV --dport 3128 -j ACCEPT
iptables -A INPUT -p TCP -s $NET -d $SERV --dport 80 -j ACCEPT
iptables -A INPUT -p TCP -s $NET -d $SERV --dport 443 -j ACCEPT
//v inet
iptables -A OUTPUT -p TCP --dport 80 -j ACCEPT
iptables -A OUTPUT -p TCP --dport 443 -j ACCEPT
//уже установленные соединения
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A PREROUTING -p TCP -s $NET -d $SERV --dport 80 -j REDIRECT --to-port 3128
что касается сквид, я им не заморачивался т.к пока делал тока сам факт раздачи инета, т.е я в конфе по умолчанию прописал visible_hostname, acl lan 192.168.1.0/24,http_access allow lan и transparent
iptables -A INPUT -p UDP -d $DNS_1 --dport 53 -j ACCEPT - это как? Вы разрешаете входящие пакеты на адрес днс провайдера? здесь наверно надо OUTPUT а не INPUT или не -d а -s.
В конфу сквида добавить это -
access_log /var/log/squid/access.log squid
и смотреть в /var/log/squid/access.log что поисходит
iptables -A INPUT -p UDP -d $DNS_1 --dport 53 -j ACCEPT - это как? Вы разрешаете входящие пакеты на адрес днс провайдера? здесь наверно надо OUTPUT а не INPUT или не -d а -s.
да здесь output копировал с другой строки ошибся. логи ведуться, я пока не совсем понял как их анализировать, сейчас буду разбираться
по поводу iptables - могу еще посоветовать засунуть все это в нормальный скрипт - вот тут я указывал набросок - Маршрутизация
И еще - константы объявляются обычно наверху скрипта - а не внутри его.
есть подозрения что пакеты не доходят, т.к в access логе я вижу тока коннекты аськи в которой прописан 3128, а браузер просто показывает что страница недоступна. НО запросил яндекс и его подгрузило из кэша.
есть подозрения что пакеты не доходят, т.к в access логе я вижу тока коннекты аськи в которой прописан 3128, а браузер просто показывает что страница недоступна. НО запросил яндекс и его подгрузило из кэша.
Запросили яндекс с клиента? т е пакеты от клиентов до сквида доходят?
если нет то попробуйте так - iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
где eth0 замените на имя своего интерфейса в локальную сеть.
А внимательнее на свое правило посмотрите -
iptables -t nat -A PREROUTING -p TCP -s $NET -d $SERV --dport 80 -j REDIRECT --to-port 3128
Вы перенаправляете пакеты которые идут с локальной сети($NET) на ваш сервер ($SERV) по 80 порту. Но они идут не на ваш сервер по 80 порту - они о нем ничего не знают, они в интернет идут (т е их адрес назначения не $SERV а какой нить 93.158.134.8 - www.ya.ru). А ваш сервер их просто перехватывает - но так как адрес назначения не совпадает то он их согласно политике дропает.
В моем же правиле ловятся пакеты идущие на интерфейс смотрящий в локальную сеть - что соотв истине.
А внимательнее на свое правило посмотрите -
iptables -t nat -A PREROUTING -p TCP -s $NET -d $SERV --dport 80 -j REDIRECT --to-port 3128
Вы перенаправляете пакеты которые идут с локальной сети($NET) на ваш сервер ($SERV) по 80 порту. Но они идут не на ваш сервер по 80 порту - они о нем ничего не знают, они в интернет идут (т е их адрес назначения не $SERV а какой нить 93.158.134.8 - www.ya.ru). А ваш сервер их просто перехватывает - но так как адрес назначения не совпадает то он их согласно политике дропает.
В моем же правиле ловятся пакеты идущие на интерфейс смотрящий в локальную сеть - что соотв истине.
интересное замечание, спасибо. Теперь хочу попробовать настроить почту, дело в том что например с гуглом периодический были проблемы при получении писем, хочу проверить как это будет при таких настройках фаерволла.
как я понимаю мне надо добавтьб правило на входящие подключения из сети на порты почты (110,995,587,25) а также исходящие от сервера в инет
как я понимаю мне надо добавтьб правило на входящие подключения из сети на порты почты (110,995,587,25) а также исходящие от сервера в инет
Не так - вам надо разрешить доступ по портам назначения 25,110 и тд из локальной сети в инет - это все пойдет через цепочку FORWARD. Например так -
iptables -A FORWARD -p TCP -s $NET --dport 25 -j ACCEPT
iptables -A FORWARD -p TCP -s $NET --dport 110 -j ACCEPT
...
как я понимаю мне надо добавтьб правило на входящие подключения из сети на порты почты (110,995,587,25) а также исходящие от сервера в инет
Не так - вам надо разрешить доступ по портам назначения 25,110 и тд из локальной сети в инет - это все пойдет через цепочку FORWARD. Например так -
iptables -A FORWARD -p TCP -s $NET --dport 25 -j ACCEPT
iptables -A FORWARD -p TCP -s $NET --dport 110 -j ACCEPT
...
т.е такой прописи достаточно для 25 и 110 портов и мне не надо для них же прописывать правила в цепочках input, output ?
т.е такой прописи достаточно для 25 и 110 портов и мне не надо для них же прописывать правила в цепочках input, output ?
Хмм - вы ман то читали? - Руководство по Iptables
Почитайте и посмотрите как идут транзитные(т е не предназначенные приложениям на сервере) пакеты. Там картинка еще такая хорошая есть - я себе на первое время ее даже распечатывал - пока не выучил
Честно говоря неоднократно планировал засесть за эту статью, но вот так монотонно ее читать не получается ) хотя желание было, как показывает время на практике быстрее получается, особенно когда есть у кого спросить ок картинку посмотрю, распечатаю ) но вот найти там ответ на какой то вопрос или почему что либо глючит как то неудавалось
Честно говоря неоднократно планировал засесть за эту статью, но вот так монотонно ее читать не получается ) хотя желание было, как показывает время на практике быстрее получается, особенно когда есть у кого спросить ок картинку посмотрю, распечатаю ) но вот найти там ответ на какой то вопрос или почему что либо глючит как то неудавалось