DataLife Engine > Настройка > Настройка FreeBSD как шлюз в Интернет

Настройка FreeBSD как шлюз в Интернет


18-08-2010. Разместил: synergix Не так давно нужно было поставить гейт в Интернет для одного интернет-кафе. Кафе имело доступ к Интернету через ADSL-модем с Ethernet интерфейсом и локалку на 50 компьютеров со статическими адресами. Решено было поставить именно шлюз, а не купить обычной роутер с NAT, так как в роутерах все равно крутится урезанный линукс, а шлюз на базе ПК имел гораздо больше возможностей. К тому с таким количеством компьютеров использование прокси-сервера для кеширования веб-страниц давало определенную экономию траффика. Машинка имела параметры уровня Pentium2-600 с 256 Mb оперативной памяти. Вариант установки оффтописка отпадал из-за слабых мощностей и ненадежности и отсутствия гибкости. К тому же FreeBSD идеально подходит для гейтов в силу малой требовательности ресурсов и надежности работы. Насколько мне известно по хоум-провайдингу, гейты на FreeBSD могут спокойно натить полосу до 500-600 mbit/sec wink

Итак, дано - установить FreeBSD на компьютер, настроить NAT, настроить прозрачный прокси.

Не буду утомлять читателей описанием установки, благо это подробно описано и иллюстрировано в данной статье.
После установки я пересобрал ядро, включив в него дополнительные опции, а именно
options IPFIREWALL    #добавил поддержку файрволла
options IPFIREWALL_VERBOSE    #логгирование
options IPFIREWALL_VERBOSE_LIMIT=100    #органичение количества записей в лог
options IPFIREWALL_DEFAULT_TO_ACCEPT    #файерволл "открыт" по умолчанию
options IPFIREWALL_FORWARD
options IPDIVERT    #включение поддержки перенаправления пакетов
options DUMMYNET    #может понадобится для ограничения скорости


После пересборки ядра настала очередь правки /etc/rc.conf для включения NAT. NAT будет использовать в виде отдельного демона. У меня на шлюзе стояло 2 сетевые карточки, одна смотрела в интернет через модем (настроенный в режиме моста), вторая в локальную сеть.
Соотвественно, первая была re0 и имела адрес вида 213.230.x.x, вторая rl0 - адрес 192.168.0.1

Правим /etc/rc.conf
defaultrouter=213.230.x.x    #указываем основной шлюз
ifconfig_re0="inet 213.230.x.x netmask 255.255.255.252"    #задаем внешний интернетовский адрес
ifconfig_rl0="inet 192.168.0.1 netmask 255.255.255.0" #задаем внутренний адрес
gateway_enable="YES" #зайдествуем режим шлюза
natd_enable="YES" #включем NAT
nat_interface="re0" #указываем натируемый интерфейс
nat_flags="-f /etc/natd.conf" #файл настройки демона NAT
firewall_enable="YES"


Далее в /etc/resolv.conf указываем DNS-сервера провайдера - вписываете свои
nameserver 195.158.0.1
nameserver 195.158.0.3


После сохранения и перезагрузки (это не обязательно, можно поднять интерфейсы и демон не перезагружая, но проверить как что поднимается все же нужно), проверяем доступность в обоих сетках, пропинговав локальные машины и хосты в интернете.
Уже на данном этапе интернет доступен локальным компьютерам, единственное что нужно дополнительно настроить на них, так это указать на них шлюз по умолчанию 192.168.0.1 и в строке DNS-сервера также прописать 192.168.0.1

Пришла очередь поставить squid. Для начала обновляем колекцию портов.
После успешного обновления переходим собственно к установке.
#cd /usr/ports/www/squid31/
#make install clean


После окончания установки идем править файл настройки squid, находящегося по адресу /usr/local/etc/squid/squid.conf

Вот его содержание:
#
# Recommended minimum configuration:
#Это минимум, который необходим для корректной работы прокси
acl manager proto cache_object
acl localhost src 127.0.0.1/32
#IPv6 Not Available:acl localhost src ::1/128
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32
#IPv6 Not Available:acl to_localhost dst ::1/128

# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed
#Здесь указываются подсетки, которые имеют доступ к нашей проксе, у нас подсетка 192.168.0.0, потому оставляем только ее
#acl localnet src 10.0.0.0/8    # RFC1918 possible internal network
#acl localnet src 172.16.0.0/12    # RFC1918 possible internal network
acl localnet src 192.168.0.0/24    # Указываем сеть 192.168.0.1-254
#IPv6 Not Available:acl localnet src fc00::/7   # RFC 4193 local private network range
#IPv6 Not Available:acl localnet src fe80::/10  # RFC 4291 link-local (directly plugged) machines

