Вобщем что имею:
0. Шлюз - машина с FreeBSD 6.3
1. Есть внутренний интерфейс rl0 и внешний rl1 (белый IP)
2. На внутреннем интерфейсе сидит сетка из 15-20 машин
3. Для доступа к внешней сети клиенты создают VPN-туннель до шлюза, VPN-сервер MPD
4. Авторизация и учет трафика клиентов на совести FreeRADIUSЧто необходимо еще сделать:
0. Настроить IPFW так, чтобы клиенты могли получать инет только после создания VPN-туннеля
1. Необходимо открыть только "нужные" порты для доступа из внутренней сети во внешний мир
2. Необходимо закрыть все порты для внешнего мира (кроме 22)
Пункт 1 сделан чтобы ничего лишнего наружу не лезло, а только необходимый клиентам траффик.
Что я делаю:
0. На внутреннем интерфейсе по DHCP раздаю сетку 192.168.1.0/24
1. При создании VPN-туннеля клиенту дается IP из сетки 192.168.2.0/24 (ип привязан к логину)
2. Использую NATD, чтобы он натил сетку 192.168.2.0/24 (vpn-сеть) во внешний мир через rl1
3. Также NATD натит все что приходит с rl1 ко мне
4. IPFW:
4.0. делает диверт в NATD (по пунктам 2 и 3)
4.1. разрешает обратную петлю
4.2. разрешает, чтобы проходили уже установленные соединения
4.3. разрешает все на внутреннем интерфейсе rl0
4.4. разрешает устанавливать соединения по "нужным" портам от меня и ко мне
И вот собственно я никак не могу понять как настроить IPFW чтобы он делал то, что мне нужно, сейчас я делаю так:
%cat /etc/firewall.script
#!/bin/shfwcmd="/sbin/ipfw -q"
# внутренний интерфейс
int_if=rl0
# внешний интерфейс
ext_if=rl1
# внутренняя сеть
int_net=192.168.1.0/24
# vpn-сеть
vpn_net=192.168.2.0/24
# интересующие меня порты
allowed_ports=20,21,22,23,25,53,67,68,80,110,123,143,161,443,5190,5191,5192,5193
${fwcmd} -f flush
# всегда разрешать SSH коннект
${fwcmd} add 30000 pass tcp from any to me 22 keep-state
# отправляем 80 порт на Squid (прозрачно)
${fwcmd} add fwd 127.0.0.1,3128 tcp from ${vpn_net} to any 80 out via ${ext_if}
# разрешаем натить только с впн-подсетки
${fwcmd} add divert natd all from ${vpn_net} to any out via ${ext_if}
${fwcmd} add divert natd all from any to me in via ${ext_if}
# разрешаем траффик на обратной петле и закрываем 127/8
${fwcmd} add pass all from any to any via lo0
${fwcmd} add deny all from any to 127.0.0.0/8
${fwcmd} add deny all from 127.0.0.0/8 to any
# разрешаем проход уже установленным соединениям и "битым" пакетам
${fwcmd} add allow tcp from any to any established
${fwcmd} add allow all from any to any frag
# чтобы клиенты не ходили в инет без поднятия VPN-туннеля
# (еще надо бы запретить клиентов которые ручками установят адрес из 192.168.2.0/24)
${fwcmd} add deny all from ${int_net} to any via ${ext_if}
${fwcmd} add deny all from any to ${int_net} via ${ext_if}
# разрешаем любой траффик на внутреннем интерфейсе
${fwcmd} add allow all from any to any via ${int_if}
# самое интересное, открываем интересующие нас порты
${fwcmd} add allow all from me to any ${allowed_ports}
${fwcmd} add allow all from ${vpn_net} to any ${allowed_ports}
# а вот
${fwcmd} add allow all from any ${allowed_ports} to me
${fwcmd} add allow all from any ${allowed_ports} to ${vpn_net}
Собсно вопрос, я хочу открывать порты только "по требованию", т.е. чтобы когда я стучусь скажем на порт 80 какого-нибудь сервака, то устанавливается коннект и сервак может мне отвечать и IPFW пропускает это дело без добавления обратного правила (разрешать всем стучаться ко мне с 80 порта).
Я не пойму как это сделать вот почему, когда клиент поднимает VPN-туннель, получает IP, пытается стукнуть на 80 порт куда нибудь вовне, то ответ приходит обратно на шлюз, а не к клиенту, я правильно рассуждаю? Получается если шлюз не принимает коннект с 80 порта на себя, то до клиента такой траффик не доходит, или как? Или NAT все таки кидает траффик обратно на клиента?
Вобщем помогите понять саму технологию обмена при таком подключении, либо дайте советы по улучшению текущей конфигурации. Заранее признателен и благодарен (в случае получения полезной информации готов кинуть WMR на пиво/сок :)