Більшість з нас звикла до стандартних рішень, які не переглядаються роками. Так захист вінди ми довіряємо одного й того самого комплекту програм - файрвол, антивірус, антишпигунська програма ... Такий набір є у кожного, відрізняються лише виробники. Ми ж спробуємо інший шлях - використовувати як блокпоста * nix-систему, запущену у віртуальній машині. А наскільки цей підхід виявиться ефективним у кожному конкретному випадку, вирішувати вже тобі.
Суть ідеї

Вбудовані віндовий кошти - Windows Firewall і Internet Connection Sharing (Спільний доступ до інтернету) досить незручні, малорухомі і не забезпечують належного рівня захисту. Тому, щоб роздати інтернет на декілька компів, з можливістю повноцінного контролю всього процесу, потрібно або хардварний роутер, або одне з софтових рішень, начебто UserGate Proxy & Firewall, NetworkShield Firewall або Kerio WinRoute Firewall. Роутер зрозумілий в налаштуваннях, навіть найпростіші залозки мають мінімальні функції фільтра пакетів, маршрутизації, захисту від атак і так далі. Але часто його можливості не дають розвернутися на повну, і руки зв'язані тим, що закладено в нього виробником. Більш функціональні рішення коштують відповідно, але і їхніх можливостей може не вистачати (наприклад, шейпінгу, обліку трафіку, моніторингу завантаження каналу). Аналогічна ситуація і з софтові рішеннями. За гарний файрвол з усіма наворотами доведеться заплатити. Не варто забувати про те, що захист працює, поки користувач залишається в домашній локальної мережі, але варто підключитися до інету через одну з численних точок доступу за межами дому, як ми залишаємо комп'ютер з Windows Firewall, тобто практично беззахисним.

Потужності сучасних настільних систем цілком достатньо, щоб встановити віртуальну машину, яку і використовувати в якості файр для захисту локальної системи або шлюзу для підключення інших комп'ютерів домашньої мережі. Крім того, на ньому можна розгорнути проксі, кешуючий DNS та інші необхідні сервіси (наприклад, IDS, VPN або IP-PBX). Природно, з метою економії ресурсів у віртуальній машині не варто запускати десктопну ОС, цілком можна обійтися серверним дистрибутивом Linux у мінімальній інсталяції, або взяти одну з BSD систем. Наприклад, OpenBSD в дефолтовой установці прекрасно працює, якщо їй виділити всього 32-64 Мб ОЗУ і 300 Мб місця на харді, що, погодься, зовсім небагато, особливо з огляду на можливості цієї операційки. Надалі ми розглянемо налаштування PF в OpenBSD і iptables в Linux. В якості віртуальної машини будемо використовувати безкоштовний VirtualBox, який досить простий в налаштуваннях і не жадібний до оперативки. Хоча при бажанні його можна замінити QEMU, Virtual PC або іншим рішенням. Ще варіант: створити образ у VMware Server (ключ видається безкоштовно), який потім задіяти в VMware Player.
Віндовий розбирання

Щоб виключити вихід хостової ОС в інтернет, в настройках реального мережного адаптера знімаємо всі галочки, за винятком VirtualBox Bridged Networking Driver. У тому числі потрібно прибрати підтримку "Протокол Інтернету (TCP / IP)" та "Клієнт для мереж Microsoft". У налаштуваннях віртуального мережевого інтерфейсу, що з'явився після установки VirtualBox, в якості шлюзу за замовчуванням і DNS-сервера вказуємо IP-адресу "внутрішнього" (LAN) інтерфейсу гостьової ОС, запущеної у віртуальній машині (vic1 у разі OpenBSD або eth1 в Linux). Тут також вимикаємо "Клієнт для мереж Microsoft". При створенні віртуальної машини вказуємо два мережевих адаптера. В одному вказуємо тип підключення "Міст" і вибираємо в списку "Ім'я" реальний мережевий адаптер (наприклад, Wi-Fi), підключений до інтернет. Тип другий вказуємо як "Віртуальний адаптер хоста", через нього і будемо підключатися до глобальної мережі.

Вважаємо, що гостьова система вже встановлена, і переходимо безпосередньо до налаштувань.
Налаштування PACKET FILTER

Насамперед потрібно включити форвардінг пакетів між двома мережевими інтерфейсами:

