URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 70184
[ Назад ]

Исходное сообщение
"ipfw правила"

Отправлено GHopper , 11-Ноя-06 21:09 
Здравствуйте!
FreeBSD 4.10, natd, ipfw
На манине два интерфейса:
rl0:192.168.0.1 - смотрит во внутреннюю сеть
rl1:172.31.0.153 - смотрит в интернет

Все работает. Пользователи из локальной сети 192.168.0.0/24 могут выйти в интернет через эту машину (прописав ее шлюзом).
Начинаю ковырять:
/etc/rc.conf
firewall_type="open"
Это не есть гуд! Читаю маны, хендбуки... Нужно ставить значение "simple". Отредактировал /etc/rc.firewall, прописал в операторе "case [Ss][Ii][Mm][Pp][Ll][Ee]" адреса из своей сети. Поставил, ребут - болт! При загрузки сендмаил опух (послал его на Ctrl+C), шлюз перестал быть виден из локальной сети.
Решил делать все сам. Начинаю экспериментировать:
ipfw flush
ipfw add 200 divert natd all from any to any via rl1
ipfw add 300 allow ip from any to any
Работает на ура! Только вот если выткнуть rl1, то ssh коннектиться не хочет!? Запрашивает логин и виснет... (коннектюсь из локальной сети на rl0).
Ладно. Переделываю вот так:
ipfw add 100 allow ip from me to any
ipfw add 200 allow ip from any to me
ipfw add 300 allow ip from any to any
коннектюсь по ssh (предварительно вернув rl1 в состояние active), смотрю pifw show и вижу, что правило 300 пропускает пакеты!!! Чешу затылок и не понимаю как они до него доходят, если первые два правила должны полностью удовлетворять весь трафик.

Короче вот такая вот каша у меня! Искал решение в сети - куча всего, но дельного мало. Посоветуйте куда читать, или готовые решения. И откуда у меня берется активность в 300ом правиле. А почему выткнув внешнюю сеть я не могу по ssh приконнектиться к шлюзу из внутренней?


Содержание

Сообщения в этом обсуждении
"ipfw правила"
Отправлено mg , 11-Ноя-06 22:58 
>Здравствуйте!
>FreeBSD 4.10, natd, ipfw
>На манине два интерфейса:
>rl0:192.168.0.1 - смотрит во внутреннюю сеть
>rl1:172.31.0.153 - смотрит в интернет
>
>Все работает. Пользователи из локальной сети 192.168.0.0/24 могут выйти в интернет через
>эту машину (прописав ее шлюзом).
>Начинаю ковырять:
>/etc/rc.conf
>firewall_type="open"
>Это не есть гуд! Читаю маны, хендбуки... Нужно ставить значение "simple". Отредактировал
>/etc/rc.firewall, прописал в операторе "case [Ss][Ii][Mm][Pp][Ll][Ee]" адреса из своей сети. Поставил,
>ребут - болт! При загрузки сендмаил опух (послал его на Ctrl+C),
>шлюз перестал быть виден из локальной сети.
>Решил делать все сам. Начинаю экспериментировать:
>ipfw flush
>ipfw add 200 divert natd all from any to any via rl1
>

>ipfw add 300 allow ip from any to any
>Работает на ура! Только вот если выткнуть rl1, то ssh коннектиться не
>хочет!? Запрашивает логин и виснет... (коннектюсь из локальной сети на rl0).
>
>Ладно. Переделываю вот так:
>ipfw add 100 allow ip from me to any
>ipfw add 200 allow ip from any to me
>ipfw add 300 allow ip from any to any
>коннектюсь по ssh (предварительно вернув rl1 в состояние active), смотрю pifw show
>и вижу, что правило 300 пропускает пакеты!!! Чешу затылок и не
>понимаю как они до него доходят, если первые два правила должны
>полностью удовлетворять весь трафик.
>
>Короче вот такая вот каша у меня! Искал решение в сети -
>куча всего, но дельного мало. Посоветуйте куда читать, или готовые решения.
>И откуда у меня берется активность в 300ом правиле. А почему
>выткнув внешнюю сеть я не могу по ssh приконнектиться к шлюзу
>из внутренней?

