Создание безопасной точки доступа беспроводной сети с помощью OpenBSD и OpenVPN


Перевод выполнен Михаилом Сгибневым (msgibnev at gmail dot com). Автор оригинального документа: Манолис Тзанидакис. Коррективы и уточнения введены проектом OpenBSD.ru.

Содержание:


Введение

Вы знаете, насколько беззащитны беспроводные сети стандартов 802.11x. В этой статье мы создадим безопасную точку доступа на базе OpenBSD, что позволит предотвратить несанкционированный доступ и шифровать трафик, используя VPN туннель посредством OpenVPN.

Для создания беспроводной сети можно использовать беспроводной адаптер из числа поддерживаемых OpenBSD или, я рекомендую, аппаратную точку доступа. Если вы выбрали аппаратную точку доступа, то учтите, что большинство из них предоставляют незащищенный доступ к интерфейсу управления.

Для конфигурирования беспроводного адаптера создайте файл конфигурации интерфейса, /etc/hostname.ral0:

# vi /etc/hostname.ral0
inet 192.168.2.254 255.255.255.0 NONE media autoselect \
	mediaopt hostap mode 11g nwid my_secure_wlan chan 11

И выполните с правами пользователя root следующую команду:

# sh /etc/netstart ral0

Установим OpenVPN из портов:

# cd /usr/ports/net/openvpn
# make install clean CLEANDEPENDS=Yes

Аутентификация и конфигурация пакетного фильтра

Для аутентификации беспроводных клиентов, соединяющихся с нашей точкой доступа, мы будем использовать механизм authpf(8). Для этого необходимо внести некоторые коррективы в работу сервера SSH. Добавим в файл /etc/ssh/sshd_config следующие строки:

ClientAliveInterval 15
ClientAliveCountMax 3
MaxAuthTries 6
AllowTcpForwarding no
PermitTunnel no

Наш сервер точки доступа имеет три интерфейса: pppoe0, подключенный к Internet, интерфейс локальной сети rl0, соединенный с локальной сетью и беспроводный интерфейс ral0. Также есть виртуальный интерфейс tun0, необходимый для работы VPN.

[Схема сети]

Теперь мы приступаем к конфигурированию пакетного фильтра. В нашей установке мы разрешаем трафик локальной сети и беспроводных клиентов, установивших VPN соединение. Также выполняется преобразование IP-адресов на внешнем интерфейсе.

# Используемые макросы
ext_if = "pppoe0"
int_if = "rl0"
wlan_if = "ral0"
vpn_if = "tun0"

# Заблокированные пользователи
table <blocked> persist

# Таблица пользователей authpf
table <authpf_users> persist

# Не фильтровать на интерфейсе обратной петли
set skip on lo

# Выполнить нормализацию входящего трафика
scrub in on $ext_if fragment reassemble max-mss 1440

# Трансляция адресов на внешнем интерфейсе
nat on $ext_if from !($ext_if) -> ($ext_if:0)

# Якорь для правил authpf, связанных с трансляцией адресов
nat-anchor "authpf/*"
rdr-anchor "authpf/*"
binat-anchor "authpf/*"

# Блокирование всего входящего трафика
block in
block return-rst in proto tcp

# Запрет соединений от заблокированных пользователей
block in quick from <blocked>

# Применить защиту от IP-спуфинга
antispoof quick for { $int_if $wlan_if }

# Разрешить исходящие запросы
pass out proto tcp all flags S/SA modulate state
pass out proto { udp icmp } all keep state

# Якорь для фильтрующих правил authpf
anchor "authpf/*"

# Разрешить входящий трафик VPN и локальной сети
pass in on { $int_if $vpn_if } keep state

# Разрешить доступ к ssh из беспроводной сети с ограниченным количеством
# подключений (для того, чтобы попытаться предотвратить попытки взлома паролей)
pass in on $wlan_if proto tcp to ($wlan_if) port ssh \
    keep state (max-src-conn 10, max-src-conn-rate 15/5, \
    overload <blocked> flush global)

Активируем пакетный фильтр командой:

# pfctl -ef /etc/pf.conf

Для запуска фильтра на этапе начальной загрузки необходимо добавить следующие строки в файл /etc/rc.conf.local:

# echo 'pf=YES' >>/etc/rc.conf.local

Чтобы разрешить использование authpf, создайте пустой файл:

# touch /etc/authpf/authpf.conf
Затем создадим конфигурацию правил authpf для авторизованных хостов, /etc/authpf/authpf.rules:
wlan_if = "ral0"

# Разрешить авторизованным хостам доступ к OpenVPN-серверу
pass in quick on $wlan_if proto udp from $user_ip to ($wlan_if) \
	port 1194 keep state
Чтобы добавить класс входа в систему для authpf, добавьте эти строки в /etc/login.conf:
# vi /etc/login.conf
authpf:\
	:shell=/usr/sbin/authpf:\
	:tc=default: 

Теперь необходимо добавить пользователей командой adduser, удостоверившись, что вы установили /usr/sbin/authpf в качестве оболочки и класс входа в систему authpf.

Если все работает должным образом, то соединившись с вашей точкой доступа с беспроводного клиента, использующего OpenSSH или PuTTY, вы получите доступ к VPN, который мы сейчас настроим.

Конфигурация VPN-сервера

Мы будем использовать OpenVPN в режиме моста, соединяя беспроводной интерфейс с VPN таким образом, чтобы для прикладных сервисов шифрование трафика проходило незаметно.

