Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Общий по FreeBSD (http://forum.oszone.net/forumdisplay.php?f=10)
-   -   OpenVPN - не совсем стандартное решение, нужна помощь. (http://forum.oszone.net/showthread.php?t=270816)

Призрак 27-10-2013 23:09 2242183

OpenVPN - не совсем стандартное решение, нужна помощь.
 
Здравствуйте, уважаемые участники форума!

Обо всем по порядку. Решил я поднять 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 2243631

Выходит, я зря вернулся на этот недофорум. Толку от него, если задаешь вопрос, и не получаешь на него ответа. Только зря время потерял.

pashos_nix 01-11-2013 19:52 2245596

Призрак, а что конкретно в логах на freebsd?

RedRat 10-11-2013 15:57 2251281

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

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

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


Время: 16:22.

Время: 16:22.
© OSzone.net 2001-