Установка и настройка прокси сервера Dante (socked) с авторизацией по MySQL debian 11

Статья как поднять свой Socks5 сервер с авторизацией через mysql. Учтите что Dante сервер условно бесплатный и модули для него платные.

Сервер будет работать в связке PAM+Radius+MySQL . Было это поднято на OS Debian 8 . Начнем:

Обновляем систему, а потом ставим нужные пакеты.

apt install freeradius freeradius-mysql freeradius-utils mysql-server libpam-radius-auth libpam-auth gcc -y

При установке пакетов MySQL попросит указать пароль root.

Качаем последнюю версию Dante. Распаковываем.

cd /tmp
https://www.inet.no/dante/files/dante-1.4.3.tar.gz
tar -xvf dante-1.4.3.tar.gz

Компилируем

mkdir /opt/dante
./configure --prefix=/opt/dante
make
make install

Создаем и настраиваем конфигурационный файл Dante

nano /etc/sockd.conf

Выкладываю свой:

#logoutput: stderr 
logoutput: /var/log/socks.log 
internal: eth0 port = 1080  //имя и порт интерфейса с которых принимаются запросы
external: eth0 //Исходящий интерфейс

socksmethod: pam.username 
user.privileged : root 
user.notprivileged : sockd

client pass { 
       from: 0.0.0.0/0 to: 0.0.0.0/0 
       log: error connect disconnect 
} 
client block { 
       from: 0.0.0.0/0 to: 0.0.0.0/0 
       log: connect error 
} 
socks pass { 
       from: 0.0.0.0/0 to: 0.0.0.0/0 
       log: error connect disconnect 
} 
socks block { 
       from: 0.0.0.0/0 to: 0.0.0.0/0 
       log: connect error 
}

socksmethod: pam.username — Это значит что будем авторизоваться через PAM

Создаем файл /etc/pam.d/sockd и записываем в него:

auth sufficient /lib/security/pam_radius_auth.so debug 
account sufficient /lib/security/pam_radius_auth.so

Это мы указали библиотеки через которые PAM будет проверять соответствие логина и пароля для sockd

Создаем пользователя для прокси сервера (user.notprivileged)

useradd sockd

Заходим в MySQL создаем БД для Radius

mysql -uroot -p
mysql>CREATE DATABASE radius;
mysql>GRANT ALL PRIVILEGES ON radius.* TO radius@localhost IDENTIFIED BY 'radpass';
mysql> use radius;
mysql>SOURCE /etc/freeradius/3.0/mods-config/sql/main/mysql/schema.sql

radpass — это пароль для пользователя radius, под которым Radius будет стучаться к БД

Сразу добавим пользователя для прокси(авторизация)

mysql>INSERT INTO radcheck (UserName, Attribute, Value) VALUES ('proxyuser', 'Password', 'passforproxyuser');
mysql>quit

Открываем конфиг sql Radius

nano /etc/freeradius/3.0/sql.conf

Редактируем подключение к БД

server = 'localhost'
#port = 3306
login = 'radius'
password = 'radpass'
radius_db = 'radius'

Редактируем конфиг демона.

nano /etc/freeradius/3.0/radiusd.conf

Раскомментируем строку:

$INCLUDE  sql.conf

В следующем конфиге в секциях authorize{}  accounting {}  session {} раскомментируем все строки содержащие sql и sql_log

nano /etc/freeradius/sites-available/default

Далее.

nano /etc/freeradius/clients.conf

Находим secret = testing123 и меняем на свой пароль. (ну или не меняем, но запоминаем)

Этот пароль записываем в следующий файл.

nano /etc/pam_radius_auth.conf

# server[:port] shared_secret      timeout (s) 
127.0.0.1       testing123             1 
other-server    other-secret       3

Перезагружаем radius

/etc/init.d/freeradius restart

Запускаем Dante

/opt/dante/sbin/sockd -D

Проверить сервер можно командой:

curl -v -x socks5://proxyuser:passforproxyuser@xxx.xxx.xxx.xxx:1080 http://www.google.com/ #

Управлять пользователями можно через простенькую админ панель

Автозапуск сервера

