Sugar 30.06.2010 12:13
Linux Network Administration — Открытие портов на некоторое время
Доброго времени суток, welinux.ruРаботаю сисадмином в некоторой конторе, есть сетка, есть прокси-сервер, он же шлюз, на основе ОС GNU/Linux.
На сервачке всё как положено - весь инет идет через прокси (squid), файрвол настроен, все политики по умолчанию установлены в drop, нескольким машинам открыты нужные им порты. Всё вроде хорошо, маршрутизация настроена, пакетики бегают, юзеры довольны, но есть одно но...
Иногда, а бывает даже и часто, требуется открывать определённые порты определенным хостам. Например ПО какое-нибудь обновить, которое не понимает аутентификации моего прокси, или открыть порт требуется для какой-нибудь машины в сети, или просто что-то протестировать/проверить на клиентской машине, либо вообще временно ей предоставить доступ в инет по всем непривилегированным портам, да и мало ли всякое бывает. При чем так, чтобы открыл, поставил нужное время, и пошел спокойно к той машине свои дела делать, а через время эти порты сами и закрылись.
Так что вот для этой цели и был написан на баше скрипт-обертка для iptables, который я и представляю здешней общественности.
Установка и принцип работы у него простые. Для начала копируем себе скрипт, обзываем его как Вам нравится (у меня это openport.sh), даем права на выполнение, помещаем в любой каталог с исполняемыми файлами (например /usr/bin/), и можем спокойно использовать.
Опции он принимает такие:
open|close - открыть/закрыть порт(ы)-m - подключение расширения iptables "-m multiport"--host $arg - ip машины (можно указать и подсеть в таком виде - 192.168.11.0/24)--port $arg - порт(ы), для такой записи - 1024:2048, опция -m не требуется, а для такой - 22,80,443, требуется--proto $arg - протокол (tcp, udp), для которого требуется открыть порты--sleep $arg - время в минутах, через которое следует закрыть порты, которые вы открыли, игнорируется при действии close.
Далее, если есть аргументы open и --sleep скрипт открывает нужные порты (добываляет нужные правила), а затем уходит в фоновый режим, погружается в сон, затем через опеределенное время просыпается и закрывает открытые до этого порты (удаляет добавленные правила). Как видите, все просто.
Вот сам листинг скрипта:
Например, его можно использовать так:
openport.sh open --host 192.168.0.25 --port 8080 --sleep 25
Т.е. открываем порт 8080 для протокола tcp (т.к. стоит по умолчанию) для хоста 192.168.0.25 на 25 минут.
Почему поместил не в блог "Скрипты", а в "Linux Network Administration"? Отвечаю, задача непосредственно из области администрирования сети, в Linux (да и в UNIX в целом) многие задачи решаются с помощью написания скриптов, поэтому постить в блог "Скрипты", где свалены разношерстные по задачам сценарии, не захотелось. Да и людям, решающим конкретные задачи по сетевому администрирования Linux проще будет найти именно в этом блоге.
В этом скрипте много чего еще можно реализовать, как то: открытие порта из нета к локальной машине, отмена проверки устанговленного соединения (т.е. отменая расширения "-m state"), поддержка протокола icmp и его кодов, и т.д. и т.п.
Замечания и предложения приветствуются.
p.s. При определенном уровне интереса могу запостить скрипт на гитхабе для дальнейшего его развития. Пожелания можно слать на почту sugar.61rus сбк gmail тчк com
dfx 30.06.2010 12:35 #
+ 1 -
Очень полезно, спасибо! Можно, конечно, и самому такое было бы написать, но когда это делают для тебя — вдвойне хорошо :)
Такую штуку можно запихнуть в крон, чтобы все машины сети могли в одно и тоже время обновиться)
Жесть! Вот зачем такое городить?
Используйте SOCKS!
Используйте SOCKS!
Почему писал:
1) Писалось для себя за отсутствием нужного мне функционала, просто решил выложить, может кому пригодится.
2) Интересно.
3) UNIX-way все-таки.
Кстати добрая часть ваших любимых графических настраивалок системы это всего лишь фронтенды к вот таким вот шелловым скриптам.
Немного почитал про этот SOCKS, немного не понял как он в этой ситуации мне поможет.
1) Писалось для себя за отсутствием нужного мне функционала, просто решил выложить, может кому пригодится.
2) Интересно.
3) UNIX-way все-таки.
Кстати добрая часть ваших любимых графических настраивалок системы это всего лишь фронтенды к вот таким вот шелловым скриптам.
Немного почитал про этот SOCKS, немного не понял как он в этой ситуации мне поможет.
Уважаемый, это не UNIX way. Это костыль. SOCKS это управляемая дырка. То есть ставите его, и практически все человеческие приложения умеют его использовать. В общем аналог сквида, только это для любого вида трафика. Логин/Пароль всё поддерживается.
Уважаемый, это не UNIX way. Это костыль.
Уважаемый, зачем так категорично и резко?
Это не костыль, это скрипт. По UNIX way вот, раздел - Майк Ганцарз: Философия UNIX, седьмой пункт.
SOCKS это управляемая дырка. То есть ставите его, и практически все человеческие приложения умеют его использовать.
Я знаю что такое SOCKS, но не все приложения у меня знают, что такое прокси, в итоге порты все равно придется открывать.
Плюс заметка, если ты не заметил, вообще-то не о прокси, а о временном открытии порта на файрволе. У кого-то вообще может не быть прокси, а аутентификация производится по мак-адресу. И тут все рулится iptables'ом.
И раз ты предложил SOCKS, перефразирую свой вопрос: поясни, пожалуйста, как открыть временно порты с помощью этой штуки?
В общем аналог сквида, только это для любого вида трафика. Логин/Пароль всё поддерживается.
Ну понятно, что пароль поддерживается. Только вот по сквиду масса статей по настройке, документации, разлчиные сопутствующие хаутушки. И в любом случае один на один с проблемой не останешься. Да и все-таки сквид очень мощная и надежная сволочь, я уверен, что если мне завтра придется настраивать выход в инет на 300 юзеров, я буду это делать только на сквиде.
зы Нравится SOCKS? Юзай, пожалуйста, мне проще написать скрипт, чем заново все настраивать, так-то. =)
Вы, наверное, не совсем поняли, что говорил предыдуший оратор.
Расскажу на своём примере:
На шлюзе стоит сквид, который прозрачно всё проксирует. Все ненужные порты закрыты.
Также паралельно стоит сокс сервер 3proxy, на который можно завернуть любую программу.
Для запуска программ, которые отказываются работать через соксы, есть замечательна программа соксификатор FreeCap.
Плюс такого решения в том, что в настройках сокс сервера можно явно указать кому и на какой порт через наш сервер можно ходить и пробрасывать абсолютно любой трафик (а не только http и частично ftp).
Расскажу на своём примере:
На шлюзе стоит сквид, который прозрачно всё проксирует. Все ненужные порты закрыты.
Также паралельно стоит сокс сервер 3proxy, на который можно завернуть любую программу.
Для запуска программ, которые отказываются работать через соксы, есть замечательна программа соксификатор FreeCap.
Плюс такого решения в том, что в настройках сокс сервера можно явно указать кому и на какой порт через наш сервер можно ходить и пробрасывать абсолютно любой трафик (а не только http и частично ftp).
Спасибо, интересно.
Кстати, сквид поддерживает метод CONNECT, что расширяет его облась применения помимо протоколов http и ftp.
Кстати, сквид поддерживает метод CONNECT, что расширяет его облась применения помимо протоколов http и ftp.
Я знаю что такое SOCKS, но не все приложения у меня знают, что такое прокси, в итоге порты все равно придется открывать.
а фаерволом весь трафик разве нельзя принудительно заворачивать на прокси ?
Можно, конечно, на прозрачный прокси. Но у меня сквид работает в обычном режиме.
Чего набросились-то на человека? Понятное дело, что если надо постоянно держать открытые(много, а не одно) соединения или если надо ими рулить в больших сетях для большого количества машин, определённо надо ставить SOCKS-сервер. А если раз в три года надо открыть один порт для одной машины, городить из-за этого здоровенный сервак с кучей настроек, имхо, извращение. Лично я использую иhttp, и socks-прокси, но иногда работаю простыми правилами, которые очищаются криптиком в cron.
Набросились от того, что вот это открыть порт по времени, потом закрыть, написать скрипт для этого - это всё косяки. Если случится проблема, или надо будет кого то о чём то попросить, то потом всё это забывается, и трахайся потом как хочешь после такого "горе админа" и такого "Unix way".
Только вот не надо гнать пургу про косяки. И то, что все забывается и вам/еще_кому-то приходится трахаться, то это ваше/чье-то личное, можете об этом написать отдельный пост, а не зудеть здесь высокомерным тоном от имени гуру админских дел.
Автор молодец, задачу решил и не поленился с решением поделиться.
Автор молодец, задачу решил и не поленился с решением поделиться.
То, что он молодец, и хорошо, что выложил скрипт это вне сомнений. Просто не только я но и другие люди подсказали более СТАНДАРТНОЕ решение. В частности: Sov1et , говорит совершенно верно.
А вот всё остальное, что Вы написали голословно. Что я могу, а что нет, это я знаю и сам. Флеймить не надо. Пишите аргументированно пож-та.
А вот всё остальное, что Вы написали голословно. Что я могу, а что нет, это я знаю и сам. Флеймить не надо. Пишите аргументированно пож-та.
Все эти проблемы временных правил решаются так:
В моем дистрибутив (альт), еще и так:
Скрипт просто лежит в бинарниках, и без нужды сам по себе не запускается.
Кстати, проблемы "горе-админов" решаются документацией, та же вики например.
Кстати, Вы так и не ответили на поставленный вопрос.
service iptables restart
В моем дистрибутив (альт), еще и так:
efw restart
Скрипт просто лежит в бинарниках, и без нужды сам по себе не запускается.
Кстати, проблемы "горе-админов" решаются документацией, та же вики например.
Кстати, Вы так и не ответили на поставленный вопрос.
Кстати, Вы так и не ответили на поставленный вопрос.
Про порты? Я конкретно не задавался вопросом проброса конкретных портов. Смотрите почему: Ставим сокс сервер, ставим мониторинг на него, настраиваем LDAP, и прочие пироги там SSL или чего ещё. Берём нужный комп, нужное приложение, выпускаем его через сокс. И не надо мороки с определением портов и так далее.
И да: сам скрипт хороший, повторюсь не очень нравится идея "на время". Ибо это потенциально запутанное действие. - Ещё раз повторяюсь, кто не понял.
o_O
"Эти русские совсем оборзели. У них на полях около Семипалатинска крысы завелись, так они их так вывели, что всему миру три раза аукнулось". (с) Американское народное творчество.
"Эти русские совсем оборзели. У них на полях около Семипалатинска крысы завелись, так они их так вывели, что всему миру три раза аукнулось". (с) Американское народное творчество.
Для того, чтобы быстро протестировать виртуалхост в апаче, отзывающийся на ещё не прописанное в dns регистратора доменное имя, надо поднимать два dns-сервера или можно просто временно прописать соответствующую строку в /etc/hosts? Пример ТС из той же серии.
А документировать свои действия админ по вашему не должен? Я, например, держу для этого отдельный виртуалхост на внутреннем апаче с поднятым движком wikimedia, где те, кому разрешён доступ к серверу в любой момент может посмотреть подробное описание всех настроенных сервисов, всех скриптов и набор типовых действий на случай возникновения проблем. Помимо этого работа организовавается ещё и через redmine, где всегда можно глянуть, какие задачи были поставлены передо мной и как я их решил. А что, в серьёзных организациях такого не делается?
Сейчас я поднимаю такой сервис. Это должно делаться, и это правильно. Но всё же в целом, я считаю, что чем меньше всяких там пользовательских сценариев тем лучше. При том самые важные инструкции необходимо держать и в печатном виде.
Скажите, каким образом доступ к wikimedia разграничиваете? Тупо средствами apache или плугинами какими?
Скажите, каким образом доступ к wikimedia разграничиваете? Тупо средствами apache или плугинами какими?
squid'ом и nginx'ом. :)
У меня прозрачный прокси, в котором идёт разграничение по ip и пользователям, потом идёт проксирующий nginx, который не принимает коннекты ни от куда, кроме адреса прокси, на нём модуль Auth Basic, а он уже в свою очередь проксирует запросы к разным серверам(среди которых и тот, на котором крутится апач с викимедией).
У меня прозрачный прокси, в котором идёт разграничение по ip и пользователям, потом идёт проксирующий nginx, который не принимает коннекты ни от куда, кроме адреса прокси, на нём модуль Auth Basic, а он уже в свою очередь проксирует запросы к разным серверам(среди которых и тот, на котором крутится апач с викимедией).
Вот это очень интересно, спасибо.
Т.о., в общем случае, получается такая вешь: ставим апача с веб-приложением, например вики, назначаем ему порт, отличный от 80, разрешаем к нему доступ только с 127.0.0.1, вешаем енжикса с auth_basic, и в нем уже рулим доступом. Я правильно Вас понял?
Т.о., в общем случае, получается такая вешь: ставим апача с веб-приложением, например вики, назначаем ему порт, отличный от 80, разрешаем к нему доступ только с 127.0.0.1, вешаем енжикса с auth_basic, и в нем уже рулим доступом. Я правильно Вас понял?
Совершенно верно.
И самый класс в таком подходе то, что если у вас появляется ещё один сервер(ну, к примеру, у меня есть хост с кучей виртмашин, на каждой из которых находится отдельный проект) и программистам, чтобы смотреть на проекты я даю не ip-адреса виртмашин, а адрес типа virtual1.companyname.com заведённому в nginx.
И самый класс в таком подходе то, что если у вас появляется ещё один сервер(ну, к примеру, у меня есть хост с кучей виртмашин, на каждой из которых находится отдельный проект) и программистам, чтобы смотреть на проекты я даю не ip-адреса виртмашин, а адрес типа virtual1.companyname.com заведённому в nginx.
А мы вот в google docs пишем. В последней версии очень удобно работать с расшаренными документами.
А на счёт того, что это не локально и всё зависит от интернета -- делаю локальные бэкапы.
А на счёт того, что это не локально и всё зависит от интернета -- делаю локальные бэкапы.
У меня начальство несколько параноидально в плане безопасности и моё предложение попробовать GoogleDocs, GoogleWave и GoogleCode было отклонено по причине "Гугл может стырить наши данные". :))
У iptables есть интересный модуль Time. Позволяет создавать правила включаемые(и выключаемые) в определённое время. Может быть очень полезной штукой, например можно резать торренты на работе только в рабочее время, а ночью нихай качают)