Я не понял, ты чего конкретно хочешь, чтоб работало ssh или разяснений почем проходят пакеты?
ssh тормозит скорее всего птому что пытается отрезолвить твой хост и не успечает сработать таймаут по днс срабатывает раньше таймат по ssh. Скорее всего поможет опция в конфиге
фалй sshd.conf
....
UseDNS no

Далее, как насчёт пакетов от внешнего мира к твоей локалке которые генерит твой компьютер, куда они по твоему должны попасть? А загаловок у них такой
адресс назначения: 192.168.0.36
адрес отправителя: 194.87.0.8
куда по твоему должен попасть такой пакет после того ка его создала система? Миновать файрвол не сработав ни на одном правиле?  


"ipfw правила"
Отправлено GHopper , 12-Ноя-06 08:09 
Чего хочу:
1. Почему выткнув rl1 я не могу приконнектиться к шлюзу из локалки??? Ведь rl1 тут вообще не играет никакой роли - это всего-лишь выход в интернет.
2. ipfw add 1 allow tcp from any ssh to any ssh
По этому правилу не передается вообще ни одного покета! Тогда какое нужно правило исключительно для ssh?
3. В наборе правил
ipfw add 100 allow ip from me to any
ipfw add 200 allow ip from any to me
ipfw add 300 allow ip from any to any
правило 300 должно перекрываться первыми двумя и по нему не должны ходить пакеты!!! У меня ходят (при воткнутом rl1 только). Почему так, ведь пакет, найдя удовлетворяющее правило, проходит по нему и больше не обрабатывается барндмауэром.
4. Как учитывать внешний трафик отдельной машины из локальной сети?
5. Встретил в сети слово "pf", которое, якобы, круче чем связка natd+ipfw. Дайте ключевые слова и расскажите в двух словах что это?

"ipfw правила"
Отправлено GHopper , 12-Ноя-06 10:58 
Продолжаю разбираться.
Чего хочу? Хочу поставить брандмауэр в режим запрета всего и самому открывать нужные порты. Мне нужно чтобы внутренняя сеть выходила в интернет через шлюз и чтобы можно было подключиться к шлюзу по ftp и ssh.
Пишу правила
  ipfw flush
  ipfw add 200 deny ip from 192.198.0.0/24 to any in via rl1
  ipfw add 300 divert natd all from 192.168.0.0/24 to any via rl1
  ipfw add 400 divert natd all from any to me via rl1
  ipfw add 500 allow ip from any to any via lo0
  ipfw add 600 allow icmp from any to any
  ipfw add 700 allow udp from any to any
  ipfw add 800 allow ip from me to any
  ipfw add 900 allow tcp from any to me ssh,ftp
Правилом 65535 стоит "deny ip from any to any". Пробую с клиента подключиться по ssh - коннект есть, работает нормально. Пробую по ftp - коннект есть, при выполнении команды list все виснет. Пробую ping www.ya.ru - работет. Пробую в раузере www.ya.ru - болт.
Если добавить
ipfw add 65000 allow from any to any
то все заработает и на правиле 65000 появится трафик. Не хочется мне чтобы у меня в правилах было правило 65000.

Какое правило я упустил из виду???


