vpn по одному из двух интерфейсов

Проблемы установки, настройки и работы Правильной Операционной Системы

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
psj
ефрейтор
Сообщения: 66
Зарегистрирован: 2007-10-29 13:44:50

vpn по одному из двух интерфейсов

Непрочитанное сообщение psj » 2008-02-29 16:30:24

есть роутер у которого 2 интерфейса наружу 1 внутрь локальной сети:

Код: Выделить всё

rt.daycom.ru /etc# ifconfig
vr0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        options=8<VLAN_MTU>
        inet 17.106.95.90 netmask 0xfffffff8 broadcast 17.106.95.95
        inet 17.106.95.91 netmask 0xfffffff8 broadcast 17.106.95.95
        ether 00:19:5b:83:60:e0
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
vr1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        options=8<VLAN_MTU>
        inet 192.168.0.2 netmask 0xffffff00 broadcast 192.168.0.255
        inet 10.0.0.2 netmask 0xffffff00 broadcast 10.0.0.255
        ether 00:1c:f0:0b:b0:e9
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
vr2: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        options=8<VLAN_MTU>
        inet 192.168.1.2 netmask 0xffffff00 broadcast 192.168.1.255
        ether 00:19:21:56:a4:61
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
plip0: flags=108810<POINTOPOINT,SIMPLEX,MULTICAST,NEEDSGIANT> mtu 1500
pfsync0: flags=0<> mtu 2020
        syncpeer: 224.0.0.240 maxupd: 128
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x6
        inet6 ::1 prefixlen 128
        inet 127.0.0.1 netmask 0xff000000
pflog0: flags=141<UP,RUNNING,PROMISC> mtu 33208
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
        inet 192.168.2.1 --> 192.168.2.2 netmask 0xffffffff
        Opened by PID 1140
vr0, vr2 - провайдеры, vr1 - локальная сеть
настроен файрвол, который всех кто хочет попасть из инета во внутрь пропускает по vr0, все исходящие идут через vr2.

Код: Выделить всё

rt.daycom.ru /etc# cat /etc/pf.conf
#Внешние и внутренний интерфейсы.
#
ext_if_a        = "vr0" #первый провайдер
ext_if_b        = "vr2" #второй провайдер
int_if            = "vr1" #локалка
#Шлюзы для каналов.
#
ext_gw_a        = "17.106.95.89"       #для первого провайдера
ext_gw_b        = "192.168.1.1"         #для второго провайдера
net             = "192.168.0.0/24"      #локалка
#TCP/UDP сервисы, обслуживаемые маршрутизатором, то к чему имеется доступ на внешних интерфейсах
#
tcp_svc         = "domain, auth, http, ntp"     #как пример, что то нужно вписать иначе будет биг ошибка :)
udp_svc         = "domain, ntp, 1194"           #аналогично, 1194 - vpn
# Из интернета на почтовый сервер
tcp_mail        ="smtp, pop3"
# закрытые порты из внутренней сети в интернет
tcp_block_int   ="smtp"

mail_server     ="17.106.95.91"
router          ="17.106.95.90"