Напишем скрипт который будет запускать сервер при загрузке системы. Скрипт должен располагаться в каталоге /etc/init.d/ и называться sockd.

nano /etc/init.d/sockd

Содержимое скрипта sockd.

#! /bin/sh
### BEGIN INIT INFO
# Provides: sockd
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start the dante SOCKS server.
# Description: SOCKS (v4 and v5) proxy server daemon (sockd).
# This server allows clients to connect to it and
# request proxying of TCP or UDP network traffic
# with extensive configuration possibilities.
### END INIT INFO
#
# dante SOCKS server init.d file. Based on /etc/init.d/skeleton:
# Version: @(#)skeleton 1.8 03-Mar-1998 miquels@cistron.nl
# Via: https://gitorious.org/dante/pkg-debian
PATH=/sbin:/usr/sbin:/bin:/usr/bin
NAME=sockd
DAEMON=/opt/dante/sbin/$NAME
DAEMON_ARGS="-D"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
DESC="Dante SOCKS daemon"
CONFFILE=/etc/$NAME.conf
# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions
set -e
# This function makes sure that the Dante server can write to the pid-file.
touch_pidfile ()
{
if [ -r $CONFFILE ]; then
uid="`sed -n -e 's/[[:space:]]//g' -e 's/#.*//' -e '/^user\.privileged/{s/[^:]*://p;q;}' $CONFFILE`"
if [ -n "$uid" ]; then
touch $PIDFILE
chown $uid $PIDFILE
fi
fi
}
case "$1" in
start)
if ! egrep -cve '^ *(#|$)' \
-e '^(logoutput|user\.((not)?privileged|libwrap)):' \
$CONFFILE > /dev/null
then
echo "Not starting $DESC: not configured."
exit 0
fi
echo -n "Starting $DESC: "
touch_pidfile
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
|| return 1
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
$DAEMON_ARGS \
|| return 2
echo "$NAME."
;;
stop)
echo -n "Stopping $DESC: "
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
[ "$?" = 2 ] && return 2
echo "$NAME."
;;
reload|force-reload)
#
# If the daemon can reload its config files on the fly
# for example by sending it SIGHUP, do it here.
#
# Make this a do-nothing entry, if the daemon responds to changes in its config file
# directly anyway.
#
echo "Reloading $DESC configuration files."
start-stop-daemon --stop --signal 1 --quiet --pidfile \
$PIDFILE --exec $DAEMON -- -D
;;
restart)
#
# If the "reload" option is implemented, move the "force-reload"
# option to the "reload" entry above. If not, "force-reload" is
# just the same as "restart".
#
echo -n "Restarting $DESC: "
start-stop-daemon --stop --quiet --pidfile $PIDFILE --exec $DAEMON
sleep 1
touch_pidfile
start-stop-daemon --start --quiet --pidfile $PIDFILE \
--exec $DAEMON -- -D
echo "$NAME."
;;
status)
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
;;
*)
N=/etc/init.d/$NAME
# echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
echo "Usage: $N {start|stop|restart|status|force-reload}" >&2
exit 1
;;
esac
exit 0

Сделаем скрипт исполняемым.

chmod +x /etc/init.d/sockd

Перечитаем всех демонов.

systemctl daemon-reload

Добавим sockd в автозапуск и запустим его.

systemctl enable sockd
systemctl start sockd

Проверим.

systemctl status sockd

 

Таблица mac адресов через SNMP PHP

$session_snmp = new SNMP(SNMP::VERSION_2C,'192.168.0.1', "puplic",1000000,2);
$dsf = $session_snmp->walk('1.3.6.1.2.1.17.7.1.2.2.1.2');

foreach($dsf as $key => $value){ //Запись таблицы в файл
file_put_contents('config.txt', $key.'='.$value."\n", FILE_APPEND);
}

$arr = file('config.txt');

