Здравствуйте!
Стоит задача объединить офисы компании (филиалы по различным областям). Для решения данной задачи выбрал OpenVPN, в качестве дистрибутива Debian. Что получилось: клиенты из филиалов видят сетку головного офиса - работают с ней, а клиенты головного офиса достучаться до компов филиалов не могут.
Ниже постараюсь максимально подробно изложить настройки и архитектуру сети.
PS: буду признателен любой помощи, спасибо!
Что имеем
1. Сеть№1 (головной офис):
========================
Для выхода в интернет провайдер предлагает pppoe соединение. Для поднятия последнего использую роутер, на котором настроен проброс портов с 1024 по 65535 (для любого протокола). После роутера трафик приходит на шлюз с двумя сетевыми картами (eth0 и eth1 соответственно). Схематично это выглядит следующим образом:
PPPOE 192.168.0.1 192.168.1.1(eth1)
Интернет <==========> | Роутер | <=============> | Шлюз | <==============> | Локальная сеть головного офиса (192.168.1.0/24)|
217.170.1.1 192.168.0.2(eth0) 192.168.1.0/24
IP на выходе в интернете: 217.170.1.1
IP Роутера: 192.168.0.1
IP шлюза (eth0 - смотрит в сетку роутера): 192.168.0.2
IP шлюза (eth1 - смотрит в сетку офиса): 192.168.1.1
все адреса статические.
2. Сеть№2 (филиал):
Провайдер обеспечивает выход в интернет "напрямую", без необходимости поднятия виртуальных интерфейсов. Для раздачи интернета используется аналогичным образом настроенный жлюз. Схематично это выглядит следующим образом:
eth0 eth1
Интернет <===========> | Шлюз | <===========> | Локальная сеть филиала (192.168.2.0/24) |
217.170.2.1 192.168.2.1
Настройки шлюза:
IP Адрес в Интернете (eth0): 217.170.2.1
IP Адрес для связи с локалкой (eth1): 192.168.2.1
все адреса статические.
Выше, по возможности, максимально подробно описана структура сетей. Теперь собственно сама VPN - сеть.
3. Сеть №3 (VPN сеть)
В качестве VPN - сервера выступает шлюз первой сети. в качестве клиента - шлюз сети №2.
В качестве VPN - сети используется подсеть 192.168.255.0/24.
Конфигурационный файл VPN сервера:
Показать
# [NETWORK SETTINGS]
port 2000
proto tcp
dev tun0
# [KEYS PATCH]
ca /etc/openvpn/keys/office1/ca.crt
cert /etc/openvpn/keys/office1/server.crt
key /etc/openvpn/keys/office1/server.key
dh /etc/openvpn/keys/office1/dh2048.pem
# [ROUTE]
server 192.168.255.0 255.255.255.0
route 192.168.2.0 255.255.255.0
push "route 192.168.1.0 255.255.255.0"
client-to-client
# [COMPRESS TRAFIC]
comp-lzo
# [PACKET SETTINGS]
cipher BF-CBC
keepalive 10 60
# [LOG]
status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log
verb 3
Конфигурационный файл VPN-клиента (Сеть №2):
Показать
dev tun1
proto tcp
remote 217.170.1.1
port 2000
client
pull
ca /etc/openvpn/keys/office1/ca.crt
cert /etc/openvpn/keys/office1/client.crt
key /etc/openvpn/keys/office1/client.key
dh /etc/openvpn/keys/office1/dh2048.pem
comp-lzo
cipher BF-CBC
verb 3
log /var/log/openvpn/office1.log
4. Настройки iptables
На обоих шлюзах стоят правила "всё разрешено, ничего не запрещено" (в целях диагностики). Инет в локалку раздаётся по SNAT, за исключение HTTP (через Squid). На VPN интерфейсах включён MASQUERADE.
4.1 Сеть №1
Показать
#!/bin/bash
# Constants
INET="eth0"
INET_IP="192.168.0.2"
LOCAL="eth1"
LOCAL_IP="192.168.1.1"
LOCAL_RANGE="192.168.1.0/255.255.255.192" # 192.168.1.1-192.168.1.62
EXT_IP="217.170.1.1"
TV="192.168.1.36"
VPN="tun+"
LEVEL1="NEW"
LEVEL2="NEW,ESTABLISHED"
# Enable kernel modules
echo "1" > /proc/sys/net/ipv4/ip_forward
# Flush all chains
iptables -t nat -X
iptables -t nat -F
iptables -t filter -X
iptables -t filter -F
iptables -t mangle -X
iptables -t mangle -F
# Set up default rules
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
# NAT_chain
iptables -t nat -A PREROUTING -p tcp -i $LOCAL -m multiport --destination-ports 80,8080 -j REDIRECT --to-ports 3128
iptables -t nat -A POSTROUTING --source $LOCAL_RANGE --out-interface $INET --destination 0/0 -j SNAT --to-source $INET_IP
iptables -t nat -A POSTROUTING --out-interface $VPN -j MASQUERADE
# FILTER_chain
# INPUT
4.2 Сеть №2
Показать
#!/bin/bash
# Constants
INET="eth0"
INET_IP="217.170.2.1"
LOCAL="eth1"
LOCAL_IP="192.168.2.1"
LOCAL_RANGE="192.168.2.0/255.255.255.0"
VPN="tun+"
LEVEL1="NEW"
LEVEL2="NEW,ESTABLISHED"
LEVEL3="RELATED,ESTABLISHED"
# Enable kernel modules
echo "1" > /proc/sys/net/ipv4/ip_forward
# Flush all chains
iptables -t nat -X
iptables -t nat -F
iptables -t filter -X
iptables -t filter -F
iptables -t mangle -X
iptables -t mangle -F
# Set up default rules
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
# NAT_chain
iptables -t nat -A PREROUTING -p tcp -i $LOCAL -m multiport --destination-ports 80,8080 -j REDIRECT --to-ports 3128
iptables -t nat -A POSTROUTING --source $LOCAL_RANGE --out-interface $INET --destination 0/0 -j SNAT --to-source $INET_IP
iptables -t nat -A POSTROUTING --out-interface $VPN -j MASQUERADE
# FILTER_chain
# INPUT
5. Маршрутизация.
После установки соединения между VPN - сервером и VPN - клиентом, имеем следующие маршруты на шлюзах.
5.1 Сеть №1
Показать
192.168.255.2 dev tun0 proto kernel scope link src 192.168.255.1
192.168.2.0/24 via 192.168.255.2 dev tun0
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.1
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.2
192.168.255.0/24 via 192.168.255.2 dev tun0
default via 192.168.0.1 dev eth0
5.2 Сеть №2
Показать
192.168.255.5 dev tun1 proto kernel scope link src 192.168.255.6
217.170.2.1/30 dev eth0 proto kernel scope link src 217.170.2.1
192.168.2.0/24 dev eth1 proto kernel scope link src 192.168.2.1
192.168.1.0/24 via 192.168.255.5 dev tun1
192.168.255.0/24 via 192.168.255.5 dev tun1
default via 217.170.2.1 dev eth0