#Натим, важный момент, именно тут определяется кого куда пускать
#Синтаксис ната, грубо говоря, таков: nat on _интерфейс_ from _откуда_ to _куда_ -> _интерфейс_или_ип_адрес
#
#nat on $ext_if_a from {$net} -> ($ext_if_a:0)
nat on $ext_if_b from {$net} -> ($ext_if_b:0)
# Пробрасываем порты из внутренней сети на SQUID
#
rdr pass on $int_if proto tcp to port http -> 127.0.0.1 port 3128
#Разрешаем сети ходить в интернет, всё остальное блокируем
#
block in on { $ext_if_a $ext_if_b }
block return-rst in on { $ext_if_a $ext_if_b } proto tcp
pass out on { $ext_if_a $ext_if_b } keep state
#Исходящие пакеты в канал, соответствующий адресу источника. Здесь и начинается policy
#
pass out route-to ($ext_if_a $ext_gw_a) from ($ext_if_a) to !(self:network) keep state
pass out route-to ($ext_if_b $ext_gw_b) from ($ext_if_b) to !(self:network) keep state
#А вот policy для входящих пакетов на внешние интерфейсы
#
pass in on $ext_if_a reply-to ($ext_if_a $ext_gw_a) proto udp to $router port { $udp_svc } keep state
pass in on $ext_if_a proto udp from any to $router port { $udp_svc } keep state
#pass in on $ext_if_a proto udp from ($ext_if_a:network) to $router port { $udp_svc } keep state
#
pass in on $ext_if_a reply-to ($ext_if_a $ext_gw_a) proto tcp to port { $tcp_svc } flags S/SA keep state
pass in on $ext_if_a proto tcp from ($ext_if_a:network) to port { $tcp_svc } flags S/SA keep state
#
pass in on $ext_if_a reply-to ($ext_if_a $ext_gw_a) proto icmp to $router keep state
pass in on $ext_if_a proto icmp from ($ext_if_a:network) to $router keep state
# Пускаем почту на почтовый сервер
#
pass in on $ext_if_a reply-to ($ext_if_a $ext_gw_a) proto tcp to $mail_server port { $tcp_mail } flags S/SA keep state
pass in on $ext_if_a proto tcp from ($ext_if_a:network) to $mail_server port { $tcp_mail } flags S/SA keep state
#
pass in on $ext_if_b reply-to ($ext_if_b $ext_gw_b) proto udp to port { $udp_svc } keep state
pass in on $ext_if_b proto udp from any to port { $udp_svc } keep state
#pass in on $ext_if_b proto udp from ($ext_if_b:network) to port { $udp_svc } keep state
#
pass in on $ext_if_b reply-to ($ext_if_b $ext_gw_b) proto tcp to port { $tcp_svc } flags S/SA keep state
pass in on $ext_if_b proto tcp from ($ext_if_b:network) to port { $tcp_svc } flags S/SA keep state
Задача - необходимо в файрволе vpn соединение изнутри сети, на роутере поднят OpenVPN, выпускать по vr0 интерфейсу. Не могу сообразить как это сделать.
Буду благодарен за любые предложения, пожелания.
В правильно заданном вопросе 80% ответа

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2460 рублей (8 CPU, 8Gb RAM, 2x500Gb HDD, RAID 3ware 9750):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
hizel
дядя поня
Сообщения: 9031
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: vpn по одному из двух интерфейсов

Непрочитанное сообщение hizel » 2008-02-29 18:22:52

ээ, тоесть
клиент из vr1 подключается к опенвпн на роутере и выползать в инет по vr0
так?
там опенвпн помоему что то типа tun* создает =/
поэтому по аналогии как у вас прописано
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

Аватара пользователя
psj
ефрейтор
Сообщения: 66
Зарегистрирован: 2007-10-29 13:44:50

Re: vpn по одному из двух интерфейсов

Непрочитанное сообщение psj » 2008-03-03 8:55:13

hizel писал(а):ээ, тоесть
клиент из vr1 подключается к опенвпн на роутере и выползать в инет по vr0
так?
там опенвпн помоему что то типа tun* создает =/
поэтому по аналогии как у вас прописано
Нет, не так. Из сети я просто выхожу в Инет. Я не могу подключиться к роутеру по vpn из Инета. Т.е. снаружи!
В правильно заданном вопросе 80% ответа

paix
лейтенант
Сообщения: 863
Зарегистрирован: 2007-09-24 12:41:05
Откуда: dn.ua
Контактная информация:

Re: vpn по одному из двух интерфейсов

Непрочитанное сообщение paix » 2008-03-03 10:49:33

ну а в чем проблемы то? в конфиг пф закинуть пару строк..по типу

Код: Выделить всё

# VPN
vpn_if="tun0"
vpn_network="10.8.0.0/16"

pass quick on $vpn_if keep state
pass in quick on $ext_if proto tcp  to  $me port  {1194} flags S/SA keep state
дальше смотреть стал ли светится впновский порт с инета, если да, то конектишся и смотриш логи впна.
With best wishes, Sergej Kandyla