$i=0;
foreach($arr as $val){

$val = str_replace("iso.3.6.1.2.1.17.7.1.2.2.1.2.", "",$val); //Удолить символы до влана
$macvlanport=explode('=',$val); //Разделить влан и мак с портом
$macvlanport[1] = str_replace("INTEGER: ", "",$macvlanport[1]); //Удолить из порта

$macvlan = explode('.', $macvlanport[0],2); //Разделить на влан и мак

$mac = explode('.', $macvlan[1]); //Разделить mac на октеты
foreach($mac as $macs){ //Перекодировать октеты в 16ричную и добавить обратно в массив
if(iconv_strlen($macs)==1){ //Если в октете один символ значит впереди о
$macsd[] = '0'.$macs;
}else{
$macsd[] = dechex ($macs);
}
}

$macaddr = implode(':',$macsd); //Собрать в строку mac

unset($macsd);

$fdb[$i]['port'] = trim($macvlanport[1]);//Порт
$fdb[$i]['vlan'] = $macvlan[0];//Влан
$fdb[$i]['mac'] = $macaddr; //мак

$i++;
}

array_multisort($fdb); //Сортируем по порту

$count = count($fdb);

//print_rex($fdb);

echo '
<table border="1">
<caption>Таблица mac адресов</caption>
<tr>
<th>Порт</th>
<th>Vlan</th>
<th>Mac</th>
</tr>';

for($i=0; $i< $count;$i++){

echo '<tr><td>'.$fdb[$i]['port'].'</td><td>'.$fdb[$i]['vlan'].'</td><td>'.$fdb[$i]['mac'].'</td></tr>';
}

echo '
</table>
';

Настройка mytarget для одностраничников

Админка для прокси сервера Dante

Если у вас стоит Dante в связке с MySQL и Radius и вы по какой-то причине не желаете устанавливать  Daloradius (WEB интерфейс), то это статья для вас.

Я написал простенькую админ панельку для управления пользователями прокси сервера. Скачать ее можно тут .

Установка проста:

Закидываем файлы в любую директорию на веб сервере в файле action.php прописываем логин пароль от базы данных.

В браузере переходим в ту директорию.

Управляем.

Рекомендую защитить папку паролем.

 

Установка и настройка прокси сервера Dante (socked) с авторизацией по MySQL

Статья как поднять свой Socks5 сервер с авторизацией через mysql. Учтите что Dante сервер условно бесплатный и модули для него платные.

Сервер будет работать в связке PAM+Radius+MySQL . Было это поднято на OS Debian 8 . Начнем:

Обновляем систему, а потом ставим нужные пакеты.

apt install freeradius freeradius-mysql freeradius-utils mysql-server libpam-radius-auth libpam-auth gcc -y

При установке пакетов MySQL попросит указать пароль root.

Качаем последнюю версию Dante. Распаковываем.

cd /tmp
https://www.inet.no/dante/files/dante-1.4.3.tar.gz
tar xvfdante-1.4.2.tar.gz

Компилируем

mkdir /opt/dante
./configure --prefix=/opt/dante
make
make install

Создаем и настраиваем конфигурационный файл Dante

nano /etc/sockd.conf

Выкладываю свой:

#logoutput: stderr 
logoutput: /var/log/socks.log 
internal: eth0 port = 1080  //имя и порт интерфейса с которых принимаются запросы
external: eth0 //Исходящий интерфейс

socksmethod: pam.username 
user.privileged : root 
user.notprivileged : sockd

client pass { 
       from: 0.0.0.0/0 to: 0.0.0.0/0 
       log: error connect disconnect 
} 
client block { 
       from: 0.0.0.0/0 to: 0.0.0.0/0 
       log: connect error 
} 
socks pass { 
       from: 0.0.0.0/0 to: 0.0.0.0/0 
       log: error connect disconnect 
} 
socks block { 
       from: 0.0.0.0/0 to: 0.0.0.0/0 
       log: connect error 
}

socksmethod: pam.username — Это значит что будем авторизоваться через PAM

Создаем файл /etc/pam.d/sockd и записываем в него:

auth sufficient /lib/security/pam_radius_auth.so debug 
account sufficient /lib/security/pam_radius_auth.so

Это мы указали библиотеки через которые PAM будет проверять соответствие логина и пароля для sockd

Создаем пользователя для прокси сервера (user.notprivileged)

useradd sockd

Заходим в MySQL создаем БД для Radius

