Есть сервер FreeBSD 6.4, на нем крутяться игровые сервера, меня интересует как открыть порты для игровых серверов у наружнего интерфейса.Я по-разному пробовал, честно говоря уже теряюсь в догадках, 3 дня раскуривал сабж на разных сайтах, смотрел faq.
Привожу вывод sockstat (только интересующие демоны):csuser hlds_i686 1203 4 udp4 *:27015 *:*
csuser hlds_i686 1203 9 udp4 10.0.39.201:26900 *:*
csuser hlds_i686 1202 4 udp4 *:27015 *:*
csuser hlds_i686 1202 9 udp4 10.0.39.201:26900 *:*
csuser hlds_i686 1167 4 udp4 *:27015 *:*
csuser hlds_i686 1167 9 udp4 10.0.39.201:26900 *:*
quake r1q2ded 1144 6 udp4 *:27910 *:*
quake q3ded 1141 39 udp4 *:27962 *:*
quake q3ded 1138 39 udp4 *:27961 *:*
quake q3ded 1135 39 udp4 *:27960 *:*Привожу pf.conf с комментариями:
# Перва сетевая карта Локалка (192.168.130.201)
int_if="vr0"# Вторая сетевая карта Мир (10.0.39.201)
ext_if="xl0"# LAN (локальная сеть)
lan_net="{ 192.168.130.0/24 }"# Таблица для доступа к Внешним MTA
mail="{ 192.168.130.170, 192.168.130.171, 192.168.130.172, 192.168.130.173,
192.168.130.174, 192.168.130.175, 192.168.130.176, 192.168.130.177, 192.168.130.178,
192.168.130.179, 192.168.130.180 }"NoRouteIPs = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, \
10.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, 0.0.0.0/8, 240.0.0.0/4 }"# Определяем политику при блокировке пакетов
set block-policy drop# Поведение пакетного фильтра при использовании таблицы состояний
set state-policy floating
# Логируемый интерфейс
set loginterface $ext_if# Максимальное количество записей в пуле отвечающем за нормализацию трафика (scrub)
# Максимальное количество вхождений в пул отвечающий за состояние таблицы состояний соединений (keep state)
set limit { frags 100000, states 100000 }
# Устанавливаем тип оптимизации
set optimization normal# Игнорируем фильтрацию на кольцевом интерфейсе
set skip on lo0# Нормализуем входящий трафик
scrub in all# Открытые порты 25 и 110 для таблицы mail
nat pass on $ext_if from $mail to any port 25 -> $ext_if
nat pass on $ext_if from $mail to any port 110 -> $ext_if# Защита от спуфинга
antispoof quick for { lo0, $int_if, $ext_if }pass in quick on $int_if from $lan_net to any
pass out quick on $int_if from self to $lan_netpass out quick on $ext_if from self to any keep state
#block in on $ext_if from any to any
block in all
# те, кто ломится на внешний интерфейс с левыми адресами
#block drop in log quick on $ext_if from $NoRouteIPs to any# умников, которые лезут на внутренний интерфейс с любых сетей
# отличных от 192.168.130.0/24
block drop in log quick on $int_if from !$int_if:network to any# пишем тех, кто ломится к нам на 25 порт. Облегчает работу по
# определению зараженных компов в локальной сети
block drop in log quick on { $int_if, $ext_if } proto tcp from any to any port smtp#pass in on $int_if proto tcp from $int_if to any port 80 synproxy state
#------------------------------
# Icoming #
#------------------------------
# Разрешаем входящий ssh
pass in log on $int_if proto tcp from any to $int_if port 22 flags S/SA synproxy state# Разрешаем входящий www трафик
pass in on $ext_if proto tcp from any to $ext_if port 80 flags S/SA synproxy state# Разрешаем входящий ftp трафик
pass in quick on $ext_if proto tcp from any to any port {20,21} keep state
#Правило хз почему не работает
pass in on $ext_if proto tcp from any to $ext_if port ssh synproxy state
# Открываем доступ к Quake 2 серверу снаружи, но правило не катит
pass in on $ext_if proto udp from any to any port 27910 keep state
#Конец конфигаТак же пробовал писать для открытия порта методом проброса(глупо конечно,но от отчаяния):
rdr on $ext_if inet proto udp from any to $ext_if port 27910 -> $int_ifПробовал, но тоже не катит:
pass in on $ext_if proto udp from any to any port 27910 synproxy state
-------------------------------------------------------------------------
Хочу в конце добавить, что все правила проходят синтаксический контроль pf.Мне все-таки хочется открыть доступ к серверам кваки 2,3 и КС на внешней сетевой карте, которая:
# Вторая сетевая карта Мир (10.0.39.201)
ext_if="xl0"
Ребят, подскажите как правильно это сделать?P.S. С апачем долго возился, но победил, правило все-таки работает:
pass in on $ext_if proto tcp from any to $ext_if port 80 flags S/SA synproxy state
а если на время разрешить все входящие - работает?
и попробуйте не использовать self
Дело было не в бобине...
Для начала как все соединено:Internet
|
Сервер FreeBSD------Роутер------Моя машинка
| |
| |
| |
-------------------------------------
# LAN #
-------------------------------------Я сначала просто забыл о том, что при подключении к роутеру все машины друг от друга отделяются.Потом чтобы вчистую проверить внешний интерфейс сервака я соединил напрямую свой комп с сервером фришки, у себя выставил IP из сети 10.0.39., немного переписал правила - и все заработало! Привожу последний рабочий конфиг:
# Перва сетевая карта Локалка (192.168.130.201)
int_if="vr0"# Вторая сетевая карта Мир (10.0.39.201)
ext_if="xl0"# LAN (локальная сеть)
lan_net="{ 192.168.130.0/24 }"# Таблица для доступа к Внешним MTA
mail="{ 192.168.130.170, 192.168.130.171, 192.168.130.172, 192.168.130.173,
192.168.130.174, 192.168.130.175, 192.168.130.176, 192.168.130.177, 192.168.130.178,
192.168.130.179, 192.168.130.180 }"NoRouteIPs = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, \
10.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, 0.0.0.0/8, 240.0.0.0/4 }"# Определяем политику при блокировке пакетов
set block-policy drop# Поведение пакетного фильтра при использовании таблицы состояний
set state-policy floating
# Логируемый интерфейс
set loginterface $ext_if# Максимальное количество записей в пуле отвечающем за нормализацию трафика (scrub)
# Максимальное количество вхождений в пул отвечающий за состояние таблицы состояний соединений (keep state)
set limit { frags 100000, states 100000 }
# Устанавливаем тип оптимизации
set optimization normal# Игнорируем фильтрацию на кольцевом интерфейсе
set skip on lo0# Нормализуем входящий трафик
scrub in all# Открытые порты 25 и 110 для таблицы mail
nat pass on $ext_if from $mail to any port 25 -> $ext_if
nat pass on $ext_if from $mail to any port 110 -> $ext_if# Защита от спуфинга
antispoof quick for { lo0, $int_if, $ext_if }pass in quick on $int_if from $lan_net to any
pass out quick on $int_if from self to $lan_netpass out quick on $ext_if from self to any keep state
#block in on $ext_if from any to any
block all
# те, кто ломится на внешний интерфейс с левыми адресами
#block drop in log quick on $ext_if from $NoRouteIPs to any# умников, которые лезут на внутренний интерфейс с любых сетей
# отличных от 192.168.130.0/24
block drop in log quick on $int_if from !$int_if:network to any# пишем тех, кто ломится к нам на 25 порт. Облегчает работу по
# определению зараженных компов в локальной сети
block drop in log quick on { $int_if, $ext_if } proto tcp from any to any port smtp#pass in on $int_if proto tcp from $int_if to any port 80 synproxy state
#------------------------------
# Icoming #
#------------------------------
# Разрешаем входящий ssh
pass in log on $int_if proto tcp from any to $int_if port 22 flags S/SA synproxy state# Разрешаем входящий www трафик
pass in on $ext_if proto tcp from any to $ext_if port 80 flags S/SA synproxy state# Разрешаем входящий ftp трафик
#pass in on $ext_if proto tcp from any to $ext_if port 21 synproxy state
pass in on $ext_if proto tcp to port 21 synproxy state
pass in on $ext_if proto tcp to port > 49151# Разрешаем входящий ssh
pass in on $ext_if proto tcp from any to $ext_if port ssh synproxy state# Разрешаем входящий трафик Quake 2
pass in on $ext_if proto udp from any to $ext_if port 27910 synproxy state# Разрешаем входящий трафик Quake 3 (3 сервера)
pass in on $ext_if proto udp from any to $ext_if port 27960 synproxy state
pass in on $ext_if proto udp from any to $ext_if port 27961 synproxy state
pass in on $ext_if proto udp from any to $ext_if port 27962 synproxy state# Разрешаем входящий трафик Counter-Strike Server
pass in on $ext_if proto udp from any to $ext_if port 27015 synproxy state--------------------------------------------------------------------------------
Потом конечно сервер с фришкой воткнул обратно в роутер и со своей машинки уже не могу попасть на сервер по внешнему интерфейсу,так и должно быть. Благодарю за ответ!Правила подкрутил, политику выбрал более жесткую - блочить все.
Еще несколько глупых вопросов. При таком конфиге насколько безопасен сервер? Могут ли взломав его порыться в локалке? Могул ли вообще добраться до локалки, когда она находится за двойной защитой - роутер и сервер с фрей? Что еще посоветуете для улучшения безопасности?
P.S. Nmap'ом сканировал, результатом в целом доволен, но подозреваю что этого все же недостаточно, хочется чтобы все было в порядке. Заранее спасибо.
>[оверквотинг удален]
> synproxy state
> pass in on $ext_if proto udp from any to $ext_if port 27962
> synproxy state
> # Разрешаем входящий трафик Counter-Strike Server
> pass in on $ext_if proto udp from any to $ext_if port 27015
> synproxy state
> --------------------------------------------------------------------------------
> Потом конечно сервер с фришкой воткнул обратно в роутер и со своей
> машинки уже не могу попасть на сервер по внешнему интерфейсу,так и
> должно быть. Благодарю за ответ!tcpdump и смортите что от кого приходит и что кому отправляется
> Правила подкрутил, политику выбрал более жесткую - блочить все.
> Еще несколько глупых вопросов. При таком конфиге насколько безопасен сервер? Могут ли
> взломав его порыться в локалке? Могул ли вообще добраться до локалки,
> когда она находится за двойной защитой - роутер и сервер с
> фрей? Что еще посоветуете для улучшения безопасности?если зальют и запустят что-то типа vpn клиента, то ваша локалка будет как на ладоне
так что следите за web и ftp серверами
> P.S. Nmap'ом сканировал, результатом в целом доволен, но подозреваю что этого все
> же недостаточно, хочется чтобы все было в порядке. Заранее спасибо.