JustKowalsky
Пользователь не зарегистрирован или пожелал остаться анонимным
Начну, пожалуй, с причин, по которым я захотел его. Живу я с недавних пор в районе, где проводного интернета нет, а мобильный по LTE представлен только одним оператором. После переезда я расчехлил свой старый TP-LINK MR 3020, припаял разъем под антенну wifi и накрутил саму антенну, в usb вставил купленный у друга huawei m150-2 (E3372s). Все было замечательно, пока единственный доступный оператор с единственным "безлимитным" тарифом не решил брать 200% сверху за факт "раздачи" интернета. Итого - 300%. Я такие вещи обычно называю - "о***ли".
На все это наложилось нежелание постоянно видеть сообщение, что такой-то сайт закрыт по решению каких-то там дядек, знающих лучше меня, как мне жить. А интернет нужен для работы. И привык я смотреть фильмы и сериалы онлайн, а то и в UO на FW погонять изредка.
То есть скорость скачивания и задержки должны быть приемлимыми.
К тому же, я заметил, что вечерами явно присутствует ограничение на число соединений. то есть - открываем 10 вкладок, 11-я уже говорит об ошибке - "соединение сброшено". Закрываем какую-либо, обновляем 11-ю - все открывается.
Я хотел установить клиента VPN сразу в роутере, что позволило бы не заморачиваться с клиентами на конечных устройствах (два андроид-фона, медиацентр на pi2/openelec, пара ноутов) и скрыть от провайдера сам факт раздачи. Провайдер должен видеть один шифрованный канал на подходящий для этого порт.
Популярных технологий, имеющих возможность стартануть на роутере, было две. Это L2TP и OpenVPN. Для первой даже была вебморда, но, как я ни старался - клиентская часть не поднималась. А, да. В "родной" прошивке отсутствовала возможность использовать L2TP через usb 3g/4g, только как авторизационная составляющая для WAN-порта (ethernet). С openwrt я был на "вы", и осторожно, поэтому предпочел поискать готовую прошивку, которой можно было бы прошиться через стандартную вебморду.
Построена она на openwrt, поэтому сия инструкция сгодится для любой openwrt - прошивки с установленным пакетом openvpn, да и для других кастомных прошивок тоже.
Итак - OpenVPN. Серверная часть. Опыт работы с ним уже был, пусть и без клиентской части в роутере. Я много работаю с дистрибутивами CentOS, преимущественно 6.X, поэтому её и выбрал. Нам понадобится vps/vds сервер, который можно относительно недорого арендовать. У меня была возможность протестировать три площадки, и по итогам я сделал свой выбор. Рассматривал площадки исключительно в РФ, хотелось комфортной скорости в рунете. Как ни крути, с зарубежными площадками есть такие проблемы.
Первая площадка - недорогой VDS на kvm (более подходящая технология виртуализации), 129р/мес, 400мб ОЗУ, ssd, MSK. Пинги радуют, но общая скорость маловата.
Вторая площадка - kvm, Новосибирск. 400р. Ресурсы сервера хорошие. Пинги не радуют, скорость по итогу тоже.
Третья площадка - OpenVZ, MSK, 1Gb ОЗУ, ssd, 299р. (UDP: полез проверять цены и выяснил, что тарифы подняли, но ресурсов значительно больше. Подробнее в самом конце поста). Пришлось попросить техподдержку подключить tun/tap девайсы, сделайте это сразу, если у Вас OpenVZ.
Как Вы уже поняли, ограничения на доступы к сайтам не распространяются на хостинги и ДЦ, не предназначенные для розничной доставки интернета населению. Это хорошо.
Итак, у Вас есть VDS, это либо KVM, либо OpenVZ с подключенными tun/tap девайсами. Заказываем операционку - CentOS 6.x [minimal i686]. Скачиваем клиент ssh -
Также нужно качнуть
Обновляем все пакеты
yum update -y
Устанавливаем репозиторий
cd /usr/src/ && wget
rpm -Uvh remi-release-6*.rpm epel-release-6*.rpm
Устанавливаем нужные пакеты
yum install mc wget unzip ntp
yum -y install openvpn
Настраиваем автообновление даты и времени, правильные значения нам нужны для работы openvpn-сервера
ntpdate pool.ntp.org && service ntpd start && chkconfig ntpd on && rm -f /etc/localtime && cp -uf /usr/share/zoneinfo/Europe/Moscow /etc/localtime
Разрешаем форвард пакетов
sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf
sudo sysctl -p
Возможно, на kvm также понадобится отключить selinux
sed -i s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config
reboot
Сервер перезагрузится, логинимся заново. Далее нам нужно скачать easyrsa3, распаковать его и сгенерировать несколько сертификатов, нужных для работы как сервера, так и клиента:
cd /usr/src && wget
unzip master.zip && rm -f master.zip && ln -s /usr/src/easy-rsa-master/easyrsa3 /etc/openvpn/
cd /etc/openvpn/easyrsa3 && ./easyrsa init-pki && ./easyrsa build-ca nopass && ./easyrsa build-server-full server nopass
cd /etc/openvpn/easyrsa3 && ./easyrsa gen-dh
cp /etc/openvpn/easyrsa3/openssl-1.0.cnf /etc/openvpn/
cd /etc/openvpn/easyrsa3/ && ./easyrsa build-client-full client nopass
Также нам понадобится ключ TA:
cd /etc/openvpn && openvpn --genkey --secret ta.key
Скачивание идет с моего сайта, ибо я не помню, где брать оригинал и не знаю, будет ли подходящая версия. Последней строкой генерируется сертификат клиента. Следующие файлы нужно пока сохранить себе на комп через WinSCP: /etc/openvpn/easyrsa3/pki/private/client.key, /etc/openvpn/easyrsa3/pki/ca.crt, client.crt, /etc/openvpn/ta.key
Далее создаем файл /etc/openvpn/server.conf следующего содержимого:
mode server
tls-server
dev tap
port 664
script-security 2
tls-auth /etc/openvpn/ta.key 0
ca easyrsa3/pki/ca.crt
cert easyrsa3/pki/issued/server.crt
key easyrsa3/pki/private/server.key
dh easyrsa3/pki/dh.pem
crl-verify easyrsa3/pki/crl.pem
ifconfig 10.8.0.1 255.255.255.0
ifconfig-pool 10.8.0.2 10.8.0.254
ifconfig-pool-persist ipp.txt 0
push "route-gateway 10.8.0.1"
push "redirect-gateway def1"
push "dhcp-option DNS 77.88.8.88"
push "dhcp-option DNS 8.8.8.8"
push "sndbuf 393216"
push "rcvbuf 393216"
sndbuf 393216
rcvbuf 393216
cipher BF-CBC
tls-timeout 120
keepalive 10 120
persist-key
persist-tun
tun-mtu 1500
fragment 1300
mssfix
fast-io
verb 3
status openvpn-status.log
log openvpn.log
log-append openvpn.log
Краткое резюме конфига сервера. TAP вместо TUN я выбрал, потому что хотел соединять через этот же сервер несколько мест в одну локальную сеть - это по работе. Для этого достаточно сгенерировать дополнительные клиентские сертификаты и их настроить в клиенте вместо client.key/client.crt. Строчка выше, где присутствует build-client-full.
Режим udp (протокол udp) позволяет работать тоннелю с минимальными задержками, минуя ненужные на данном этапе процедуры гарантированной доставки, которые имеются в TCP. Пусть этим занимаются протоколы и приложения уже внутри тоннеля.
Порт 664/udp позволяет слегка "прикинуться" протоколом ASF-SECURE-RMCP. Я не знаю, зачем он нужен, но в нем есть слово SECURE, и наш тоннель зашифрован. Лучшего я не придумал. 443 (https) работает по TCP, нам неподходит. Шифрование BF-CBC является простым и легким, минимально нагружающим процессор как сервера, так и клиента. Напомню, клиент у нас - роутер, и сложное шифрование очень значительно снижает скорость работы.
Далее создадим в каталоге /etc/openvpn файл ipp.txt, и будем в него прописывать внутренние адреса наших клиентов. Пока клиент у нас один. Не то, чтобы это было необходимо, но так будет проще в будущем, если клиентов несколько.
client,10.8.0.250
Настраиваем права:
chown -R openvpn. /etc/openvpn
Включаем автозагрузку openvpn и стартуем серверную часть:
chkconfig openvpn on
service openvpn start
Если старт не удался - лезем в лог и читаем, думаем. Можно выложить ошибку в комменты, подумаем вместе. Лог у нас задан в конфиге сервера: log openvpn.log, располагается в /etc/openvpn.
Для работы в SSH-консоли пригодится уже установленный нами файл-менеджер, запускаемый одноименной командой: mc. Если кто знаком с norton commander, far или хотя бы total commander - то он проблем с использованием испытывать не будет.
Итак, серверная часть запущена. Но у нас есть только подключение к серверу, а нам надо, чтобы сервер прикинулся роутером и NAT-ил трафик. Тут нам поможет iptables, и у нас два варианта. Более классический, но не всегда работающий на OpenVZ:
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
где нужно eth0 заменить на имеющийся интерфейс, который видно командой ifconfig. Если не прокатило, то удаляем правило (-A меняем на -D) и пробуем такой вариант:
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -d 0/0 -j SNAT --to-source ВАШ_ВНЕШНИЙ_IP
Возможно, включить "таблицу nat" также нужно посредством обращения в техподдержку, если у вас OpenVZ!
Внешний ip видно все той же командой ifconfig, да и в ПУ хостера тоже. Все эти манипуляции с iptables имеет смысл делать после подключения клиента, чтобы было чем проверять результат. Когда все получилось - сохраняем конфиг iptables: service iptables save
Теперь клиент. Лезем на роутер все теми же putty и winscp. Создадим в каталоге /root каталог openvpn, скопируем в него ранее сохраненные с сервера файлы:
Файл client.ovpn нужно создать, его содержимое:
client
proto udp
remote СЕРВЕРА_IP 664
resolv-retry infinite
dev tap
remote-cert-tls server
script-security 2
tls-auth /root/openvpn/ta.key 1
ca /root/openvpn/ca.crt
cert /root/openvpn/client.crt
key /root/openvpn/client.key
cipher BF-CBC
persist-key
persist-tun
tun-mtu 1500
fragment 1300
mssfix
fast-io
verb 0
tls-timeout 120
keepalive 20 360
Если вдруг на вашем openwrt не установлен openvpn - то установите его
opkg update
opkg install openvpn-openssl
Далее приводим файл /etc/config/openvpn к виду:
package openvpn
config openvpn custom_config
option enabled 1
option config /root/openvpn/client.ovpn
И в вебморде luci включаем его:
Проверяем, изменился ли наш ip-адрес например на myip.ru. Должен быть адрес сервера vds.
Если что не так - по прежнему читаем и анализируем лог на сервере.
Теперь дополнение. Если вдруг Вам нужно пробросить какой-либо порт внутрь локалки - то пробрасывать дважды - на сервере и в роутере. С роутером сами разберетесь, а вот как на сервере, для примера:
iptables -t nat -A PREROUTING -p ПРОТОКОЛ(tcp/udp) -d ВНЕШНИЙ_IP --dport ВНЕШНИЙ_ПОРТ -j DNAT --to-destination 10.8.0.250:ПОРТ_КУДА
Не забываем service iptables save после проверки.
Спасибо!
UPD: Выяснил, что с момента аренды сервера на самой "быстрой" по итогам тестов площадке изменились цены, но и выросли ресурсы. Теперь она за 420 р/мес предлагает 4гб озу и два быстрых ядра.
На все это наложилось нежелание постоянно видеть сообщение, что такой-то сайт закрыт по решению каких-то там дядек, знающих лучше меня, как мне жить. А интернет нужен для работы. И привык я смотреть фильмы и сериалы онлайн, а то и в UO на FW погонять изредка.
То есть скорость скачивания и задержки должны быть приемлимыми.
К тому же, я заметил, что вечерами явно присутствует ограничение на число соединений. то есть - открываем 10 вкладок, 11-я уже говорит об ошибке - "соединение сброшено". Закрываем какую-либо, обновляем 11-ю - все открывается.
Я хотел установить клиента VPN сразу в роутере, что позволило бы не заморачиваться с клиентами на конечных устройствах (два андроид-фона, медиацентр на pi2/openelec, пара ноутов) и скрыть от провайдера сам факт раздачи. Провайдер должен видеть один шифрованный канал на подходящий для этого порт.
Популярных технологий, имеющих возможность стартануть на роутере, было две. Это L2TP и OpenVPN. Для первой даже была вебморда, но, как я ни старался - клиентская часть не поднималась. А, да. В "родной" прошивке отсутствовала возможность использовать L2TP через usb 3g/4g, только как авторизационная составляющая для WAN-порта (ethernet). С openwrt я был на "вы", и осторожно, поэтому предпочел поискать готовую прошивку, которой можно было бы прошиться через стандартную вебморду.
Для просмотра ссылки необходимо нажать
Вход или Регистрация
.Построена она на openwrt, поэтому сия инструкция сгодится для любой openwrt - прошивки с установленным пакетом openvpn, да и для других кастомных прошивок тоже.
Итак - OpenVPN. Серверная часть. Опыт работы с ним уже был, пусть и без клиентской части в роутере. Я много работаю с дистрибутивами CentOS, преимущественно 6.X, поэтому её и выбрал. Нам понадобится vps/vds сервер, который можно относительно недорого арендовать. У меня была возможность протестировать три площадки, и по итогам я сделал свой выбор. Рассматривал площадки исключительно в РФ, хотелось комфортной скорости в рунете. Как ни крути, с зарубежными площадками есть такие проблемы.
Первая площадка - недорогой VDS на kvm (более подходящая технология виртуализации), 129р/мес, 400мб ОЗУ, ssd, MSK. Пинги радуют, но общая скорость маловата.
Вторая площадка - kvm, Новосибирск. 400р. Ресурсы сервера хорошие. Пинги не радуют, скорость по итогу тоже.
Третья площадка - OpenVZ, MSK, 1Gb ОЗУ, ssd, 299р. (UDP: полез проверять цены и выяснил, что тарифы подняли, но ресурсов значительно больше. Подробнее в самом конце поста). Пришлось попросить техподдержку подключить tun/tap девайсы, сделайте это сразу, если у Вас OpenVZ.
Как Вы уже поняли, ограничения на доступы к сайтам не распространяются на хостинги и ДЦ, не предназначенные для розничной доставки интернета населению. Это хорошо.
Итак, у Вас есть VDS, это либо KVM, либо OpenVZ с подключенными tun/tap девайсами. Заказываем операционку - CentOS 6.x [minimal i686]. Скачиваем клиент ssh -
Для просмотра ссылки необходимо нажать
Вход или Регистрация
Логинимся по ip сервера на порт 22 по протоколу ssh, вводим имя root и пароль. Мы в консоли!Также нужно качнуть
Для просмотра ссылки необходимо нажать
Вход или Регистрация
либо другой файл-менеджер, поддерживающий SSH, и залогинится похожим образом. В первом клиенте мы вбиваем команды, во втором оперируем с файлами. Поехали устанавливать серверную часть.Обновляем все пакеты
yum update -y
Устанавливаем репозиторий
cd /usr/src/ && wget
Для просмотра ссылки необходимо нажать
Вход или Регистрация
&& wget
Для просмотра ссылки необходимо нажать
Вход или Регистрация
rpm -Uvh remi-release-6*.rpm epel-release-6*.rpm
Устанавливаем нужные пакеты
yum install mc wget unzip ntp
yum -y install openvpn
Настраиваем автообновление даты и времени, правильные значения нам нужны для работы openvpn-сервера
ntpdate pool.ntp.org && service ntpd start && chkconfig ntpd on && rm -f /etc/localtime && cp -uf /usr/share/zoneinfo/Europe/Moscow /etc/localtime
Разрешаем форвард пакетов
sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf
sudo sysctl -p
Возможно, на kvm также понадобится отключить selinux
sed -i s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config
reboot
Сервер перезагрузится, логинимся заново. Далее нам нужно скачать easyrsa3, распаковать его и сгенерировать несколько сертификатов, нужных для работы как сервера, так и клиента:
cd /usr/src && wget
Для просмотра ссылки необходимо нажать
Вход или Регистрация
unzip master.zip && rm -f master.zip && ln -s /usr/src/easy-rsa-master/easyrsa3 /etc/openvpn/
cd /etc/openvpn/easyrsa3 && ./easyrsa init-pki && ./easyrsa build-ca nopass && ./easyrsa build-server-full server nopass
cd /etc/openvpn/easyrsa3 && ./easyrsa gen-dh
cp /etc/openvpn/easyrsa3/openssl-1.0.cnf /etc/openvpn/
cd /etc/openvpn/easyrsa3/ && ./easyrsa build-client-full client nopass
Также нам понадобится ключ TA:
cd /etc/openvpn && openvpn --genkey --secret ta.key
Скачивание идет с моего сайта, ибо я не помню, где брать оригинал и не знаю, будет ли подходящая версия. Последней строкой генерируется сертификат клиента. Следующие файлы нужно пока сохранить себе на комп через WinSCP: /etc/openvpn/easyrsa3/pki/private/client.key, /etc/openvpn/easyrsa3/pki/ca.crt, client.crt, /etc/openvpn/ta.key
Далее создаем файл /etc/openvpn/server.conf следующего содержимого:
mode server
tls-server
dev tap
port 664
script-security 2
tls-auth /etc/openvpn/ta.key 0
ca easyrsa3/pki/ca.crt
cert easyrsa3/pki/issued/server.crt
key easyrsa3/pki/private/server.key
dh easyrsa3/pki/dh.pem
crl-verify easyrsa3/pki/crl.pem
ifconfig 10.8.0.1 255.255.255.0
ifconfig-pool 10.8.0.2 10.8.0.254
ifconfig-pool-persist ipp.txt 0
push "route-gateway 10.8.0.1"
push "redirect-gateway def1"
push "dhcp-option DNS 77.88.8.88"
push "dhcp-option DNS 8.8.8.8"
push "sndbuf 393216"
push "rcvbuf 393216"
sndbuf 393216
rcvbuf 393216
cipher BF-CBC
tls-timeout 120
keepalive 10 120
persist-key
persist-tun
tun-mtu 1500
fragment 1300
mssfix
fast-io
verb 3
status openvpn-status.log
log openvpn.log
log-append openvpn.log
Краткое резюме конфига сервера. TAP вместо TUN я выбрал, потому что хотел соединять через этот же сервер несколько мест в одну локальную сеть - это по работе. Для этого достаточно сгенерировать дополнительные клиентские сертификаты и их настроить в клиенте вместо client.key/client.crt. Строчка выше, где присутствует build-client-full.
Режим udp (протокол udp) позволяет работать тоннелю с минимальными задержками, минуя ненужные на данном этапе процедуры гарантированной доставки, которые имеются в TCP. Пусть этим занимаются протоколы и приложения уже внутри тоннеля.
Порт 664/udp позволяет слегка "прикинуться" протоколом ASF-SECURE-RMCP. Я не знаю, зачем он нужен, но в нем есть слово SECURE, и наш тоннель зашифрован. Лучшего я не придумал. 443 (https) работает по TCP, нам неподходит. Шифрование BF-CBC является простым и легким, минимально нагружающим процессор как сервера, так и клиента. Напомню, клиент у нас - роутер, и сложное шифрование очень значительно снижает скорость работы.
Далее создадим в каталоге /etc/openvpn файл ipp.txt, и будем в него прописывать внутренние адреса наших клиентов. Пока клиент у нас один. Не то, чтобы это было необходимо, но так будет проще в будущем, если клиентов несколько.
client,10.8.0.250
Настраиваем права:
chown -R openvpn. /etc/openvpn
Включаем автозагрузку openvpn и стартуем серверную часть:
chkconfig openvpn on
service openvpn start
Если старт не удался - лезем в лог и читаем, думаем. Можно выложить ошибку в комменты, подумаем вместе. Лог у нас задан в конфиге сервера: log openvpn.log, располагается в /etc/openvpn.
Для работы в SSH-консоли пригодится уже установленный нами файл-менеджер, запускаемый одноименной командой: mc. Если кто знаком с norton commander, far или хотя бы total commander - то он проблем с использованием испытывать не будет.
Итак, серверная часть запущена. Но у нас есть только подключение к серверу, а нам надо, чтобы сервер прикинулся роутером и NAT-ил трафик. Тут нам поможет iptables, и у нас два варианта. Более классический, но не всегда работающий на OpenVZ:
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
где нужно eth0 заменить на имеющийся интерфейс, который видно командой ifconfig. Если не прокатило, то удаляем правило (-A меняем на -D) и пробуем такой вариант:
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -d 0/0 -j SNAT --to-source ВАШ_ВНЕШНИЙ_IP
Возможно, включить "таблицу nat" также нужно посредством обращения в техподдержку, если у вас OpenVZ!
Внешний ip видно все той же командой ifconfig, да и в ПУ хостера тоже. Все эти манипуляции с iptables имеет смысл делать после подключения клиента, чтобы было чем проверять результат. Когда все получилось - сохраняем конфиг iptables: service iptables save
Теперь клиент. Лезем на роутер все теми же putty и winscp. Создадим в каталоге /root каталог openvpn, скопируем в него ранее сохраненные с сервера файлы:
Файл client.ovpn нужно создать, его содержимое:
client
proto udp
remote СЕРВЕРА_IP 664
resolv-retry infinite
dev tap
remote-cert-tls server
script-security 2
tls-auth /root/openvpn/ta.key 1
ca /root/openvpn/ca.crt
cert /root/openvpn/client.crt
key /root/openvpn/client.key
cipher BF-CBC
persist-key
persist-tun
tun-mtu 1500
fragment 1300
mssfix
fast-io
verb 0
tls-timeout 120
keepalive 20 360
Если вдруг на вашем openwrt не установлен openvpn - то установите его
opkg update
opkg install openvpn-openssl
Далее приводим файл /etc/config/openvpn к виду:
package openvpn
config openvpn custom_config
option enabled 1
option config /root/openvpn/client.ovpn
И в вебморде luci включаем его:
Проверяем, изменился ли наш ip-адрес например на myip.ru. Должен быть адрес сервера vds.
Если что не так - по прежнему читаем и анализируем лог на сервере.
Теперь дополнение. Если вдруг Вам нужно пробросить какой-либо порт внутрь локалки - то пробрасывать дважды - на сервере и в роутере. С роутером сами разберетесь, а вот как на сервере, для примера:
iptables -t nat -A PREROUTING -p ПРОТОКОЛ(tcp/udp) -d ВНЕШНИЙ_IP --dport ВНЕШНИЙ_ПОРТ -j DNAT --to-destination 10.8.0.250:ПОРТ_КУДА
Не забываем service iptables save после проверки.
Спасибо!
UPD: Выяснил, что с момента аренды сервера на самой "быстрой" по итогам тестов площадке изменились цены, но и выросли ресурсы. Теперь она за 420 р/мес предлагает 4гб озу и два быстрых ядра.