"ipfw правила"
Отправлено mg , 12-Ноя-06 11:58 
>Продолжаю разбираться.
>Чего хочу? Хочу поставить брандмауэр в режим запрета всего и самому открывать
>нужные порты. Мне нужно чтобы внутренняя сеть выходила в интернет через
>шлюз и чтобы можно было подключиться к шлюзу по ftp и
>ssh.
>Пишу правила
>  ipfw flush
>  ipfw add 200 deny ip from 192.198.0.0/24 to any in
>via rl1
>  ipfw add 300 divert natd all from 192.168.0.0/24 to any
>via rl1
>  ipfw add 400 divert natd all from any to me
>via rl1
>  ipfw add 500 allow ip from any to any via
>lo0
>  ipfw add 600 allow icmp from any to any
>  ipfw add 700 allow udp from any to any
>  ipfw add 800 allow ip from me to any
>  ipfw add 900 allow tcp from any to me ssh,ftp
>
>Правилом 65535 стоит "deny ip from any to any". Пробую с клиента
>подключиться по ssh - коннект есть, работает нормально. Пробую по ftp
>- коннект есть, при выполнении команды list все виснет. Пробую ping
>www.ya.ru - работет. Пробую в раузере www.ya.ru - болт.
>Если добавить
>ipfw add 65000 allow from any to any
>то все заработает и на правиле 65000 появится трафик. Не хочется мне
>чтобы у меня в правилах было правило 65000.
>
>Какое правило я упустил из виду???

Дело в том что иногда (в пасивном режиме) фтп открывает ещё один порт для передачи данных на 20 порту поэтому попробуй так :
ipfw add 900 allow tcp from any to me ssh,ftp,20
Но скорее всего и это тебя не спасёт, так как фтп будет пытаться открыть новое соединение  у клиента а это скорее всего не получится так как надо будет открыть некий случайны порт для передачи данных фтп, а какой - только одному фтп и известно (он его случайным образом генерит). Фтп состоит из двух каналов - кала управления и канал передачи данных. 21 порт - канал управления, через него фтп инициирует открытие другово канала - канала передачи данных. Команды типа list передаются по каналу управления, но для ответа на эту команду нужно открыть канал данных - т.е.. какой-то левый случайный порт. У тебя он не открыт вот оно и подвисает. Так что с фтп будут проблемы говорю сразу.

А ещё было бы неплохо разрешить  естаблишь, на всякий случай
ipfw add 1000 allow tcp from any to any established


"ipfw правила"
Отправлено mg , 12-Ноя-06 11:38 
>Чего хочу:
>1. Почему выткнув rl1 я не могу приконнектиться к шлюзу из локалки???
>Ведь rl1 тут вообще не играет никакой роли - это всего-лишь
>выход в интернет.
>2. ipfw add 1 allow tcp from any ssh to any ssh
>
>По этому правилу не передается вообще ни одного покета! Тогда какое нужно
>правило исключительно для ssh?
>3. В наборе правил
>ipfw add 100 allow ip from me to any
>ipfw add 200 allow ip from any to me
>ipfw add 300 allow ip from any to any
>правило 300 должно перекрываться первыми двумя и по нему не должны ходить
>пакеты!!! У меня ходят (при воткнутом rl1 только). Почему так, ведь
>пакет, найдя удовлетворяющее правило, проходит по нему и больше не обрабатывается
>барндмауэром.
>4. Как учитывать внешний трафик отдельной машины из локальной сети?
>5. Встретил в сети слово "pf", которое, якобы, круче чем связка natd+ipfw.
>Дайте ключевые слова и расскажите в двух словах что это?

По пунктам
1. Выткнув rl1 у тебя скорее всего сбиваются все настройки на интерфейсах, ну не любит BSD когда железо меняют. Ведь меняется там нумерация и смешения в памяти по доступу к устройствам и т.д.... Кароче если что-то изменил в железе то будь добор настраивай всё заново.
2.А ты думаешь что на клиенте тоже ssh порт открывается при соединении? Я тебя разочарую, соект дуплексный но обратный порт очень редко равен порту назначения. А у тебя правило пытается считать именно пакеты которые участвуют в tcp соединении где порт клиента совпадает с портом сервера, что на правктике при соединении ssh вообще никогда не возникает. Не понятно о чём я ? Тогда соединись клиентом по shh на сервер и набери на сервере
sockstat -4
и ты увидишь что порт клиента не shh (т.е. не 22), а какие-то числа больше 1024 . И ещё набери
cat /etc/services | grep ssh
и убедись что у тебя ssh = 22, а так же открой конфиг sshd.conf и убедись что ты не сменил там порт сервера.