# Sysctl net.inet.ip.forwarding = 1

Щоб зміна набирало чинності після кожної перезавантаження, знімаємо коментар з відповідного рядка файлу / etc / sysctl.conf. Далі створимо найпростіше правило для виходу в інтернет через NAT, пишемо в pf.conf:

# Vi / etc / pf.conf

nat on vic0 from vic1: network to any -> vic0
block in all
pass in on vic1

Тут активована трансляція адрес для мережі, підключеного до інтерфейсу vic1, з якого дозволений весь трафік. Всі порти прикриті. Перевіряємо файл на наявність помилок і застосовуємо правила:

# Pfctl-nf / etc / pf.conf
# Pfctl-vf / etc / pf.conf

У висновку консолі отримаємо всі активні правила PF, причому замість назв інтерфейсів будуть вказані IP-адреси. Щоб перевірити стан NAT, набираємо:

# Pfctl-s state

Тепер входимо в інтернет з локальної системи і скануємо зовнішній IP (виданий провайдером) за допомогою сканера начебто nmap на наявність відкритих портів. Далі розвиваємо створені правила, дозволивши, наприклад, вихід в інтернет тільки по певних портах:

# Vi / etc / pf.conf

tcp_srv = "{ssh, smtp, domain, www, pop3}"
udp_srv = "{domain}"
block all
pass out inet proto tcp to any port $ tcp_srv
pass out inet proto udp to any port $ udp_srv

Замість назв сервісів з / etc / services в правилі можна вказати номери портів, тут кому як зручніше. Переглянути статистику за допомогою pfctl досить просто:

# Pfctl-s info

Для більш наочного моніторингу можна використовувати утиліти начебто ntop або pftop. Для цього через змінну оточення PKG_PATH вказуємо FTP-дзеркало (wwwopenbsd.org / ftphtml), з якого будемо ставити прекомпільованних пакети:

# Export PKG_PATH = ftp://ftp.openbsd.org/pub/OpenBSD/4.6/packages/i386

І виконуємо установку:

# Pkg_add pftop
# Pkg_add ntop
Доповнюємо схему

Зменшити кількість вхідного трафіку, скоротити час завантаження сторінок і порізати банери допоможе кешуючий проксі-сервер Squid.

# Pkg_add squid-2.7.STABLE6.tgz

Відкриваємо конфігураційний файл / etc / squid / squid.conf і дозволяємо підключення:

# Vi / etc / squid / squid.conf

http_port 3128
# # # У випадку прозорого проксированія директива набуде вигляду:
# Http_port 127.0.0.1:3128 transparent
# # # Вказуємо діапазон IP внутрішньої мережі
acl lan_net src 192.168.1.0/24
# # # Дозволяємо вихід в інтернет з мережі 192.168.1.0/24
http_access allow lan_net
# # # Розмір кешу вказуємо з урахуванням обсягу ОЗУ, виділеного VM
cache_mem 32 MB
maximum_object_size 10240 KB
cache_dir ufs / var / squid / cache 5000 16 256

Створюємо каталог для кешу і запускаємо кешуючий проксік:

# Squid-z
# Squid

Тепер можна перевірити, слухається чи потрібний порт:

# Netstat-ant | grep 3128

Розбудовуємо браузери на підключення через порт 3128 інтерфейсу vnec1 і пробуємо звернутися до зовнішнього веб-сайту. Як варіант, можна налаштувати прозоре проксінг, щоб користувачі, що намагаються підключитися до 80 і 8080 портів зовнішніх web-серверів, автоматично перенаправлялися на локальний порт, на якому працює Squid:

# Vi / etc / pf.conf

table <clients> {192.168.1.2, 192.168.1.5}
table <nocache> {192.168.1.0/24}
rdr on inet proto tcp from <clients> to! <nocache> port {80 8080} -> 127.0.0.1 port 3128

Коли все налаштовано, забезпечуємо автозавантаження Squid при старті системи:

# Vi / etc / rc.local

if [-x / usr / local / sbin / squid]; then echo-n 'squid'; / usr / local / sbin / squid
fi

При бажанні Squid можна доповнити іншими модулями. У портах є squidGuard і HAVP (HTTP Anti Virus Proxy). Перший допоможе в боротьбі з банерами, блокуванням файлів і певних ресурсів, другий вміє перевіряти трафік декількома антивірусами.

