Данная статья предоставляет информацию о том, как настроить VPN серверы по тому или иному протоколу.
Необходимый список предустановок для работы впн:
nft add rule inet nat POSTROUTING oifname "ens3" ip saddr 10.2.2.0/24 masquerade
nft add rule inet filter INPUT iifname "ens3" tcp dport 1701 counter accept
nft add rule inet filter INPUT iifname "ens3" udp dport 500 counter accept
nft add rule inet filter INPUT iifname "ens3" udp dport 4500 counter accept
Открыть порты 500 UDP 1701 UDP 4500 UDP
Если подключение с Mikrotik, то добавить в Proposal (IP->IpSec)
В файле nano /etc/sysctl.conf
добавляем строку net.ipv4.ip_forward = 1
и применяем настройки командой sysctl -p
Устанавливаем пакет apt-get install strongswan
Редактируем файл nano /etc/ipsec.conf
Подводим его вид до такого состояния:
conn rw-base
fragmentation=yes
dpdaction=clear
dpdtimeout=90s
dpddelay=30s
conn l2tp-vpn
also=rw-base
ike=aes128-sha256-modp3072
esp=aes128-sha256-modp3072
leftsubnet=%dynamic[/1701]
rightsubnet=%dynamic
leftauth=psk
rightauth=psk
type=transport
auto=add
Редактируем файл nano /etc/ipsec.secrets
и добавляем туда строку %any %any : PSK "MYKEY"
Где "MYKEY" выставляем свой ключ, который будет использоваться для аутентификации
После, нам надо рестартнуть службу systemctl restart strongswan-starter
И устанавливаем apt-get install xl2tpd
Открываем файл настроек nano /etc/xl2tpd/xl2tpd.conf
и приводим его к следующему виду:
[global]
port = 1701
auth file = /etc/ppp/chap-secrets
access control = no
ipsec saref = yes
force userspace = yes
[lns default]
exclusive = no
ip range = 10.10.1.100-10.10.1.200
hidden bit = no
local ip = 10.10.1.1
length bit = yes
require authentication = yes
name = l2tp-vpn
pppoptfile = /etc/ppp/options.xl2tpd
flow bit = yes
Дополнительно, нам необходимо скопировать опции ppp устройства. Заходим в cd /etc/ppp
и копируем cp options options.xl2tpd
Редактируем файл nano options.xl2tpd
и приводим его к следующему виду:
asyncmap 0
auth
crtscts
lock
hide-password
modem
mtu 1460
lcp-echo-interval 30
lcp-echo-failure 4
noipx
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
multilink
mppe-stateful
Далее добавляем пользователя. В файле nano /etc/ppp/chap-secrets
добавляем строку user l2tp-vpn password *
И рестартим нашу службу.
systemctl restart xl2tpd
Настройка openvpn сервера debian 12.
Для начала нам необходимо установить два пакета для работы с сервером:
apt-get install openvpn easy-rsa
После установки нужно скопировать папку easy-rsa в папку openvpn
cd /etc/openvpn
make-cadir easy-rsa/
Переходим в директорию cd /easy-rsa
после ./easyrsa init-pki
и выполняем команду:
./easyrsa build-ca
Прописываем пароли, название сертификата пишем server
Далее прописываем
./easyrsa build-server-full server
Нас попросят ввести пароли от сертификата. Вводим.
После генерим DH сертификат. Вводим ./easyrsa gen-dh
Переходим в директорию cd /etc/openvpn/
Делаем секрет. Пишем openvpn --genkey secret /etc/openvpn/server/ta.key
Нам необходимо создать файл nano server.conf
В него прописываем:
port 1194
proto udp
dev tun
ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/server.crt
key /etc/openvpn/easy-rsa/pki/private/server.key # keep secret
dh /etc/openvpn/easy-rsa/pki/dh.pem
topology subnet
server 10.1.1.0 255.255.255.0 #OpenVPN network pool
ifconfig-pool-persist ipp.txt
push "route 192.168.0.0 255.255.255.0" #дефолтный роут
push "redirect-gateway def1 bypass-dhcp" #дефолтный гейт
keepalive 10 120
tls-auth /etc/openvpn/server/ta.key 0
auth-nocache
cipher AES-256-CBC
data-ciphers AES-256-CBC
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
verb 3 # verbose mode
client-to-client
explicit-exit-notify 1
Создаем файл для логов:
touch /var/log/openvpn/openvpn-status.log
После чего редактируем файл дефолтной конфигурации клиента.
nano /usr/share/doc/openvpn/examples/sample-config-files/client.conf
Удаляем все, вставляем следующее:
client
dev tun
proto udp
remote VPNSERVER_IP 1194 # [VPN server IP] [PORT]
resolv-retry infinite
nobind
persist-key
persist-tun
ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/clientname.crt
key /etc/openvpn/easy-rsa/pki/private/clientname.key
remote-cert-tls server
tls-auth /etc/openvpn/server/ta.key 1
auth-nocache
cipher AES-256-CBC
data-ciphers AES-256-CBC
mute-replay-warnings
verb 3
Сохраняем, закрываем.
Переходим в директорию cd /etc/openvpn/easy-rsa/
И вводим команды:
./easyrsa build-server-full server nopass
./easyrsa gen-dh
cd /etc/openvpn
openvpn --genkey secret /etc/openvpn/server/ta.key
Теперь мы можем создать ключи для пользователя. Делается это командой:
./easyrsa build-client-full user1 nopass
Уже после мы можем создать конфиг пользователя:
YOUR_CLIENT_NAME=user1 &&\
cd /etc/openvpn &&\
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf $YOUR_CLIENT_NAME.ovpn && \
echo "key-direction 1" >> $YOUR_CLIENT_NAME.ovpn && \
echo "<ca>" >> $YOUR_CLIENT_NAME.ovpn && \
sed -n '/BEGIN CERTIFICATE/,/END CERTIFICATE/p' < easy-rsa/pki/ca.crt >> $YOUR_CLIENT_NAME.ovpn && \
echo "</ca>" >> $YOUR_CLIENT_NAME.ovpn && \
echo "<cert>" >> $YOUR_CLIENT_NAME.ovpn && \
sed -n '/BEGIN CERTIFICATE/,/END CERTIFICATE/p' < easy-rsa/pki/issued/$YOUR_CLIENT_NAME.crt >> $YOUR_CLIENT_NAME.ovpn && \
echo "</cert>" >> $YOUR_CLIENT_NAME.ovpn && \
echo "<key>" >> $YOUR_CLIENT_NAME.ovpn && \
sed -n '/BEGIN PRIVATE KEY/,/END PRIVATE KEY/p' < easy-rsa/pki/private/$YOUR_CLIENT_NAME.key >> $YOUR_CLIENT_NAME.ovpn && \
echo "</key>" >> $YOUR_CLIENT_NAME.ovpn && \
echo "<tls-auth>" >> $YOUR_CLIENT_NAME.ovpn && \
sed -n '/BEGIN OpenVPN Static key V1/,/END OpenVPN Static key V1/p' < server/ta.key >> $YOUR_CLIENT_NAME.ovpn && \
echo "</tls-auth>" >> $YOUR_CLIENT_NAME.ovpn
И этот конфиг можем копировать на клиентские устройства.
Дополнительно, не забываем прописать iptables правила:
nft add rule inet filter FORWARD iifname "eth0" oifname "tun0" ct state related, established accept
nft add rule inet filter FORWARD oifname "eth0" ip saddr 10.1.1.0/24 accept
nft add rule inet nat POSTROUTING oifname "eth0" ip saddr 10.1.1.0/24 masquerade
Проверяем nano /etc/sysctl.conf
на наличие net.ipv4.ip_forward = 1
и sysctl -p
И можем запускать сервер openvpn: openvpn --config server.conf
Для начала немного теории. На микротиках архитектуры arm мы можем запускать контейнеры. Почему бы нам не поднимать контейнер который подключался бы на сервер через клиента xray?
Для начала поднимаем контейнер с X3UI (либо нативный xray) где угодно. Создаем подключение и первого клиента. Из клиента формируем конфиг для xray. Выглядит он примерно так:
{
"inbounds": [
{
"port": 1080,
"protocol": "socks",
"settings": {
"auth": "noauth",
"udp": true
}
}
],
"outbounds": [
{
"protocol": "vless",
"settings": {
"vnext": [
{
"address": "REMOTE-SERVER-IP",
"port": 1337,
"users": [
{
"id": "1234567-1234-1234-123-12348ac0f473",
"encryption": "none"
}
]
}
]
},
"streamSettings": {
"network": "tcp",
"security": "reality",
"realitySettings": {
"show": false,
"fingerprint": "chrome",
"serverName": "google.com",
"publicKey": "PUBLICKEY",
"shortId": "SHORTID",
"spiderX": "/"
}
}
}
]
}
Далее, начинается самое сложное.
Нам необходимо сделать два изображения контейнеров для микрота. Первый- xray клиент, который после того как подключается с помощью конфига поднимает socks5 соединение. Второй- socks5 клиент, которому мы будем передавать весь трафик.
Для начала сбилдим изображение xray (НЕ ЗАБЫВАЕМ ПРО АРХИТЕКРУТУ, МЫ ДОЛЖНЫ БИЛДИТЬ ВСЕ ПОД ARM)
Скачиваем зип https://github.com/XTLS/Xray-core/releases/download/v25.3.6/Xray-linux-arm64-v8a.zip
И распаковываем в любую папку на линухе (либо на винде если вы любите боль).
После получаем кучу мусора и исполняемый файл xray. Меняем его права на исполняемый chmod 755 xray
. В этой же директории куда мы распаковали создаем Dockerfile
со следующим содержанием:
FROM scratch
COPY xray /xray
COPY config.json /config.json
ENTRYPOINT ["/xray", "run", "-config", "/config.json"]
После можно билдить изображение. (ВНИМАНИЕ, РЕКОМЕНДУЮ ПОЧИСТИТЬ КЕШ ДОКЕР БИЛДЕРА/СИСТЕМЫ. ЛЮБОЙ МЕГАБАЙТ ВАЖЕН!).
Билдим первое изображение командой: docker buildx build --platform linux/arm/v7 -t xray-connect --load .
Ну и выгружаем изображение локально на устройство: docker save -o mikrotik-image.tar xray-connect:latest
У меня на выходе получилось изображение 27,346 КБ (27МБ). Вообще можно и замучаться с ENV окружением в микроте (чтобы не записывать в изображение статический конфиг), но мне показалось добавление переменных очень неудобным делом, так что забил на это. В дальнейшем если кому-то будет интересно- напишу полную автоматизацию, чтобы можно было просто вкидывать одну единственную строку. Сейчас мне просто лень)))
Далее сложнее. Нужно сбилдить изображение socks5 клиента. Тут я уже знатно помучался чтобы получить МИНИМАЛЬНОЕ изображение.
Внутри изображения находится сбилженый бинарник hev-socks5-tunnel
https://github.com/heiher/hev-socks5-tunnel/releases/download/2.10.0/hev-socks5-tunnel-linux-arm64
Дополнительно скрипт:
#!/bin/sh
touch route.sh
chmod 755 route.sh
HOST_IP=$(ip -4 addr show eth0 | awk -F'[ /]+' '/inet / {print $3}')
echo "#!/bin/sh" > route.sh
echo "ip route del default" >> route.sh
echo "ip route add default via 198.18.0.1 dev tun0 metric 1" >> route.sh
echo "ip route add default via $HOST_IP dev eth0 metric 10" >> route.sh
if [ -n "$LOCAL_ROUTE" ]; then
echo "$LOCAL_ROUTE" | tr ';' '\n' | while read -r route; do
echo "Adding route: $route"
echo "$route" >> route.sh
done
echo "Routes added."
fi
echo \
"tunnel:
name: 'tun0'
mtu: 8500
multi-queue: false
ipv4: '198.18.0.1'
ipv6: ''
post-up-script: '/route.sh'
socks5:
address: '$SOCKS5_ADDR'
port: $SOCKS5_PORT
udp: '$SOCKS5_MODE'" > config.yml
exec ./hev-client config.yml
Dockerfile следующий:
FROM alpine:3.20 AS builder
RUN apk add --no-cache iproute2 binutils
RUN mkdir -p /lib_deps
RUN ldd /sbin/ip | awk '/=>/ {print $3}' | grep -v '^$' | xargs -I{} cp -L {} /lib_deps/
FROM busybox:musl
COPY --from=builder /sbin/ip /sbin/ip
COPY --from=builder /lib_deps/* /usr/lib/
COPY --from=builder /lib/ld-musl-*.so.1 /lib/
COPY hev-client /hev-client
COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]
Билдим первое изображение командой: docker buildx build --platform linux/arm/v7 -t xray-proxy --load .
Ну и выгружаем изображение локально на устройство: docker save -o mikrotik-image.tar xray-proxy:latest
Отлично! Самое сложное позади! Закидываем скачаные образы на микрот, и делаем следующее:
Создаем бридж bridge-container
, во вкладке ip->adresses
навешиваем адрес 10.10.11.1/24
с сетью 10.10.11.0
В ip->interfaces
создаем два veth, с адресами 10.10.11.2/24
и 10.10.11.3/24
соответственно. Гейт 10.10.11.1
. Один будет для xray-cient, второй для xray-socks5-client