3. Ещё раз для тех кто не понимает то что я написал выше. Да по идее должно, но у меня етсть предположение что сервер после того как получил пакет из вне и один раз пропустил его по правилам ipfw пускает его на таблицу маршрутизации где сказано что все пакеты пришедшие из вне нужно переадресовывать локалке (НАТИТЬ во внутрь локалки) поэтому сервер берёт и меняет адрес назначения со своего me, на адрес компьютера в локальной сети, а затем снова пускает его на файрвол, так как это уже новый пакет котрый ipfw ещё не рассматривала но только у этого пакета уже обратный адрес не me а какой-то сайт из вне. Вот пример того что будет происходить при пинге с машины с локальным адресом 192.168.0.36 удалённого хоста 194.87.0.8

Пакет №1 тип ICMP
назначение 194.87.0.8
источник 192.168.0.36
данные

прибыл на шлюз, проходит проверку по ipfw
проверку прошёл на 300 правилу
попал на таблицу маршрутизации сервера и был изменён теперь это

Пакет №36 тип ICMP
назначение 194.87.0.8
источник 172.31.0.153
данные - тунельный пакет от 192.168.0.36

снова прибыл на твой шлюз
заново проходит через ipfw (так как это уже новый пакет созданный самим шлюзом)
проверку прошёл на правиле 100
попал на таблицу маршрутизации и был отправлен посредством изернет кадров с указанием МАК адреса твоего внешнего гетвея , т.е. был отправлен например на 172.31.0.1 без изменения адреса в ip протоколе.

дальше судьбу пакеты мы не знаем...
вдруг в какой-то момент получаем пакет из вне такого вида

Пакет № 37 тип ICMP - эхореквест
назначение  172.31.0.153
источник 194.87.0.8
данные - тунельный пакет для 192.168.0.36

он попадает на ipfw проходит по правилу номер 200
попадает на таблицу маршрутизации где сказано разтунелировать пакет
меняет пакет на следующий
Пакет №2 тип ICMP - эхореквест
назначение  192.168.0.36
источник  194.87.0.8
данные
Заново пускает его на ipfw
проходит по правилу 300
отправляется посредством изернет кадров на мак адрес локальной машины

Всё! Теперь яснее то что я сказал? Хотя это всего лишь моё виденье как всё работает, основанное на том что я читал и с чем имел дело. Может я где-то и нагнал но примерно схема такая.

4. trafd или netams зависит от задачи
5. pf это если я не глючу packet filter под OPEN BSD / Да он новее чем ipfw и по слухам более дружелюбен с natd . Сам с ним дел не имел, поэтому ничего более сказать не могу .
А найти его легко напиши в гугле или яндексе пакетный фильтр pf OpenBSD и тебе там такое море ссылок выползет...


"ipfw правила"
Отправлено GHopper , 12-Ноя-06 18:09 
А можно ли проследить за внешним трафиком отдельной машины через ipfw, поместить эти записи в БД и при исчерпывании отведенных квот закрыть для нее доступ (опять-же через ipfw). Или это нереально??? Какое решение наиболее лучше подходит для данного случая?

"ipfw правила"
Отправлено mg , 12-Ноя-06 18:46 
>А можно ли проследить за внешним трафиком отдельной машины через ipfw, поместить
>эти записи в БД и при исчерпывании отведенных квот закрыть для
>нее доступ (опять-же через ipfw). Или это нереально??? Какое решение наиболее
>лучше подходит для данного случая?


Сам по себе ipfw не считает трафик, но он может перенаправлять трафик в программу для подсчёта трафика. В частности я пользовался Netams (http://www.netams.com/) он умеет как считать так и квотрировать, даже вести денюжный учёт т.е. указываешь ему тариф указываешь сколько денег на счёте и он начинает за каждый мегабайт отнимать стоимость, ну и отрубает когда денег на счёте становится 0 :).
Посоветовать что-то проще, ну например trafd - но мне он не очень понравился, муторно считает и не совсем ясно что именно оно сичтиает, иногда были странные глюки, хотя народ его хвалит. А вообще здесь же на сайте дофига статей про подсчёт трафика и проги котрые этим занимаются...