# Pkg_add squidguard
# Pkg_add havp

Налаштування squidGuard і HAVP докладно описана в статті "Озброєний бронекальмар", опублікованій в червневому номері] [за 2008 рік, тому тут не зупиняємося. До речі, подібна схема з віртуальним файрволом може бути цікава тим, хто хоче максимально убезпечити своє перебування в інтернет. Не секрет, що браузер на сайті залишає своєрідний відбиток, який може розповісти багато чого про твоїй системі. Застосування проксі-сервера дозволяє приховати велику частину інформації шляхом модифікації заголовків. Для тих, хто не хоче морочитися зі Squid, можу порекомендувати Privoxy (Privacy Enhancing Proxy) - некешірующій проксі з можливостями фільтрації контента для підвищення приватності і безпеки веб-серфінгу. Установка Privoxy зводиться до виконання команди:

# Pkg_add privoxy

Тепер налаштовуємо браузер, щоб він виходив в інтернет через порт 8118, і набираємо в адресному рядку http://config.privoxy.org/ (коротка форма: http://pp). У результаті отримуємо можливість редагування параметрів проксі-сервера. Дефолтні правила забезпечують блокування Cookies, pop-up, деяких типів банерів. За замовчуванням Privoxy слухає тільки локальний інтерфейс, для доступу до нього з хостової машини або з LAN слід змінити інструкцію listen-address в config.txt, вказавши IP мережного інтерфейсу vic1:

listen-address 191.168.1.1:8118

Можливостей, як і налаштувань, в Privoxy дуже багато, докладно він розглядався в статті "Маленьке вікно у велику мережу", опублікованій в] [03.2007. При необхідності можна змусити його працювати в тандемі з кальмаром, для чого в squid.conf досить додати всього один рядок:

cache_peer 127.0.0.1 parent \ 8118 7 no-query

В якості ще одного бонусу до нашому інтелектуальному файрвола можна порекомендувати легкий кешуючий DNS (а також TFTP і DHCP) сервер Dnsmasq. Ставиться він просто:

# Pkg_add dnsmasq

Після цього в конфігураційному файлі dnsmasq.conf вказуємо мережевий інтерфейс, на якому він буде приймати запити:

listen-address = 127.0.0.1, 192.168.1.1

Тепер всі повторні DNS-запити будуть видаватися з кешу і виконуватися швидше.
Налаштування IPsec У OpenBSD

Тепер навчимо віртуальний файр підключатися по VPN. Розберемо з'єднання по протоколу IPsec за допомогою утиліти ipsecctl, що входить в стандартну поставку. Отже, наша внутрішня мережа 192.168.1.0/24, зовнішній WAN інтерфейс одержує IP-адреса 1.2.3.4, відповідно в віддаленому офісі LAN - 192.168.2.0/24 і WAN - 5.6.7.8. Відкриваємо в редакторі конфіг / etc / ipsec.conf і вказуємо налаштування мереж:

# Vi / etc / ipsec.conf

ike esp from 192.168.1.0/24 to 192.168.2.0/24 \ peer 5.6.7.8
ike esp from 1.2.3.4 to 192.168.2.0/24 \ peer 5.6.7.8
ike esp from 1.2.3.4 to 5.6.7.8

На віддаленому хості файл / etc / ipsec.conf буде аналогічним, тільки замінюємо IP і в описі підключення додаємо ключ passive, що означає, що даний вузол буде чекати підключення (підключення ініціалізує віддалена система):

ike passive esp from 5.6.7.8 to 1.2.3.4

У правилах PF дозволимо підключення з віддаленого вузла і вкажемо, що не потрібно фільтрувати трафік, що проходить через інтерфейс зворотної петлі, а також через внутрішній і віртуальний інтерфейси:

# Vi / etc / pf.conf

set skip on {lo vic1 enc0}
pass quick on vic0 from 5.6.7.8

Тепер з VPN-сервера копіюємо публічний ключ і зберігаємо його в / etc/isakmpd/pubkeys/ipv4/5.6.7.8, а свій ключ / etc / isakmpd / private / local.pub передаємо на 5.6.7.8. Набираємо на обох хостах:

# Isakmpd-K
# Ipsecctl-f / etc / ipsec.conf

Якщо все проходить нормально, забезпечуємо автозапуск при завантаженні системи (якщо в цьому є необхідність). Для чого додаємо в / etc / rc.conf.local один рядок:

isakmpd = "-K"

C OpenBSD, сподіваюся, все зрозуміло. Перейдемо до Linux, багато питань, за винятком настройки правил пакетного фільтру і встановлення програм, будуть аналогічні.
Організація NAT в Linux

У Linux пакетний фільтр Netfilter управляється за допомогою консольної утиліти iptables. Установки відрізняються за написанням, але, по суті, залишаються тими ж. Для початку дозволяємо форвардінг пакетів:

# Echo 1> / proc/sys/net/ipv4/ip_forward

Або як варіант:

# Sysctl-w net.ipv4.ip_forward = 1

Щоб форвардінг активувався при завантаженні системи, використовуємо / etc / sysctl.conf:

net.ipv4.ip_forward = 1

Зверни увагу, мінлива механізму sysctl дещо відрізняється від аналогічного параметра в OpenBSD. У різних дистрибутивах можуть бути свої особливості. Так в CentOS / Fedora досить ввести одну команду:

# System-config-securitylevel

Перевіряємо:

# Service iptables status

В якості альтернативи в цих дистрибутивах можна використовувати chkconfig. Дивимося статус запуску iptables:

# Chkconfig - list iptables

І активуємо при необхідності:

# Chkconfig iptables on

Нехай внутрішній мережевий інтерфейс (до якого підключається локальна система) буде eth1, а зовнішній - eth0. Щоб включити NAT в Linux і вирішити всі з'єднання, достатньо прописати три правила:

# Iptables-t nat-A POSTROUTING-o eth0-j MASQUERADE
# Iptables-A FORWARD-i eth0-o eth1-m state - state RELATED, ESTABLISHED-j ACCEPT
# Iptables-A FORWARD-i eth1-o eth0-j ACCEPT

Для більшого захисту можна дозволити доступ тільки до певних сервісів:

iptables-A OUTPUT-j ACCEPT-m state - state NEW, ESTABLISHED, RELATED-o eth0-p tcp-m multiport - dports 80,443,8080 - sport 1024:65535

Щоб NAT працював і після перезавантаження, в Ubuntu зберігаємо всі налаштування iptables в файл за допомогою утиліти iptables-save:

# Iptables-save> / etc / iptables.rules

І заносимо цей рядок в один з скриптів, що виконуються при зупинці системи (наприклад, скрипти з каталогу / etc / network / if-postdown.d). Щоб правила при завантаженні завантажувалися автоматично, додаємо в кінець файлу / etc / networks / interfaces наступний запис:

# Vi / etc / networks / interfaces

# # # Завантажуємо правила при піднятті інтерфейсу
pre-up iptables-restore </ etc / iptables.rules

У CentOS правила зберігаються командою:

# Service iptables save

Після цього всі рулесети можна знайти в / etc / sysconfig / iptables. Для автоматичного їх завантаження при старті системи досить дозволити два параметри у файлі / etc / sysconfig / iptables-config:

# Vi / etc / sysconfig / iptables-config

IPTABLES_SAVE_ON_STOP = "yes"
IPTABLES_SAVE_ON_RESTART = "yes"

Переглянути перелік правил iptables можна командою:

# Iptables-L-v

Все, з файр розібралися. Тепер можна нарощувати функціонал. Squid є в репозитаріях пакетів і ставиться дуже просто. У Debian / Ubuntu:

# Apt-get install squid

Або в CentOS:

# Yum install squid

Щоб не перебудовувати клієнтські системи, додамо правила iptables:

iptables-t nat-A PREROUTING-i eth1-p tcp-m tcp - dport 80-j DNAT - todestination 192.168.1.1:3128
iptables-t nat-A PREROUTING-i eth0-p tcp-m tcp - dport 80-j REDIRECT - to-ports 3128

При бажанні Squid можна доповнити іншими модулями - Adzapper, squidGuard і HAVP.
Висновок

Ми отримали абсолютно безкоштовний файрвол з просунутими функціями, що надійно захищає хостовую Windows машину, і функціонал якого можна нарощувати до нескінченності. Можливо, хтось вважатиме його незручним, але проблему швидкого завантаження можна вирішити, просто заморожуючи стан віртуальної машини. До того ж такий віртуальний блокпост можна використовувати не завжди, а тільки в особливих випадках.