Как впустить удалённых сотрудников в локальную сеть офиса по зашифрованному каналу с помощью VPN (Часть 2) [2008]
Всё так, символичный линк (symlink, symbolic link) на директорию sys = /usr/src/sys/ (он в системе по умолчанию, а создаютсяони с помощью команды
ln -s имясуществующейдиры имялинка
), так что мы там, откуда выполним следующую команду для создания каталога исходников в соответствии с вышеуказанной конфигурацией ядра:
# config VPNGOD Kernel build directory is ../compile/VPNGOD Don't forget to do ``make cleandepend && make depend''
Идём в:
# cd ../compile/VPNGOD # pwd /usr/src/sys/amd64/compile/VPNGOD
Внимание, по умолчанию правило IPFW, который мы собираемся включить, выглядит так:
65535 deny ip from any to any
Т.е. все внешние сетевые подключения обрубит после перезагрузки и закроет ваш сервер от любых притязаний, даже хозяев. Если вы за консолью, это конечно никак не повлияет, если же вы работаете удалённо, позаботьтесь об этом заранее (например, создать скрипт с
allow all from any to any
перед 65535ым правилом на первое время). Теперь, находясь в директории сырцов нового ядра, последуем просьбе указанной выше системой (это один из двух известных мне способов пересборки ядра, я пользуюсь только им):
# make cleandepend && make depend && make -j8 -B && make install && reboot
Этим набором команд, перечисленных через операторы "&&" - последовательное выполнение одного за другим, мы сразу всё стадо зайцев скосили и при отсутствии ошибок при сборке можем расслабиться, и как говориться при установке всем известных ОС - откинуться на спинку кресла (не купили к установке?). Все эти команды задают зависимости, собирают модули, компилируют их аж в 8 потоков (-j8), но по возможности с последовательной синхронизацией (-B), устанавливают всё в /boot/kernel и перезагружают систему автоматом по окончании. Если что, смотрите гугл или используйте make buildkernel команду (собсно,снова гугл по хэндбукам). Число потоков и параметр "-B" используйте только на мощных машинах, на слабых их вообще лучше опустить (просто make). Новое ядро после перезагрузки поприветствует вас как-то так:
Copyright (c) 1992-2008 The FreeBSD Project. Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD is a registered trademark of The FreeBSD Foundation. FreeBSD 7.0-RELEASE #0: Tue May 20 09:53:05 MSD 2008 ******@ns1.*******.ru:/usr/src/sys/amd64/compile/VPNGOD
Если этого не произошло, значит вы либо не подключили каких-то важных устройств (чаще всего управление питанием - новый acpi/старый apic, и контроллеры ж/д). Можно загрузиться из старого (предшествующего) ядра:
Где bce0 (218.22.33.218/29) смотрит в провайдера, а тот подглядывает во внешний мир, а bce1 (192.168.0.2/24) - в локальную корпоративную сеть. Сервер может являться как шлюзом для ЛВС предприятия, так и просто vpn-сервером для удалённых клиентов. У меня он ещё и проксирует http-https-ftp запросы, держит сайт, статистику по snmp (cacti), а так же ftp (proftpd) с веб-мордой (proftpdadmin). В rc.conf сетевые настройки и firewall выглядят следующим образом:
# cat /etc/rc.conf
(..опустил ненужное..)
# настройки сети
gateway_enable="YES"
defaultrouter="218.22.33.217"
hostname="vpn.bulyzhnik.ru"
ifconfig_bce0="inet 218.22.33.218 netmask 255.255.255.248"
ifconfig_bce1="inet 192.168.0.2 netmask 255.255.255.0"
# ручной маршрут, в том случае,если у вас будет
# всё-таки другая vpn-подсеть авось да пригодится
# route_lnet="-net 10.1.1/29 218.22.33.218"
# static_routes="lnet"
# включаем фаер, включаем логгирование
firewall_enable="YES"
firewall_script="/etc/rc.fire"
firewall_logging="YES"
А скрипт фаера выглядит так:
# cat /etc/rc.fire
# Firewall rules Written by Marc Silver (marcs@draenor.org)
# http://draenor.org/ipfw # Freely distributable
# add to rc.conf: firewall_script="/etc/rc.fire"
fwcmd="/sbin/ipfw"
# Force a flushing of the current rules before we reload.
$fwcmd -f flush
eint="bce0"
eip="218.22.33.218"
iip="192.168.0.2"
iint="bce1"
m0="255.255.0.0"
m1="255.255.255.0"
m2="255.255.255.248"
n1="192.168.0.0"
n2="218.22.33.216"
vpn="192.168.0.248"
# pass all through loopback device
${fwcmd} add pass all from any to any via lo0
# deny other 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
# anti-hack from outside
${fwcmd} add deny ip from me to any in recv bce0
# deny netbios
${fwcmd} add deny ip from any 137-139 to any
${fwcmd} add deny ip from any to any 137-139
# SSH for localhost allow
${fwcmd} add allow tcp from me 22 to any
${fwcmd} add allow tcp from any to me 22
# DNS transfers to world
${fwcmd} add allow udp from me 53 to any
${fwcmd} add allow udp from any to me 53
# DNS, NTP, SNMPx2, DNSs
${fwcmd} add allow udp from me to any 53,123,161
${fwcmd} add allow udp from any 53,123,161 to me
# VPN-connect - это порт для даемона MPD, на него поступают запросы на авторизацию
${fwcmd} add allow tcp from me 1723 to any keep-state
# GRE for MPD5 - в этот протокол инкапсулируются все пакеты установившегося соединения VPN
${fwcmd} add allow gre from any to any
# VPN-LAN - разграничение двух сеток: подсети VPN и общей LAN,
# чтобы отдельно для каждой определять правила доступа.
# здесь разрешаем междусобойчик этих двух сеток
${fwcmd} add allow all from ${vpn}/29 to ${n1}/24{1-231,240-254}
${fwcmd} add allow all from ${n1}/24{1-231,240-254} to ${vpn}/29
# PROXY - это для прозрачного прокси-сервера, на моей машине он до кучи сервисов
${fwcmd} add fwd ${iip},3348 tcp from ${n1}/24 to any http via ${iint}
${fwcmd} add fwd ${iip},3348 tcp from ${n1}/24 to any https via ${iint}
${fwcmd} add fwd ${iip},3348 tcp from ${n1}/24 to any ftp ${iint}
# Allow forced local PROXY - обычная прокся
${fwcmd} add allow tcp from ${n1}/24 to ${iip} 3348 via ${iint} keep-state
${fwcmd} add allow tcp from not ${n1}/24 to ${eip} 3348 via ${eint} keep-state
# FTP & HTTP from this server to world - для самого сервера, выход в мир - качать порты, например
${fwcmd} add allow tcp from me to any 20,21,80,443 keep-state
# Passive FTP backports
${fwcmd} add allow tcp from me to any 49151-65535 keep-state
# FTP & HTTP to LAN
${fwcmd} add allow tcp from ${oip} 20,21,80,443 to ${n1}/24 via ${iint} keep-state
${fwcmd} add allow tcp from ${oip} 49152-65534 to ${n1}/24 via ${iint} keep-state
# HTTP ----------local site------------ - у меня тут ещё и сайт есть на серваке (: apache)
${fwcmd} add allow tcp from ${eip} 80 to any keep-state
# NATd - вот правило транслирования адресов для двух сетей разделены
${fwcmd} nat 123 config ip ${eip}
${fwcmd} add nat 123 ip from ${vpn}/29 to not ${n1}/24{1-231,240-254}
${fwcmd} add nat 123 ip from ${n1}/24{1-231,240-249} to any
${fwcmd} add nat 123 ip from any to ${eip} via ${eint}
# далее идут правила для всех клиентов, обслуживаемых через NAT: запросы из LAN в мир
# ICMP (echo-reply,destunreach,echo-req,time exceeded,tracert)
${fwcmd} add deny icmp from any to any frag
${fwcmd} add allow icmp from any to any icmptypes 0,3,4,8,10,11,30
# FTP & SSH from LAN
${fwcmd} add allow tcp from ${n1}/24{1-231,240-254} to any 20,21,22,80,443 keep-state
# Passive FTP backports
${fwcmd} add allow tcp from ${n1}/24{1-231,240-254} to any 49151-65535
# MAIL (SMTP,POP3,IMAP,IMAPs, POP3s)
${fwcmd} add allow tcp from ${n1}/24{1-231,240-254} to any 25,110,143,993,995 keep-state
# ICQ
${fwcmd} add allow tcp from ${n1}/24{1-231,240-254} to any 5190 keep-state
# internal VPN-LAN to OUT
${fwcmd} add allow ip from any to ${vpn}/29
# немного шейперов канала - режу скорость
# shapes for administry
${fwcmd} pipe 1005 config bw 50Mbits/s
${fwcmd} pipe 1006 config bw 2Mbits/s
${fwcmd} pipe 1007 config bw 10Mbits/s
${fwcmd} table 54 flush
${fwcmd} table 54 add 192.168.0.0/24{1-10,105,246} 1005
${fwcmd} table 54 add 192.168.0.0/24{11-104,106-245,246-254} 1006
${fwcmd} table 54 add 218.63.40/241007
${fwcmd} add pipe tablearg ip from any to 'table(54)'
${fwcmd} add pipe tablearg ip from 'table(54)' to any
# shapes for users
${fwcmd} add pipe 5 ip from any to ${n1}/24
${fwcmd} add pipe 5 ip from ${n1}/24 to any
${fwcmd} pipe 1 config bw 2Mbits/s
# log - всё, что не пропустилось, в лог (/var/log/security по умолчанию)
${fwcmd} add deny log logamount 3000 all from any to any
Это не совсем оптимизированный список правил, к тому же, перегруженный - т.к. у меня на машине не один сервис, и она служит шлюзом для локальных клиентов - пропускает, проксируя, http/ftp трафик, а остальное транслирует с помощью ipfw nat - как видно из правил, это все icmp запросы (например, ping и tracert), почту и icq. Опять же, эта конфигурация рабочая и может пригодится для многих новичков, которым всё и сразу. Для каждого двустороннего правила есть краткий заголовок, думаю, все знают англицкий и аббревиатуры протоколов и даемонов (: