Войти

Показать полную графическую версию : OpenVPN - не совсем стандартное решение, нужна помощь.


Призрак
27-10-2013, 23:09
Здравствуйте, уважаемые участники форума!

Обо всем по порядку. Решил я поднять OpenVPN сервер на FreeBSD, чтобы подключаться к нему из дома, для того, чтобы подключиться к компьютеру на работе. Вот информация об операционной системе:

root@test:/usr/home/Pavel # uname -a
FreeBSD test.xxxx.ru 9.1-RELEASE FreeBSD 9.1-RELEASE #0: Sun Oct 27 21:13:44 YAKT 2013 root@test.psfa.ru:/usr/src/sys/i386/compile/PFA i386
root@test:/usr/home/Pavel #

Поднял я OpenVPN сервер, сгенерировал сертификаты, вот конфигурационные файлы:

1. Для сервера:

mode server
tls-server
daemon
ifconfig 172.31.254.1 255.255.255.0
server 172.31.254.0 255.255.255.0
port 1194
proto tcp-server
dev tap0
dh /usr/local/etc/openvpn/dh2048.pem
ca /usr/local/etc/openvpn/CA_cert.pem
cert /usr/local/etc/openvpn/certs/server.pem
key /usr/local/etc/openvpn/keys/server.pem
crl-verify /usr/local/etc/openvpn/crl/crl.pem
tls-auth /usr/local/etc/openvpn/ta.key 0
#push "redirect-gateway"
client-config-dir /usr/local/etc/openvpn/ccd
#ifconfig-pool-persist /usr/local/etc/openvpn/ipp.txt 0
keepalive 10 120
client-to-client
comp-lzo
persist-key
user nobody
group nogroup
verb 3
log-append /usr/local/etc/openvpn/openvpn.log


2. Для клиента (клиент на Windows 7):

client
dev tap
proto tcp
remote 195.19.170.XXX 1194 (как раз имя удаленного сервера, имеющего выход в Интернет с другим провайдером, адрес белый)
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
ns-cert-type server
tls-client
tls-remote test.xxxx.ru
ca "C:\\OpenVPN\\CA_cert.pem"
cert "C:\\OpenVPN\\COitWork.pem"
key "C:\\OpenVPN\\KOitWork.pem"
tls-auth "C:\\OpenVPN\\ta.key" 1
tun-mtu 1500
mssfix 1450
route-method exe
route delay 2
verb 3

После этого добавил в /boot/loader.conf строчку

If_tap_load=”YES”

После этого у меня в настройках интерфейса начал появляться сетевой интерфейс tap0, через который, собственно, и подключаются клиенты к серверу.

root@test:/boot # ifconfig
re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=8209b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_MAGIC,LINKSTATE>
ether 00:21:91:d6:f0:06
inet 195.19.170.XXX netmask 0xffffff00 broadcast 195.19.170.255
inet6 fe80::221:91ff:fed6:f006%re0 prefixlen 64 scopeid 0x4
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
media: Ethernet autoselect (1000baseT <full-duplex>)
status: active
ipfw0: flags=8801<UP,SIMPLEX,MULTICAST> metric 0 mtu 65536
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x6
inet 127.0.0.1 netmask 0xff000000
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
tap0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=80000<LINKSTATE>
ether 00:bd:97:28:00:00
inet6 fe80::2bd:97ff:fe28:0%tap0 prefixlen 64 scopeid 0x7
inet 172.31.254.1 netmask 0xffffff00 broadcast 172.31.254.255
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
Opened by PID 2249
root@test:/boot #

Приведу часть файла сервера OpenVPN /etc/rc.conf, касающийся данного вопроса:

hostname="test.xxxx.ru"
keymap="ru.koi8-r.kbd"
ifconfig_re0=" inet 195.19.170.XXX netmask 255.255.255.0"
defaultrouter="195.19.170.XXX"
gateway_enable="YES"
sshd_enable="YES"
# Set dumpdev to "AUTO" to enable crash dumps, "NO" to disable
dumpdev="AUTO"

firewall_enable="YES"
firewall_nat_enable="YES"
firewall_script="/etc/rc.ipfw"

openvpn_enable="YES"
openvpn_configfile="/usr/local/etc/openvpn/openvpn.conf"

Далее приведу часть файла ядра системы сервера OpenVPN , касающийся данного вопроса:

options IPFIREWALL
options IPFIREWALL_NAT
options IPFIREWALL_FORWARD
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=500
options LIBALIAS
options ROUTETABLES=2
options DUMMYNET
options HZ="1000"

После этого добавил в файл скрипта брандмауэра необходимые правила, чтобы все заработало (так как файл большой, публикую только необходимые правила, касающиеся данного вопроса:

#!/bin/sh

fwcmd="/sbin/ipfw -q"
eth0="lo0"
eth1="re0"
vif="tap0"
local="127.0.0.0/8"
ks="keep-state"

${fwcmd} add 01250 allow all from any to any via ${vif}
${fwcmd} add 01260 allow tcp from any to 195.19.170.XXX 1194 in via ${eth1}
${fwcmd} add 01270 allow tcp from any to me 26 in via ${vif} ${ks}

${fwcmd} nat 1 config log if ${eth1} reset same_ports deny_in
${fwcmd} add 01273 nat 1 ip from any to any via ${eth1}

После этого я стартанул OpenVPN сервер и попытался подключиться к нему с клиента. Все заработало просто идеально, произошло подключение к серверу, клиент получил доступ к серверу, получил IP 172.31.254.2, пинг до сервера, до интерфейса tap0 172.51.254.1 доходил.

Но появилась одна проблема, не очень кстати приятная. Дома я подключен через Ростелеком, но мне хотелось бы, активировав подключение по OpenVPN, подключаться к тому провайдеру, к которому подключен OpenVPN сервер. Но, несмотря на мои попытки, ничего у меня так и не получилось. Кстати, при подключении к OpenVPN с клиента пинговался и основной шлюз, прописанный на сервере OpenVPN – 195.19.170.XXX

Я пытался засунуть две строчки в конфигурационный файл OpenVPN сервера:

push "redirect-gateway"
push "dhcp-option DNS 195.19.170.XXX"

при этом в адресе основного шлюза TAP адаптера на клиенте OpenVPN Windows 7 появлялся основной шлюз 172.51.254.1

Но при этом случались весьма неприятные события:

1. Пропадал доступ в Интернет
2. Пропадал пинг до основного шлюза, прописанного на DNS сервере – 195.19.170.XXX

В связи с этим, у меня есть следующие вопросы:

1. Что не так в моих конфигурационных файлах, почему я не могу подключиться к Интернету с помощью другого провайдера через OpenVPN в моем конкретном случае?
2. Нужно ли было использовать ядерный NAT для решения моей задачи?
3. В том случае, если к OpenVPN серверу подключится еще один клиент, как мне организовать подключение к этому клиенту через сервер OpenVPN с моего домашнего компьютера?

Призрак
30-10-2013, 06:18
Выходит, я зря вернулся на этот недофорум. Толку от него, если задаешь вопрос, и не получаешь на него ответа. Только зря время потерял.

pashos_nix
01-11-2013, 19:52
Призрак, а что конкретно в логах на freebsd?

RedRat
10-11-2013, 15:57
1. Чтобы подключаться к Инету через ОпенВПН, надо чтобы на локальном компе шлюз по умолчанию был настроен на шлюз в ОпенВПН. Попробуй на виндовом компе после подключения дать команду route print и посмотри, куда пакеты уходят по умолчанию.

2. Нет, NAT для этого совсем не нужен, только правильная маршрутизация.

3. Опция --client-to-client




© OSzone.net 2001-2012