Аватара пользователя
psj
ефрейтор
Сообщения: 66
Зарегистрирован: 2007-10-29 13:44:50

Re: vpn по одному из двух интерфейсов

Непрочитанное сообщение psj » 2008-03-03 11:22:36

paix писал(а):ну а в чем проблемы то? в конфиг пф закинуть пару строк..по типу

Код: Выделить всё

# VPN
vpn_if="tun0"
vpn_network="10.8.0.0/16"

pass quick on $vpn_if keep state
pass in quick on $ext_if proto tcp  to  $me port  {1194} flags S/SA keep state
дальше смотреть стал ли светится впновский порт с инета, если да, то конектишся и смотриш логи впна.
Всё несколько сложнее. Во-первых default gatway на vr2. А vpn приходит на vr0. Плюс к этому vpn работает по udp. Поэтому добавил вот такое:
int_if_vpn = "tun0" # vpn
udp_vpn = "1194"
..........
..........
# Пускаем vpn на роутер
#
pass in on $int_if_vpn reply-to ($int_if_vpn $ext_gw_a) proto udp to $router port { $udp_vpn } keep state
pass in on $int_if_vpn proto udp from ($int_if_vpn:network) to $router port { $udp_vpn } keep state
Правда что из этого получится - ещё не знаю :(
В правильно заданном вопросе 80% ответа

paix
лейтенант
Сообщения: 863
Зарегистрирован: 2007-09-24 12:41:05
Откуда: dn.ua
Контактная информация:

Re: vpn по одному из двух интерфейсов

Непрочитанное сообщение paix » 2008-03-03 11:47:31

я бы сказал, по дефолту впн работает на удп. Вообщем это на любителя.

на счет маршрутизации - уже совсем другой вопрос. Но, афаик не транзитные пакеты (установка соединения с хостом) пришедшие на интерфейс, должны с этого же интерфейса и отправляться. Проверьте тспдампом
With best wishes, Sergej Kandyla

Аватара пользователя
psj
ефрейтор
Сообщения: 66
Зарегистрирован: 2007-10-29 13:44:50

Re: vpn по одному из двух интерфейсов

Непрочитанное сообщение psj » 2008-03-03 13:12:06

paix писал(а):Но, афаик не транзитные пакеты (установка соединения с хостом) пришедшие на интерфейс, должны с этого же интерфейса и отправляться.
Я тоже так думаю, что должны. НО увы почему-то не получается. В логах:
Fri Feb 29 23:39:24 2008 us=945872 10.62.26.38:2055 TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
Fri Feb 29 23:39:24 2008 us=945956 10.62.26.38:2055 TLS Error: TLS handshake failed
Fri Feb 29 23:39:24 2008 us=946209 10.62.26.38:2055 SIGUSR1[soft,tls-error] received, client-instance restarting
Fri Feb 29 23:39:26 2008 us=13993 MULTI: multi_create_instance called
Fri Feb 29 23:39:26 2008 us=14107 10.62.26.38:2068 Re-using SSL/TLS context
Fri Feb 29 23:39:26 2008 us=14142 10.62.26.38:2068 LZO compression initialized
Fri Feb 29 23:39:26 2008 us=14308 10.62.26.38:2068 Control Channel MTU parms [ L:1542 D:138 EF:38 EB:0 ET:0 EL:0 ]
Fri Feb 29 23:39:26 2008 us=14357 10.62.26.38:2068 Data Channel MTU parms [ L:1542 D:1450 EF:42 EB:135 ET:0 EL:0 AF:3/1 ]
Fri Feb 29 23:39:26 2008 us=14447 10.62.26.38:2068 Local Options String: 'V4,dev-type tun,link-mtu 1542,tun-mtu 1500,proto UDPv4,comp-lzo,cipher BF-CBC,auth SHA1,keysize 128,key-method 2,tls-server'
Fri Feb 29 23:39:26 2008 us=14475 10.62.26.38:2068 Expected Remote Options String: 'V4,dev-type tun,link-mtu 1542,tun-mtu 1500,proto UDPv4,comp-lzo,cipher BF-CBC,auth SHA1,keysize 128,key-method 2,tls-client'
Fri Feb 29 23:39:26 2008 us=14518 10.62.26.38:2068 Local Options hash (VER=V4): '530fdded'
Fri Feb 29 23:39:26 2008 us=14556 10.62.26.38:2068 Expected Remote Options hash (VER=V4): '41690919'
Fri Feb 29 23:39:26 2008 us=14630 10.62.26.38:2068 TLS: Initial packet from 10.62.26.38:2068, sid=d3ba99db f18e08ae
Fri Feb 29 23:40:26 2008 us=685526 10.62.26.38:2068 TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
Fri Feb 29 23:40:26 2008 us=685608 10.62.26.38:2068 TLS Error: TLS handshake failed
Fri Feb 29 23:40:26 2008 us=685860 10.62.26.38:2068 SIGUSR1[soft,tls-error] received, client-instance restarting
Почему - не понимаю. Ведь всё работало пока еще один интерфейс не подцепил. Уже думаю - может ключи перегенерить?
В правильно заданном вопросе 80% ответа

paix
лейтенант
Сообщения: 863
Зарегистрирован: 2007-09-24 12:41:05
Откуда: dn.ua
Контактная информация:

Re: vpn по одному из двух интерфейсов

Непрочитанное сообщение paix » 2008-03-03 13:57:28

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

(рекомендую телнет + опенвпн в режиме тсп.)
pf route-to, reply-to + тспдамп, пожалуй, будет правильным путем
With best wishes, Sergej Kandyla

Аватара пользователя
psj
ефрейтор
Сообщения: 66
Зарегистрирован: 2007-10-29 13:44:50

Re: vpn по одному из двух интерфейсов

Непрочитанное сообщение psj » 2008-03-04 8:57:40

paix писал(а):для начала неплохобы с маршрутизацией разобраться, чтобы сервер отсылал пакеты куда нужно.

(рекомендую телнет + опенвпн в режиме тсп.)
pf route-to, reply-to + тспдамп, пожалуй, будет правильным путем
C маршрутизацией я разобрался. Проблема в том, что запрос от клиента приходит по интерфейсу vr0 а ответ уходит по vr2. Не могу сообразить каак правила правильно записать. Думаю вот так:
# Пускаем vpn на роутер
#
pass out route-to ($ext_if_a $ext_gw_a) from ($ext_if_a) proto udp port { $udp_vpn } to any keep state
pass in on $ext_if_a reply-to ($ext_if_a $ext_gw_a) proto udp port { $udp_vpn } to $router port { $udp_vpn } keep state
pass quick on $int_if_vpn keep state
Но попробовать смогу только сегодня к обеду.
В правильно заданном вопросе 80% ответа

Аватара пользователя
psj
ефрейтор
Сообщения: 66
Зарегистрирован: 2007-10-29 13:44:50

Re: vpn по одному из двух интерфейсов

Непрочитанное сообщение psj » 2008-03-05 11:02:18

Ну вроде всё заработало. Файрвол привел вот к такому виду:

Код: Выделить всё

rt.daycom.ru /etc# cat pf.conf
#Внешние и внутренний интерфейсы.
#
ext_if_a        = "vr0" #первый провайдер
ext_if_b        = "vr2" #второй провайдер
int_if          = "vr1" #локалка
int_if_vpn      = "tun0, tun1" # vpn

#Шлюзы для каналов.
#
ext_gw_a        = "17.106.95.89"       #для первого провайдера
ext_gw_b        = "192.168.1.1"         #для второго провайдера
net             = "192.168.0.0/24"      #локалка
#TCP/UDP сервисы, обслуживаемые маршрутизатором, то к чему имеется доступ на внешних интерфейсах
#
tcp_svc         = "domain, auth, http, ntp"     #как пример, что то нужно вписать иначе будет биг ошибка :)
udp_svc         = "domain, ntp"                 #аналогично, 1194 - vpn
udp_vpn         = "1194"
# Из интернета на почтовый сервер
tcp_mail        ="smtp, pop3"
# закрытые порты из внутренней сети в интернет
tcp_block_int   ="smtp"

mail_server     ="17.106.95.91"
router          ="17.106.95.90"

set skip on lo0

#Натим, важный момент, именно тут определяется кого куда пускать
#Синтаксис ната, грубо говоря, таков: nat on _интерфейс_ from _откуда_ to _куда_ -> _интерфейс_или_ип_адрес
#
#nat on $ext_if_a from {$net} -> ($ext_if_a:0)
nat on $ext_if_b from {$net} -> ($ext_if_b:0)
# Пробрасываем порты из внутренней сети на SQUID
#
rdr pass on $int_if proto tcp to port http -> 127.0.0.1 port 3128
#Разрешаем сети ходить в интернет, всё остальное блокируем
#
block in on { $ext_if_a $ext_if_b }
block return-rst in on { $ext_if_a $ext_if_b } proto tcp
pass out on { $ext_if_a $ext_if_b } keep state
#Исходящие пакеты в канал, соответствующий адресу источника. Здесь и начинается policy
#
pass out route-to ($ext_if_a $ext_gw_a) from ($ext_if_a) to !(self:network) keep state
pass out route-to ($ext_if_b $ext_gw_b) from ($ext_if_b) to !(self:network) keep state
# Пускаем vpn на роутер
#
#pass out on $ext_if_b route-to ($ext_if_a $ext_gw_a) inet proto udp from $router port { $udp_vpn } to any keep state
pass out on $ext_if_b reply-to ($ext_if_a $ext_gw_a) inet proto udp from $router port { $udp_vpn } to any keep state
pass in on $ext_if_a reply-to ($ext_if_a $ext_gw_a) inet proto udp from any to $router port { $udp_vpn }  keep state
#А вот policy для входящих пакетов на внешние интерфейсы
#
pass in on $ext_if_a reply-to ($ext_if_a $ext_gw_a) proto udp to $router port { $udp_svc } keep state
#pass in on $ext_if_a proto udp from any to $router port { $udp_svc } keep state
pass in on $ext_if_a proto udp from ($ext_if_a:network) to $router port { $udp_svc } keep state
#
pass in on $ext_if_a reply-to ($ext_if_a $ext_gw_a) proto tcp to port { $tcp_svc } flags S/SA keep state
pass in on $ext_if_a proto tcp from ($ext_if_a:network) to port { $tcp_svc } flags S/SA keep state
#
pass in on $ext_if_a reply-to ($ext_if_a $ext_gw_a) proto icmp to $router keep state
pass in on $ext_if_a proto icmp from ($ext_if_a:network) to $router keep state
# Пускаем почту на почтовый сервер
#
pass in on $ext_if_a reply-to ($ext_if_a $ext_gw_a) proto tcp to $mail_server port { $tcp_mail } flags S/SA keep state
pass in on $ext_if_a proto tcp from ($ext_if_a:network) to $mail_server port { $tcp_mail } flags S/SA keep state
#
pass in on $ext_if_b reply-to ($ext_if_b $ext_gw_b) proto udp to port { $udp_svc } keep state
pass in on $ext_if_b proto udp from ($ext_if_b:network) to port { $udp_svc } keep state
#
pass in on $ext_if_b reply-to ($ext_if_b $ext_gw_b) proto tcp to port { $tcp_svc } flags S/SA keep state
pass in on $ext_if_b proto tcp from ($ext_if_b:network) to port { $tcp_svc } flags S/SA keep state
# По внутреннему интерфейсу и vpn пропускаем всё и везде
#
pass quick on { $int_if, $int_if_vpn } all keep state
Vpn работает. Все подключаются. По файловым серверам бегают.
Возникла следующая проблема. На одном из серверов внутри сети поднят терминальный сервер. Снаружи терминальным клиентом к серверу подклюситься не смогли. :(
Может быть кто-то что-то посоветует?
В правильно заданном вопросе 80% ответа