После установки OpenVPN из портов или пакетов OpenBSD, необходимо создать сертификаты для сервера и клиентов. Выполните следующие команды с правами пользователя root:

# mkdir -p /etc/openvpn/keys
# cp -r /usr/local/share/examples/openvpn/easy-rsa /etc/openvpn
# chmod 700 /etc/openvpn/keys
# cd /etc/openvpn/easy-rsa
# . ./vars
# ./clean-all
# ./build-ca
# ./build-key-server server
# ./build-key client1
# ./build-key client2
...
# ./build-dh
# cd keys
# /usr/local/sbin/openvpn --genkey --secret ta.key
# mv ca.crt dh1024.pem server.crt server.key ta.key /etc/openvpn/keys
# chmod 644 /etc/openvpn/keys/{ca.crt,dh1024.pem,server.crt}
# chmod 600 /etc/openvpn/keys/{server.key,ta.key}

Распространите среди клиентов на безопасных носителях сертификаты сервера, клиентов: ca.crt, clientXX.crt, а также ключи: clientXX.key и ta.key.

Настроим OpenVPN. Для этого поместим конфигурацию в файл /etc/openvpn/server.conf:

# /etc/openvpn/server.conf: Конфигурация OpenVPN-сервера

daemon openvpn
writepid /var/openvpn/pid
status /var/openvpn/status 10
local 192.168.2.254
port 1194
proto udp
dev tun0
dev-type tap
client-to-client
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem
server-bridge 192.168.1.254 255.255.255.0 192.168.1.100 192.168.1.120
ifconfig-pool-persist /var/openvpn/ipp.txt
push "redirect-gateway local def1"
keepalive 10 120
tls-auth /etc/openvpn/keys/ta.key 0
cipher BF-CBC
max-clients 5
user _openvpn
group _openvpn
persist-key
persist-tun
verb 3
mute 20
chroot /var/empty

Теперь необходимо создать пользователя и группу _openvpn (с правами которого будет запускаться демон) и директорию /var/openvpn.

# groupadd -g 400 _openvpn
# useradd -u 400 -g 400 -c 'OpenVPN Server' -s /sbin/nologin \
	-d /var/openvpn -m _openvpn

Сконфигурируем Ethernet-мост между интерфейсом локальной сети и VPN:

# echo 'link0 up' >/etc/hostname.tun0
# echo -e 'add rl0\nadd tun0\nup' >/etc/bridgename.bridge0
# sh /etc/netstart tun0
# sh /etc/netstart bridge0

Запустите OpenVPN командой:

# /usr/local/sbin/openvpn --config /etc/openvpn/server.conf

И добавьте следующие строки в /etc/rc.local:

if [ -x /usr/local/sbin/openvpn ]; then
	/usr/local/sbin/openvpn --config /etc/openvpn/server.conf
fi 

Конфигурация VPN-клиента

Теперь сконфигурируем нашего первого клиента на базе Linux. Необходимо создать каталог /etc/openvpn/keys, установить права пользователя и группы для OpenVPN, скопировать туда сгенерированные ключи и создать клиентскую конфигурацию OpenVPN, /etc/openvpn/client1.conf:

# /etc/openvpn/client1.conf: Конфигурация OpenVPN-клиента

client
dev tap
proto udp
remote 192.168.2.254 1194
resolv-retry infinite
nobind
user openvpn
group openvpn
persist-key
persist-tun
mute-replay-warnings
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/client1.crt
key /etc/openvpn/keys/client1.key
ns-cert-type server
tls-auth /etc/openvpn/keys/ta.key 1
cipher BF-CBC
verb 3
mute 20
chroot /var/empty

Если клиентская машина работает под управлением OpenBSD, замените "dev tap" на "dev tun0 dev-type tap" в /etc/openvpn/client1.conf.

Настройка Windows клиента аналогична настройке клиента Linux, однако рекомендуется прочитать соответствующий раздел OpenVPN HOWTO.

Для того, чтобы соединиться с сервером, выполните команду:

# openvpn --config /etc/openvpn/client1.conf

Можно воспользоваться утилитой ping для проверки работоспособности соединения.

Необходимо убедиться в том, что весь беспроводной трафик шифруется, для этого можно использовать tcpdump(8) или иной анализатор пакетов:

# tcpdump -env -ttt -i ral0
tcpdump: listening on ral0, link-type EN10MB
Nov 15 21:01:28.865218 0:11:6b:34:91:59 0:e:35:e3:ff:51 0800 223: \
192.168.2.254.1194 > 192.168.2.1.32875: udp 181 (ttl 64, id 20205, len 209) 

# tcpdump -env -ttt -i tun0
tcpdump: WARNING: tun0: no IPv4 address assigned
tcpdump: listening on tun0, link-type EN10MB
Nov 15 21:05:46.569068 be:88:12:eb:0:4b 0:80:48:1d:e:28 0800 98: \
192.168.1.100 > 192.168.1.254: icmp: echo request (id:0926 seq:1) (DF) (ttl 64, id 0, len 84)
Nov 15 21:05:46.569375 0:80:48:1d:e:28 be:88:12:eb:0:4b 0800 98: \
192.168.1.254 > 192.168.1.100: icmp: echo reply (id:0926 seq:1) (DF) (ttl 255, id 44123, len 84) 


OpenBSD.ru www@openbsd.ru
$RuOBSD: wireless.html,v 1.8 2010/11/01 10:57:47 dinar Exp $