mysql -uroot -p
mysql>CREATE DATABASE radius;
mysql>GRANT ALL PRIVILEGES ON radius.* TO radius@localhost IDENTIFIED BY 'radpass';
mysql> use radius;
mysql>SOURCE /etc/freeradius/sql/mysql/schema.sql

radpass — это пароль для пользователя radius, под которым Radius будет стучаться к БД

Сразу добавим пользователя для прокси(авторизация)

mysql>INSERT INTO radcheck (UserName, Attribute, Value) VALUES ('proxyuser', 'Password', 'passforproxyuser');
mysql>quit

Открываем конфиг sql Radius

nano /etc/freeradius/sql.conf

Редактируем подключение к БД

server = 'localhost'
#port = 3306
login = 'radius'
password = 'radpass'
radius_db = 'radius'

Редактируем конфиг демона.

nano /etc/freeradius/radiusd.conf

Раскомментируем строку:

$INCLUDE  sql.conf

В следующем конфиге в секциях authorize{}  accounting {}  session {} раскомментируем все строки содержащие sql и sql_log

nano /etc/freeradius/sites-available/default

Далее.

nano /etc/freeradius/clients.conf

Находим secret = testing123 и меняем на свой пароль. (ну или не меняем, но запоминаем)

Этот пароль записываем в следующий файл.

nano /etc/pam_radius_auth.conf

# server[:port] shared_secret      timeout (s) 
127.0.0.1       testing123             1 
other-server    other-secret       3

Перезагружаем radius

/etc/init.d/freeradius restart

Запускаем Dante

/opt/dante/sbin/sockd -D

Проверить сервер можно командой:

curl -v -x socks5://proxyuser:passforproxyuser@xxx.xxx.xxx.xxx:1080 http://www.google.com/ #

Управлять пользователями можно через простенькую админ панель

Автозапуск сервера

Напишем скрипт который будет запускать сервер при загрузке системы. Скрипт должен располагаться в каталоге /etc/init.d/ и называться sockd.

nano /etc/init.d/sockd

Содержимое скрипта sockd.

#! /bin/sh
### BEGIN INIT INFO
# Provides: sockd
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start the dante SOCKS server.
# Description: SOCKS (v4 and v5) proxy server daemon (sockd).
# This server allows clients to connect to it and
# request proxying of TCP or UDP network traffic
# with extensive configuration possibilities.
### END INIT INFO
#
# dante SOCKS server init.d file. Based on /etc/init.d/skeleton:
# Version: @(#)skeleton 1.8 03-Mar-1998 miquels@cistron.nl
# Via: https://gitorious.org/dante/pkg-debian
PATH=/sbin:/usr/sbin:/bin:/usr/bin
NAME=sockd
DAEMON=/opt/dante/sbin/$NAME
DAEMON_ARGS="-D"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
DESC="Dante SOCKS daemon"
CONFFILE=/etc/$NAME.conf
# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions
set -e
# This function makes sure that the Dante server can write to the pid-file.
touch_pidfile ()
{
if [ -r $CONFFILE ]; then
uid="`sed -n -e 's/[[:space:]]//g' -e 's/#.*//' -e '/^user\.privileged/{s/[^:]*://p;q;}' $CONFFILE`"
if [ -n "$uid" ]; then
touch $PIDFILE
chown $uid $PIDFILE
fi
fi
}
case "$1" in
start)
if ! egrep -cve '^ *(#|$)' \
-e '^(logoutput|user\.((not)?privileged|libwrap)):' \
$CONFFILE > /dev/null
then
echo "Not starting $DESC: not configured."
exit 0
fi
echo -n "Starting $DESC: "
touch_pidfile
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
|| return 1
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
$DAEMON_ARGS \
|| return 2
echo "$NAME."
;;
stop)
echo -n "Stopping $DESC: "
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
[ "$?" = 2 ] && return 2
echo "$NAME."
;;
reload|force-reload)
#
# If the daemon can reload its config files on the fly
# for example by sending it SIGHUP, do it here.
#
# Make this a do-nothing entry, if the daemon responds to changes in its config file
# directly anyway.
#
echo "Reloading $DESC configuration files."
start-stop-daemon --stop --signal 1 --quiet --pidfile \
$PIDFILE --exec $DAEMON -- -D
;;
restart)
#
# If the "reload" option is implemented, move the "force-reload"
# option to the "reload" entry above. If not, "force-reload" is
# just the same as "restart".
#
echo -n "Restarting $DESC: "
start-stop-daemon --stop --quiet --pidfile $PIDFILE --exec $DAEMON
sleep 1
touch_pidfile
start-stop-daemon --start --quiet --pidfile $PIDFILE \
--exec $DAEMON -- -D
echo "$NAME."
;;
status)
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
;;
*)
N=/etc/init.d/$NAME
# echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
echo "Usage: $N {start|stop|restart|status|force-reload}" >&2
exit 1
;;
esac
exit 0

