Самый простой VPN-сервер, Простой VPN-сервер на golang |
Здравствуйте, гость Вход | Регистрация
Наши новости:
|
| ! | В разделе запрещено создавать темы связанные с раскруткой игровых серверов |
|
|
Самый простой VPN-сервер, Простой VPN-сервер на golang |
Gecko
|
17.11.2022, 20:10
Сообщение
|
|
|
Думал ответить в теме, но решил отдельной статьёй.
Тема о ещё одном VPN-сервере. От других подобных программ он ни чем не отличается, за исключением того, что он написан на golang, имя этого чуда Pangolin Сервер и клиент под Linux Клиент под Windows Клиент под Android Серверная часть работает исключительно под Linux, но в README есть инструкция как сие собрать на docker. Из описания: Цитата Поддержка соединения TCP/UDP/ PTCP . Для PTCP/TCP поддерживается многопользовательская аутентификация, передача с шифрованием. Для UDP без аутентификации. PTCP это поддельный протокол TCP на канальном уровне. Он реализует рукопожатия, такие как TCP, но без повторной передачи после подключения. Чем мне понравился pangolin,.. в первую очередь своей простотой, код очень читабельный и всё сразу понятно (просто очень не люблю непонятные вещи). Парень который всё это написал, опубликовал код уже доработанным и готовым. Есть несколько замечаний которых вы не найдёте в README. У вас должен быть установлен Go! Это и логично. Про сборку Go, и клонирование репы я писать не буду, это очевидно и так. Выполнить на сервере Код sysctl net.ipv4.ip_forward=1 Перед компиляцией программы важно выполнить это: (подготовить сборку) Код go get github.com/xitongsys/pangolin/client go get github.com/xitongsys/pangolin/config go get github.com/xitongsys/pangolin/logging go get github.com/xitongsys/pangolin/server далее сама сборка программы Код go build main.go далее копируем исполняемый файл программы (в Linux он сервер и клиент) для винды клиент нужно собирать/брать тут Код cp ./main docker/pangolin переходим в каталог ./docker/pangolin Код cd docker/pangolin в нём наблюдаем каталог с конфигами *.json и файлом start.sh - этот файл нужно запускать с правами суперпользователя! Также start.sh необходимо отредактировать. Просто убрав комментарии на первых 4 строках. Это для сервера: Код SERVERIP=0.0.0.0 SERVERPORT=3001 TOKENS='["token01", "token02"]' ROLE=SERVER Для клиента: Код SERVERIP=your.server.ip.address SERVERPORT=3001 TOKENS='["token01", "token02"]' ROLE=CLIENT token01 и token02 - заменяем на свои значения. Ну и главное: SERVERIP (ip-адрес сервера) Разбор файла запуска start.sh Код #SERVERIP=0.0.0.0 #SERVERPORT=12345 #TOKENS='["token01", "token02"]' #ROLE=SERVER # Функция для сервера, сразу понимаем зачем нужны права суперпользователя # Настроим нужные правила и интерфейс tun0 function start_server () { ip tuntap add dev tun0 mod tun ip addr add 10.0.0.2/8 dev tun0 ip link set tun0 up ip link set dev tun0 mtu 1400 ifc=`route -n | awk '{if($1=="0.0.0.0" && $8 != "tun0"){print $8; exit;}}'` INTERFACE="$ifc" ip=`ip addr show dev "$ifc" | awk '$1 == "inet" { sub("/.*", "", $2); print $2 }'` # Настройка правил маршрутизации SERVERIP=$ip iptables -t nat -F iptables -t nat -A POSTROUTING -o "$ifc" -j SNAT --to-source $ip iptables -P FORWARD ACCEPT iptables -A INPUT -p tcp --destination-port `expr $SERVERPORT + 1` -j DROP # Тут файл конфигурации клиента и сервера приобретает нужный вид путём копирования из шаблона .template cp -f configs/cfg_server.json.template configs/cfg_server.json # Тут функция replace изменяет в файле configs/cfg_server.json {SERVERIP} на $SERVER, то есть, переводит условные обозначения переменной в переменные понятные bash replace configs/cfg_server.json # Тут запускаем нашу собранную программу в качестве сервера, ключик "-с" указывает путь на конфигурационный файл ./main -c configs/cfg_server.json } # Функция для клиента, сразу понимаем зачем нужны права суперпользователя # Настроим нужные правила и интерфейс tun0 function start_client () { ip tuntap add dev tun0 mod tun ip addr add 10.0.0.22/8 dev tun0 ip link set tun0 up ip link set dev tun0 mtu 1400 # Настройка правил маршрутизации iptables -t nat -F iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to-source 10.0.0.22 iptables -P FORWARD ACCEPT ifc=`route -n | awk '{if($1=="0.0.0.0" && $8 != "tun0"){print $8; exit;}}'` INTERFACE="$ifc" gw=`route -n | awk '$1 == "0.0.0.0" {print $2}'` route add $SERVERIP gw $gw route add default gw 10.0.0.1 # Добавляет адрес ДНС сервера google # Этот файл автоматически обновляет NM при перезагрузки сетевого интерфейса echo "nameserver 8.8.8.8" > /etc/resolv.conf # Тут файл конфигурации клиента и сервера приобретает нужный вид путём копирования из шаблона .template cp -f configs/cfg_client.json.template configs/cfg_client.json # Тут функция replace изменяет в файле configs/cfg_client.json {SERVERIP} на $SERVER, то есть, переводит условные обозначения переменной в переменные понятные bash. replace configs/cfg_client.json # Тут запускаем нашу собранную программу в качестве клиента, ключик "-с" указывает путь на конфигурационный файл ./main -c configs/cfg_client.json } function replace () # Функция замены переменных понятные bash { sed -i "s/{SERVERIP}/$SERVERIP/g" $1 sed -i "s/{SERVERPORT}/$SERVERPORT/g" $1 sed -i "s/{TOKENS}/$TOKENS/g" $1 sed -i "s/{INTERFACE}/$INTERFACE/g" $1 } # По умолчанию, срабатывает то, что Вы присвоили переменной ROLE # Либо сервер, либо клиент. [[ "$ROLE" == "SERVER" ]] && start_server [[ "$ROLE" == "CLIENT" ]] && start_client echo "ERROR: pangolin exit" По флагам (их не много): Код var configFile = flag.String("c", "cfg.json", "") var logLevel = flag.String("l", "info", "") Вроде всё.
Отредактировал: Gecko, - 17.11.2022, 21:16
![]() Не отвечаю на ЛС.
|
Поблагодарили 4 раз
|
|
Eka
|
18.11.2022, 13:34
Сообщение
|
|
|
Gecko, Цитата Скинь проще, буду очень благодарен Уже кидали OpenVPN web (лицо) (Пост #1155186) Цитата (желательно на go) чтобы без зависимостей Цитата go get github.com/xitongsys/pangolin/client go get github.com/xitongsys/pangolin/config go get github.com/xitongsys/pangolin/logging go get github.com/xitongsys/pangolin/server Это зависимости) Странно, что ты не сделал форк и не добавил го мод, чтобы "сделать круче". Ну и в целом недостаток этого решения в том, что надо тянуть го. Хотя это не удивительно, учитывая, что ты предлагаешь только гиковские решения. Но странно видеть в таких топиках слова "просто" ))) ![]() цитаты великих умов
Цитата аналог libcurl в Go это net/http |
|
|
|
Gecko
|
18.11.2022, 14:27
Сообщение
|
|
|
Eka, Цитата go get github.com/xitongsys/pangolin/client go get github.com/xitongsys/pangolin/config go get github.com/xitongsys/pangolin/logging go get github.com/xitongsys/pangolin/server Сразу вопрос, и что это за зависимости? UPD Ладно, не буду затягивать опрос, эти зависимости, почти все в комплекте, и автор спокойно мог всё закинуть в одну репу. По факту все зависимости которые нужно до установить состоят из двух пакетов, которые автор поддерживает по отдельности. По сути, ничего постороннего у автора в комплекте нет. А github.com/xitongsys/pangolin/server это в конечном счете локальный путь от корня который присвоен $GOPATH По этому в нашем случае, вообще достаточно вот такой команды для сборки проекта Код var=https://github.com/xitongsys/pangolin; cd ${GOPATH} && git clone ${var} && cd pangolin && go get ${var#*https://} && go build main.go вот и вся сборка.
Eka, Цитата Уже кидали Ты код смотрел? Загляни в package.json
Eka, Цитата Странно, что ты не сделал форк и не добавил го мод, чтобы "сделать круче". Не форк а репак, и без зависимостей, это может сделать любой кто хоть немного шарит в го. Инструкция по сборке из исходников, для всего остального есть готовый архив. Мне стало интересно насколько твой вариант проще. Напиши инструкцию по сборке outline, Пожалуйста.
Отредактировал: Gecko, - 18.11.2022, 15:47
![]() Не отвечаю на ЛС.
|
|
|
|
Eka
|
18.11.2022, 16:36
Сообщение
|
|
|
Gecko, Цитата Ты код смотрел? Загляни в package.json Зачем? Речь о простом запуске)) Мне не важно из скольки файлов состоит приложение. Речь о том, что проще запустить. Цитата Не форк а репак Форк. Делаешь на гитхабе форк и коммитишь туда гомод. И не надо го гет выполнять. Цитата без зависимостей Все, что ты го гетом подгрузил - это зависимости) И выполнять го гет перед сборкой - ушербно. Просто проекту 3 года, а модули, наверное, в те времена и появились. Поэтому тут так. Поэтому я и сказал о том, что ты мог бы форкнуть проект, добавить го мод и скинуть ссылку уже на свою репу. Например, на репу в своем гити, ты же наверняка им пользуешься, не просто так ведь ***валивал. Цитата Мне стало интересно насколько твой вариант проще. Напиши инструкцию по сборке outline, Пожалуйста "Мой" вариант про openvpn и инструкцию уже написали по ссылке, что я кидал)) Я уж молчу про то, что панголин - это очередное приложение, когда у тебя уже, наверняка, стоит опенвпн. Если ничего из этого нет и есть желание поставить какой то мусор, то, конечно, никто не спорит)) ![]() цитаты великих умов
Цитата аналог libcurl в Go это net/http |
|
|
|
Gecko
|
18.11.2022, 22:15
Сообщение
|
|
|
Eka, Цитата Все, что ты го гетом подгрузил - это зависимости) Смотри Код mkdir -p ${GOPATH}/{github.com,src} cd ${GOPATH}/github.com git clone https://github.com/xitongsys/ethernet-go git clone https://github.com/xitongsys/ptcp/ptcp git clone https://github.com/xitongsys/pangolin ln -sf ${GOPATH}/github.com/pangolin ${GOPATH}/src/pangolin cd ${GOPATH}/github.com/pangolin go build main.go && cp -a ./main docker/pangolin cd docker/pangolin && mc -e start.sh ловкость рук и никакого go get, go.mod... И заметь, всё в одном каталоге, без повышения прав пользователя, проект(ы) легко перенести на любую другую рабочую станцию и работать оффлайн. Цитата Форк. Делаешь на гитхабе форк и коммитишь туда гомод. И не надо го гет выполнять. Именно репак, и github/gitea тут совсем не обязателен, можно создать готовый deb/rpm - для тех кому нужно быстро и сразу. Цитата Зачем? Речь о простом запуске)) Мне не важно из скольки файлов состоит приложение. Речь о том, что проще запустить. Посмотри сюда, куда проще? В одном файле и сервер и клиент Код bash start.sh Код ./main -c configs/cfg_server.json # Запуск сервера Код ./main -c configs/cfg_client.json # Запуск клиента Цитата "Мой" вариант про openvpn и инструкцию уже написали по ссылке, что я кидал)) Я про сборку из исходников.
Отредактировал: Gecko, - 18.11.2022, 22:39
![]() Не отвечаю на ЛС.
|
|
|
|
usercn
|
31.12.2022, 20:16
Сообщение
|
![]() |
Цитата АНБ США порекомендовало IT-компаниям отказаться от языков C и C++ То есть языки, которые генерят быстрый компактный код уже не в тренде. ![]() Просунутий сервер з максимумом зброї, можливо старійший в Україні
[UA] DNET CS Public Server #1 |
|
|
|
Gecko
|
31.12.2022, 20:55
Сообщение
|
|
|
usercn, на самом деле без разницы на чем ты будешь писать текст описывающий логику для транслятора языка )) С Новым Годом! ![]() Не отвечаю на ЛС.
|
|
|
|
![]() ![]() |