Тут описан вариант настройки openvpn-клиента, с которым столкулся я. Основная проблема, которую пришлось решать, это то что ip провайдер раздает с помощью dhcp-сервера, а не средствами openvpn.
1. Установка openvpn
К моменту установки, роутер был прошит прошивкой Олега. Были сделаны начальные настройки. Т.е. работал как минимум mc.
Сама установка.
Тут все просто:
Code:
ipkg install openvpn
Возможно, могут понадобиться ещё какие-то пакеты, например awk. Но это все можно поставить при необходимости из репозитария.
В /opt/etc/openvpn/ ложим файлики взятые у провайдера:
vpnclientca.crt
vpnclientcert.crt
vpnclientkey.key
vpnclientta.key
Туда же, ложим конфиг openvpn:
mz.ovpn:
Code:
dev tap0
client
remote-random
remote 10.253.0.18 5050
remote 10.253.0.18 5051
remote 10.253.0.18 5050
remote 10.253.0.29 5051
tls-client
cipher none
ca /opt/etc/openvpn/vpnclientca.crt
cert /opt/etc/openvpn/vpnclientcert.crt
key /opt/etc/openvpn/vpnclientkey.key
tls-auth /opt/etc/openvpn/vpnclientta.key 1
proto udp
verb 2
mute 5
keepalive 30 60
up "/opt/etc/openvpn/mz-openvpn.up"
down "/opt/etc/openvpn/mz-openvpn.down"
#dhcp-option DISABLE-NBT
#dhcp-option DOMAIN vpn
log "/opt/var/log/openvpn.log"
Провайдер предоставляет 4 конфига, для подключения к разным портам двух серверов, но я собрал их в один конфиг. Кроме-то пути к ключам и сертификатам, исправлены на "полные", т.е. /opt/etc/openvpn/. Так же указан интерфейс tap0
Ну и два скипта, отрабатывающие при поднятии соединения и при разрыве. Они несут чисто информационную роль. На работу openvpn соединения они не влияют.
mz-openvpn.up
Code:
#!/bin/sh
/usr/bin/logger -t $(basename $0) "started [$@]"
mz-openvpn.down
Code:
#!/bin/sh
/usr/bin/logger -t $(basename $0) "stoped [$@]"
Не забыть их сделать исполняемыми.
И сам стартовый скрипт /opt/etc/init.d/S20openvpn
Code:
#!/bin/sh
NAME="OpenVPN Client"
PIDFILE=/opt/var/run/openvpn-mz.pid
start() {
echo "Starting $NAME... "
/opt/sbin/openvpn --daemon --writepid $PIDFILE --config /opt/etc/openvpn/mz.ovpn --script-security 3
}
stop() {
echo "Shutting down $NAME... "
[ -f ${PIDFILE} ] && kill `cat ${PIDFILE}`
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 1
start
;;
*)
echo "Usage: $0 (start|stop|restart)"
exit 1
;;
esac
exit 0
2. Изменения в скриптах
Для того чтобы все работало нужно внести некоторые изменения в предопределенные скрипты:
В post-boot
Code:
# для работы openvpn
insmod tun.o
В post-mount
Code:
# создаю интерфейс для дальнешего запуска opnvpn на нём
/opt/sbin/openvpn --mktun --dev tap0
ifconfig tap0 0.0.0.0 promisc up
3. Настройка dhcp-клиента (udhcpc)
В роутере используется udhcpc и другого клиента найти я не смог. Но поскольку встроенный клиент ни чего не знает про tap0, я добавил типовые скрипты udhcpc. (я их подсмотрел в ubuntu).
Итак.
Создаем каталог /opt/etc/udhcpc и ложим туда следующие файлы:
default.script
Code:
#!/bin/sh
# Currently, we only dispatch according to command. However, a more
# elaborate system might dispatch by command and interface or do some
# common initialization first, especially if more dhcp event notifications
# are added.
exec /opt/etc/udhcpc/default.$1
default.bound
Code:
#!/bin/sh
# Sample udhcpc bound/renew script
# Uncomment this to allow dhcpcd to set hostname of the host to the
# hostname option supplied by DHCP server.
#SET_HOSTNAME='yes'
RESOLV_CONF="/etc/resolv.conf1"
[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"
[ -n "$subnet" ] && NETMASK="netmask $subnet"
/sbin/ifconfig $interface $ip $BROADCAST $NETMASK
if [ -n "$hostname" -a -n "$SET_HOSTNAME" ]
then
local current_hostname=$(hostname)
if [ -z "$current_hostname" -o "$current_hostname" = "(none)" ]; then
hostname "$hostname"
fi
fi
if [ -n "$router" ]
then
echo "Resetting default routes"
for i in `/sbin/route -n | grep ^default.*$interface`
do
route del default gw 0.0.0.0 dev $interface
done
for i in $router
do
/sbin/route add default gw $i dev $interface
done
fi
# Update resolver configuration file
R=""
[ -n "$domain" ] && R="domain $domain
"
for i in $dns
do
echo adding dns $i
R="${R}nameserver $i
"
done
if [ -x /sbin/resolvconf ] ; then
echo -n "$R" | resolvconf -a "${interface}.udhcpc"
else
echo -n "$R" > "$RESOLV_CONF"
fi
#/tmp/local/sbin/post-firewall `basename $0` $argument
if [ -e /opt/etc/udhcpc/firewall-tap0.sh ]
then
/opt/etc/udhcpc/firewall-tap0.sh
fi
default.deconfig
Code:
#!/bin/sh
# Sample udhcpc deconfig script
if [ -x /sbin/resolvconf ] ; then
resolvconf -d "${interface}.udhcpc"
fi
/sbin/ifconfig $interface 0.0.0.0
default.leasefail
Code:
#!/bin/sh
# Sample udhcpc leasefail script
echo Lease failed: $message
default.nak
Code:
#!/bin/sh
# Sample udhcpc nak script
echo Received a NAK: $message
default.renew
Code:
#!/bin/sh
# Sample udhcpc bound/renew script
# Uncomment this to allow dhcpcd to set hostname of the host to the
# hostname option supplied by DHCP server.
#SET_HOSTNAME='yes'
RESOLV_CONF="/etc/resolv.conf1"
[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"
[ -n "$subnet" ] && NETMASK="netmask $subnet"
/sbin/ifconfig $interface $ip $BROADCAST $NETMASK
if [ -n "$hostname" -a -n "$SET_HOSTNAME" ]
then
local current_hostname=$(hostname)
if [ -z "$current_hostname" -o "$current_hostname" = "(none)" ]; then
hostname "$hostname"
fi
fi
if [ -n "$router" ]
then
echo "deleting routers"
while /sbin/route del default gw 0.0.0.0 dev $interface
do :
done
for i in $router
do
/sbin/route add default gw $i dev $interface
done
fi
# Update resolver configuration file
R=""
[ -n "$domain" ] && R="domain $domain
"
for i in $dns
do
echo adding dns $i
R="${R}nameserver $i
"
done
if [ -x /sbin/resolvconf ] ; then
echo -n "$R" | resolvconf -a "${interface}.udhcpc"
else
echo -n "$R" > "$RESOLV_CONF"
fi
#if [ -e /opt/etc/udhcpc/firewall-tap0.sh ]
#then
# /opt/etc/udhcpc/firewall-tap0.sh
#fi
В эти скрипты были внесены следующие изменения:
Во первых, мне не нужно было менять файл resolv.conf, поэтому в скриптах я исправил его на resolv.conf1
Во вторых, в скрипт bound, добавил запуск скрипта, который добавляет правила для интерфейса tap0 с iptables
Теперь скрипт запуска udhcpc на интерфейсе tap0.
/opt/etc/init.d/S11udhcpc-mz
Code:
#!/bin/sh
NAME="UDHCPC for openvpn on MediaZona"
start() {
echo "Starting $NAME... "
/sbin/udhcpc -i tap0 -p /var/run/udhcpc-mz.pid -s /opt/etc/udhcpc/default.script -b
}
stop() {
echo "Shutting down $NAME... "
cat /var/run/udhcpc-mz.pid | xargs -i kill -TERM {}
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 1
start
;;
*)
echo "Usage: $0 (start|stop|restart)"
exit 1
;;
esac
exit 0
продолжение в следующем сообщении....