Сделаем скрипт исполняемым.

chmod +x /etc/init.d/sockd

Перечитаем всех демонов.

systemctl daemon-reload

Добавим sockd в автозапуск и запустим его.

systemctl enable sockd
systemctl start sockd

Проверим.

systemctl status sockd

Swan Quad подключение к Arduino

Подключение датчика движения Swan Quad к Arduino

Схема

Скеч

int PinMotSenSt = 6;  // Пин для статуса движения датчика
int PinMotSenH = 7; //Пин для статуса целостности датчика
int ValSenSt;  // Переменная для хранения состояния статуса
int ValSenH; //Переменная для хранения состояния целостности

void setup() {
Serial.begin(9600); // Скорость
Serial.println("Start");
pinMode(PinMotSenSt, INPUT);  // Пин INPUT
pinMode(PinMotSenH, INPUT); //  Пин INPUT
}

void loop() {
ValSenSt = digitalRead(PinMotSenSt);  // считываем значение
ValSenH = digitalRead(PinMotSenH);  // считываем значение
Serial.print("статус - ");
Serial.println(ValSenSt);
Serial.print("Корпус - ");
Serial.println(ValSenH);
delay(1000);
}

Если кому не видно  на изображении — резисторы по 2,2 кОм.

Вывод с аналогого порта

void setup() {
// инициализируем соединение на скорости 9600 бит в секунду:
Serial.begin(9600);
}

void loop() {
// Считываем данные с аналогового вывода A0
int sensorValue = analogRead(A0); // получаем текущее значение
Serial.println(sensorValue, DEC); // выводим результат на монитор
delay(1); // небольшая задержка для стабильности вывода результатов
}

Включение света с наступлением темноты

Статья будет доработана. Будет добавлено описание для чайников)

int ledPin = 13; // используем встроенный светодиод на выводе 13

void setup() {
pinMode(ledPin, OUTPUT);
}

void loop() {
// считываем показания с аналогового вывода A0
int sensorValue = analogRead(A0);

if(sensorValue < 50){
// Если потемнело, то выключаем светодиод
digitalWrite(ledPin, LOW);
}
else {
// Если светло, то включаем светодиод

digitalWrite(ledPin, HIGH);
}
}

 

Включение реле по команде

Статья будет доработана. Будет добавлено описание для чайников)

 

/*Включение выключение по команде*/
//Библиотека для приемника и передатчика 433
#include <RemoteSwitch.h>

//коды кнопок реле
#define BTNKON 154502
#define BTNKOFF 157612
#define PERIOD 323;


//отправка радио сигнала на включение реле (433)
void transmit(unsigned long rcode){
unsigned long code = rcode;
unsigned long period = PERIOD;
code |= (unsigned long)period << 23;
code |= 3L << 20; //(|= 3L) 
RemoteSwitch::sendTelegram(code, 9); // 7 - пин радио передатчика
}


//Обозначаем переменную команды
int val = 0;

void setup() {
Serial.begin(9600); // Open serial communications and wait for port to open:
Serial.println("Start");
}

void loop() {
if (Serial.available() > 0) {
val = Serial.read();
if (val=='H'){ 
transmit(BTNKON);
Serial.println("BTNKON");
}
if (val=='L'){ 
transmit(BTNKOFF);
Serial.println("BTNKOFF");
} 
}
}