Некоторое время назад мы рассматривали задачу организации централизованного доступа в Интернет для офисов, расположенных в бизнес-центре. Сейчас рассмотрим немного другую задачу: у организации свой офис, со своим Интернет-каналом, но кроме доступа в Интернет из офиса, нужно организовать доступ в офисную сеть для сотрудников, работающих удалённо.
Приступаем к решению поставленной задачи.
- Мы будем использовать сервер под управлением операционной системы Ubuntu Server 9.10;
- На внешнем (eth0) интерфейсе сервера будет адрес 1.2.3.4;
- Локальная сеть имеет адресное пространство 192.168.2.0/24 и на внутреннем интерфейсе сервера (eth1) находится адрес 192.168.2.1;
- Офисный шлюз также будет DNS-сервером для своих сетей;
- Для доступа удалённых пользователей будет использоваться протокол PPTP (так как PPTP-клиент встроен в ОС Windows, которая чаще всего используется на клиентских компьютерах).
Первым делом установим операционную систему на сервер в самой минимальной конфигурации (с этим ни у кого не должно возникнуть проблем) и настроим сетевые интерфейсы.
Дальше создадим скрипт /root/scripts/firewall.sh следующего содержания:
#!/bin/sh # Минимальные настройки скрипта # Внешний интерфейс IF_EXT="eth0" # Внутренний интерфейс IF_INT="eth1" # Локальная сеть NET_INT="192.168.2.0/255.255.255.0" # На всякий случай сбрасываем все правила iptables -F iptables -F -t nat # Устанавливаем политики по умолчанию: # Никого не пускать iptables -P INPUT DROP # Всех выпускать iptables -P OUTPUT ACCEPT # Мимо нас никто не ходит iptables -P FORWARD DROP # Впускаем ответы на запросы, которые сами отправили iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # Разрешаем весь трафик на внутреннем интерфейсе iptables -A INPUT -i lo -j ACCEPT # Разрешаем весь трафик со стороны локальной сети iptables -A INPUT -i ${IF_INT} -s ${NET_INT} -j ACCEPT # Разрешаем весь трафик, который необходим для работы PPTP-сервера iptables -A INPUT -m tcp -p tcp --dport 1723 -j ACCEPT iptables -A INPUT -p gre -j ACCEPT # NAT для локальной сети на внешнем интерфейсе iptables -t nat -A POSTROUTING -s ${NET_INT} -j MASQUERADE -o ${IF_EXT} # Разрешаем пересылку пакетов из локальной сети наружу iptables -A FORWARD -i ${IF_INT} -o ${IF_EXT} -s ${NET_INT} -j ACCEPT # Разрешаем пересылку в локальную сеть ответов на исходящие запросы iptables -A FORWARD -i ${IF_EXT} -o ${IF_INT} -d ${NET_INT} -m state --state RELATED,ESTABLISHED -j ACCEPT
Чтобы этот скрипт выполнялся при загрузке нужно добавить его вызов в файле /etc/rc.local:
/root/scripts/firewall.sh
Затем нужно разрешить пересылку IP-пакетов в ядре. Для этого нужно добавить в файл /etc/sysctl.conf строку:
net.ipv4.ip_forward=1
Всё сделанное выше - это только изменения конфигурационных файлов и написание скриптов. Необходимо произвести некоторые действия, чтобы всё это начало работать, но мы сделаем это чуть позже. Пока же установим DNS-сервер, который находится в пакете bind9. Установим этот пакет:
apt-get install bind9
DNS-сервер начинает работать сразу после установки, какая либо особая настройка в нашем случае ему не требуется. Теперь озадачимся установкой PPTP-сервера. Мы уже решали эту задачу, однако сейчас мы рассмотрим не абстрактное решение, а реальное для конкретных условий. Здесь первым делом нужно установить пакет pptpd:
apt-get install pptpd
Далее добавим в файл /etc/ppp/pptpd-options следующие строки:
# Адрес DNS-сервера, который будет передаваться клиенту ms-dns 192.168.2.1 # Не пытаться восстановить соединение после отключения клиента # Если не указать эту опцию - pptpd будет безуспешно восстанавливать соединение и ругаться в логи nopersist
Далее допишем в конец файла /etc/pptpd.conf строки:
# IP-адрес нашего сервера (его будут видеть все клиенты как remote-host в свойствах своего ppp-соединения) localip 192.168.2.1 # Диапазон адресов клиентов (используется для тех клиентов, для которых IP-адрес не указан явно) remoteip 192.168.2.250-255
Переходим к созданию пользователей для нашего PPTP-сервера. Они создаются добавлением в файл /etc/ppp/chap-secrets строк вида:
# Если пользователь должен динамически получать IP-адрес # из диапазона remoteip в pptpd.conf: user1 pptpd password1 "*" # Если мы хотим привязать определённый IP к логину: user2 pptpd password2 "192.168.2.101"
Когда клиент подключается к серверу, для него создаётся новый ppp-интерфейс, однако поскольку для этого интерфейса нет правил iptables, а политики по умолчанию блокируют весь "левый" трафик, то клиент, подключившись, не сможет работать. Чтобы работа стала возможной, нужно при создании нового интерфейса добавлять дополнительные правила в iptables, а при уничтожении - убирать эти правила.
Чтобы при создании интерфейса добавлялись правила, нужно создать скрипт /etc/ppp/ip-up.d/99_pptp_vpn следующего содержания:
#!/bin/sh # Извлекаем из переменных окружения имя интерфейса и IP-адрес клиента IF_PPTP=${PPP_IFACE} IP_PPTP=${PPP_REMOTE} # Интерфейсы, через которые мы готовы пускать клиента # Здесь нужно как минимум указать внутренний интерфейс # Однако если мы хотим так же выпустить клиента в Интернет - нужно указать и внешний интерфейс OUT_IFACES="eth0 eth1" # Разрешаем использование нашего DNS-сервера iptables -A INPUT -m udp -p udp --dport 53 -i ${IF_PPTP} -s ${IP_PPTP} -j ACCEPT # Перебираем интерфейсы for IF_EXT in ${OUT_IFACES}; do # Разрешаем трафик с клиента через этот интерфейс iptables -A FORWARD -i ${IF_PPTP} -o ${IF_EXT} -s ${IP_PPTP} -j ACCEPT # Разрешаем трафик с этого интерфейса в сторону клиента iptables -A FORWARD -i ${IF_EXT} -o ${IF_PPTP} -d ${IP_PPTP} -m state --state RELATED,ESTABLISHED -j ACCEPT done
Для удаления правил при уничтожении интерфейса (то есть при отключении клиента) создадим скрипт /etc/ppp/ip-down.d/99_pptp_vpn, следующего содержания:
#!/bin/sh # Извлекаем из переменных окружения имя интерфейса и IP-адрес клиента IF_PPTP=${PPP_IFACE} IP_PPTP=${PPP_REMOTE} # Интерфейсы, через которые мы были готовы пускать клиента OUT_IFACES="eth0 eth1" # Удаляем правило, разрешающее клиенту использование нашего DNS iptables -D INPUT -m udp -p udp --dport 53 -i ${IF_PPTP} -s ${IP_PPTP} -j ACCEPT # Перебираем интерфейсы for IF_EXT in ${OUT_IFACES}; do # Удаляем правила, которые разрешали клиенту пересылку пакетов между интерфейсами iptables -D FORWARD -i ${IF_PPTP} -o ${IF_EXT} -s ${IP_PPTP} -j ACCEPT iptables -D FORWARD -i ${IF_EXT} -o ${IF_PPTP} -d ${IP_PPTP} -m state --state RELATED,ESTABLISHED -j ACCEPT done
Здесь мы используем тот факт, что все скрипты, которые расположенные в директории /etc/ppp/ip-up.d, выполняются при создании нового ppp-интерфейса, а скрипты из директории /etc/ppp/ip-down.d выполняются при его уничтожении. Перед выполнением этих скриптов устанавливается ряд переменных окружения, в частности:
- PPP_IFACE - имя создаваемого интерфейса;
- PPP_REMOTE - IP-адрес второй точки создаваемого ppp-соединения (в случае PPTP-сервера - адрес клиента).
Всё. Теперь остаётся только перезагрузить сервер, чтобы все изменения вступили в силу, и шлюз будет готов к использованию. Если вы не любите (и правильно делаете;)) перезагружать оборудование, то вы можете применить конфигурацию с помощью следующих команд:
# Загружаем правила iptables /root/scripts/firewall.sh # Перечитываем sysctl.conf sysctl -p # Перезапускаем PPTP-сервер: invoke-rc.d pptpd restart
В качестве продолжения можно настроить проверку http-трафика на вирусы, фильтрацию рекламы, учёт трафика. Чтобы ограничить аппетиты удалённых пользователей, можно лимитировать им скорость. Если у организации несколько офисов, то можно так же настроить обмен трафиком между ними с помощью OpenVPN. Но всё это мы оставим читателю.
На этом всё. Приятной работы!
Корректор: Регина Васильева (reggi86@mail.ru)
morbo 2009-12-11 14:39:13 (#)