acl SSL_ports port 443
acl Safe_ports port 80        # https
acl Safe_ports port 21        # ftp
acl Safe_ports port 443        # httpss
acl Safe_ports port 70        # gopher
acl Safe_ports port 210        # wais
acl Safe_ports port 1025-65535    # unregistered ports
acl Safe_ports port 280        # https-mgmt
acl Safe_ports port 488        # gss-https
acl Safe_ports port 591        # filemaker
acl Safe_ports port 777        # multiling https
acl CONNECT method CONNECT

#
# Recommended minimum Access Permission configuration:
#
# Only allow cachemgr access from localhost
https_access allow manager localhost
https_access deny manager

# Deny requests to certain unsafe ports
https_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
https_access deny CONNECT !SSL_ports

# We strongly recommend the following be uncommented to protect innocent
# web applications running on the proxy server who think the only
# one who can access services on "localhost" is a local user
#https_access deny to_localhost

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#

# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
https_access allow localnet
https_access allow localhost


# And finally deny all other access to this proxy
https_access deny all

# Squid normally listens to port 3128 - Порт, на котором будет висеть прокси
https_port 127.0.0.1:3128 intercept #transparent для версий ниже 3.1

# We recommend you to use at least the following line.
hierarchy_stoplist cgi-bin ?

# Uncomment and adjust the following to add a disk cache directory.
cache_dir ufs /var/squid/cache 500 16 256
cache_mem 256 MB
# Leave coredumps in the first cache dir
coredump_dir /var/squid/cache

# Add any of your own refresh_pattern entries above these.
refresh_pattern ^ftp:        1440    20%    10080
refresh_pattern ^gopher:    1440    0%    1440
refresh_pattern -i (/cgi-bin/|?) 0    0%    0
refresh_pattern .        0    20%    4320


Далее создаем кеш прокси.

#/usr/local/sbin/squid -z


Стартуем его
#/usr/local/etc/rc.d/squid -start


Если Squid успешно запустился - открываем любой бразуер, указываем нашу проксю вида 192.168.0.1:3128 и пробуем открыть например тот же google.com.
Открылся? Замечательно, вписываем в /etc/rc.conf

squid_enable="YES"


И делаем его прозрачным, добавив правило в файрволл.
ipfw add fwd 192.168.0.1,3128 tcp from 192.168.0.0/24 to any 80


После этого, на клиентском компьютере убираем прокси с браузера и пробуем открыть другую страницу. Паралелльно можно смотреть файл /var/log/squid/access.log, в котором фиксируются обращения к прокси. Если все работает, в логи появляются записи - поздравляю. Теперь все веб-запросы от клиентских компьютеров будут прозрачно кешироваться, экономя вам траффик.
На этом первоначальная настройка гейта завершена.

UPD. Иногда нужно раздавать интернет не всем в локальной сети, а некоторым пользователям. Тогда можно прикрутить к сквиду авторизацию. Это делается путем добавления в конфиг
auth_param basic program /usr/local/libexec/squid/ncsa_auth /usr/local/etc/squid/internet_users
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off

acl squidusers proxy_auth REQUIRED

https_access allow squidusers


Далее создаем сам файлик с пользователями и паролями
# htpasswd -c /etc/squid/internet_users synergix
New password: *******
Re-type new password: *******
Adding password for user synergix


Ключ -с необходимо указывать только один раз, при создании файла с паролями. В последующем добавлять пользователей нужно без этого ключа. Итак, мы получили файл с примерно таким содержимым.

# cat /etc/squid/internet_users
synergix:89XzEEI/P0e56


Где synergix - имя пользователя, а 89XzEEI/P0e56 - хеш его пароля. Для добавления нового пользователя в существующий файл необходимо выполнить следующую команду

# htpasswd -b /etc/squid/internet_users second_user 1234567
Adding password for user second_user


Посмотрим -
# cat /etc/squid/internet_users
syenrgix:89XzEEI/P0e56
second_user:EAJezc5eLXrV2


Выставим права для файла

# chmod 440 /usr/local/etc/squid/internet_users
# chown squid:squid /usr/local/etc/squid/internet_users


И попросим Squid перечитать конфиг.

#/usr/local/etc/rc.d/squid reload

Вернуться назад