BPI-M1 搭建SoftEther VPN + DaloRADIUS 服务

BPI-M1 搭建SoftEther VPN + DaloRADIUS 服务

平台: bananapi M1开发板(双核心ARM Crotex-A7)
操作系统: Raspbian (2016-07-13-raspbian-jessie-bpi-m1-m1p-r1.img)
主要目的:
由于家中不再需要Android电视盒,因此BPI M1也就积灰许久,我考虑后决定将M1部署为服务器,提供VPN访问,方便在越来越常见的开放无线热点中保障自己的通信安全;同时部署Radius服务,提高家庭无线网络认证的安全性。

Part0 : 准备工作

准备操作系统

首先下载镜像,并且使用Etcher将img镜像烧写到SD卡,启动系统。可以使用raspi-config扩展系统空间。

准备proxychains-ng为软件源更新加速

Proxychains-ng是proxychains的加强版,可以更方便的为终端中运行的程序提供透明代理。它能支持http/https/socks4/socks5,也支持认证,并且支持轮询,严格,随机等多种代理模式。

1.下载源码:
git clone https://github.com/rofl0r/proxychains-ng
./configure --prefix=/usr/local --sysconfdir=/etc
make && make install
make install-config
2.配置proxychains-ng:

Proxychains-ng的默认配置为proxychains.conf
直接将代理添加到[ProxyList]即可

vi /etc/proxychains.conf
[ProxyList]
socks5  127.0.0.1 1086
http    127.0.0.1 1080
3.使用proxychains-ng:

proxychains-ng使用格式如下:

proxychains4 程序 参数

为系统设定静态IP:

一般来说我会选择将服务器设定为静态IP以方便管理。
我们可以直接修改/etc/dhcpcd.conf文件。

interface eth0
static ip_address=192.168.0.10/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1

设置完成后重启即可生效。

Part1 : 编译安装SoftEther:

1.安装编译器:
apt install -y build-essential
2.设置防火墙(可选):

如果希望使用防火墙,那么可以建立一个shell脚本:

#!/bin/bash
iptables -F
iptables -X
iptables -F -t mangle
iptables -t mangle -X
iptables -F -t nat
iptables -t nat -X

# Set default chain policies
iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

# Accept on localhost
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Allow established sessions to receive traffic
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

#Permit ICMP Echo (OPTIONAL)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# Accept incoming SSH
iptables -I INPUT -p tcp --dport 22 -j ACCEPT

# SoftEther
iptables -I INPUT -p udp --dport 443 -j ACCEPT
iptables -I INPUT -p tcp --dport 443 -j ACCEPT
iptables -I INPUT -p udp --dport 992 -j ACCEPT
iptables -I INPUT -p tcp --dport 992 -j ACCEPT
iptables -I INPUT -p udp --dport 500 -j ACCEPT
iptables -I INPUT -p udp --dport 4500 -j ACCEPT

# Radius
iptables -I INPUT -p udp --dport 1812 -j ACCEPT
iptables -I INPUT -p udp --dport 1813 -j ACCEPT

# Save Changes
iptables-save >  /etc/iptables/rules.v4

# Service
service iptables restart
service iptables status

为这个脚本setfirewall.sh设置可执行权限:chmod +x setfirewall.sh并且执行:./ setfirewall.sh。结果可以通过iptables -L -n -v预览。

3.下载源码:
curl -O http://www.softether-download.com/files/softether/v4.25-9656-rtm-2018.01.15-tree/Linux/SoftEther_VPN_Server/32bit_-_ARM_EABI/softether-vpnserver-v4.25-9656-rtm-2018.01.15-linux-arm_eabi-32bit.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 6117k  100 6117k    0     0   451k      0  0:00:13  0:00:13 --:--:--  726k 
4.解压源码:

解压源码到/usr/local/,此操作需要root权限

tar xzvf softether-vpnserver-v4.20-9608-rtm-2016.04.17-linux-x64-64bit.tar.gz -C /usr/local/
vpnserver/
vpnserver/Makefile
vpnserver/.install.sh
vpnserver/ReadMeFirst_License.txt
vpnserver/Authors.txt
vpnserver/ReadMeFirst_Important_Notices_ja.txt
vpnserver/ReadMeFirst_Important_Notices_en.txt
vpnserver/ReadMeFirst_Important_Notices_cn.txt
vpnserver/code/
vpnserver/code/vpnserver.a
vpnserver/code/vpncmd.a
vpnserver/lib/
vpnserver/lib/libcharset.a
vpnserver/lib/libcrypto.a
vpnserver/lib/libedit.a
vpnserver/lib/libiconv.a
vpnserver/lib/libintelaes.a
vpnserver/lib/libncurses.a
vpnserver/lib/libssl.a
vpnserver/lib/libz.a
vpnserver/lib/License.txt
vpnserver/hamcore.se2 
5.编译:
cd /usr/local/vpnserver
make

编译完成后会在根目录生成vpncmd和vpnserver文件。

6.赋予权限:

为这些文件赋予相应的权限:

chown -R root:root /usr/local/vpnserver  
cd /usr/local/vpnserver/  
chmod -R 600 *  
chmod 700 vpncmd  
chmod 700 vpnserver
7.创建systemd脚本:

为SoftEther创建一个自启动/停止的脚本:

vi /etc/systemd/system/softether.service
[Unit]
Description=SoftEther VPN Server  
After=network.target auditd.service  
ConditionPathExists=!/usr/local/vpnserver/do_not_run

[Service]
Type=forking  
EnvironmentFile=-/usr/local/vpnserver  
ExecStart=/usr/local/vpnserver/vpnserver start  
ExecStop=/usr/local/vpnserver/vpnserver stop  
KillMode=process  
Restart=on-failure

# Hardening
PrivateTmp=yes  
ProtectHome=yes  
ProtectSystem=full  
ReadOnlyDirectories=/  
ReadWriteDirectories=-/usr/local/vpnserver  
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_BROADCAST CAP_NET_RAW CAP_SYS_NICE CAP_SYS_ADMIN CAP_SETUID

[Install]
WantedBy=multi-user.target

完成后,启动并设定自启动:

systemctl enable softether
systemctl start softether
8.配置SoftEther VPN Server:

这里我直接使用Windows上的SE-VPN Server Manager,它可以通过GUI向导快速建立自己的SE-VPN Server配置。
首先输入服务端地址,点击连接,此时登录密码为空,直接点击确定。

设置相应的密码:

根据向导配置自己需要的服务。

注:如果需要NAT功能,那么可以参考https://rharmonson.github.io/se4cos7.html中的Local Bridge dnsmasq部分设置,也可以直接使用SecureNAT功能。此处我无需设定,直接使用路由的dhcp。

Part2 : 安装FreeRADIUS + DaloRADIUS

为了尝试使用Radius管理WLAN认证,我选择了开源的FreeRADIUS方案。它包含了多种模块,可以支持SQL,也有Perl/Python模块,可以很方便的进行二次开发。Radius可以实现AAA(Authentication, Authorization和Accounting)框架。在这里我仅使用Authentication功能,为WLAN设置。提供WPA2-Enterprise的认证服务。

1.安装FreeRADIUS与依赖:
apt-get install freeradius freeradius-mysql apache2 php5 libapache2-mod-php5 mysql-server mysql-client php5-mysql php-pear php5-gd php-db

安装时需要输入MySQL的数据库密码。

2.初始化FreeRADIUS:

FreeRADIUS的设置文件在/etc/freeradius中。默认设定下,FreeRADIUS的用户信息记录在一个文本文件中,可以用来测试FreeRADIUS。

vi /etc/freeradius/users

将以下两行的注释去除。

#"John Doe" Cleartext-Password := "hello"
# Reply-Message = "Hello, %{User-Name}"

停止服务并进入debug模式确认:

/etc/init.d/freeradius stop
freeradius -X

如果显示” Info: Ready to process requests.”代表功能正常,按下ctrl+C结束,重新启动服务后,使用radtest确认认证服务是否正常:

/etc/init.d/freeradius start
radtest "John Doe" hello 127.0.0.1 0 testing123

如果成功则出现以下信息:

Sending Access-Request of id 180 to 127.0.0.1 port 1812
        User-Name = "John Doe"
        User-Password = "hello"
        NAS-IP-Address = 127.0.1.1
        NAS-Port = 0
        Message-Authenticator = 0x00000000000000000000000000000000 

接下去就可以设置SQL相关的配置了。

3.安装DaloRADIUS:

为了使用DaloRADIUS管理FreeRADIUS SQL数据库,首先下载并且解压DaloRADIUS到/var/www/html (Raspbian jessie 之前的版本apache的默认路径是放在/var/www/)

cd ~/Downloads
wget http://downloads.sourceforge.net/project/daloradius/daloradius/daloradius0.9-9/daloradius-0.9-9.tar.gz
tar zxvf daloradius-0.9-9.tar.gz -C /var/www/html
mv /var/www/html/daloradius-0.9-9/ /var/www/html/daloradius
cd /var/www/html/daloradius
4.配置MySQL:

首先为radius设定独立的数据库用户及其密码,并且将DaloRADIUS数据库模板导入。

mysql -u root -p
mysql>create database radiusdb;
mysql>exit
mysql -u root -p radiusdb < /var/www/html/daloradius/contrib/db/fr2-mysql-daloradius-and-freeradius.sql
mysql -u root -p
mysql>CREATE USER 'radiususer'@'localhost';
mysql>SET PASSWORD FOR 'radiususer'@'localhost' = PASSWORD('radius_password');
mysql>GRANT ALL ON radiusdb.* to 'radiususer'@'localhost';
mysql>exit

取消FreeRADIUS配置文件中SQL相关内容的注释:
第一处:/etc/freeradius/radiusd.conf

# $INCLUDE sql.conf
# $INCLUDE sql/mysql/counter.conf

第二处:/etc/freeradius/sites-enabled/default

# See "Authorization Queries" in sql.conf
sql
# See "Accounting queries" in sql.conf
sql
# See "Simultaneous Use Checking Queries" in sql.conf
sql
# See "Authentication Logging Queries" in sql.conf
sql

为FreeRADIUS配置数据库连接信息,修改/etc/freeradius/sql.conf相应的参数

server = "localhost"
#port = 3306
login = "radiususer"
password = "radius_password"
# Database table configuration for everything except Oracle
radius_db = "radiusdb" 

修改/etc/freeradius/clients.conf,添加客户端:

client 192.168.10.0/24 {
 secret = somesecret
 shortname = radius_wlan_guest
}

此处代表允许192.168.10.0/24 IP段所有的客户端,当然也可以用ipaddr=来指定。
重启FreeRADIUS服务:

/etc/init.d/freeradius restart

设置DaloRADIUS数据库连接,修改/var/www/html/daloradius/library/daloradius.conf.php 并且将需要用的的信息填写进去。

$configValues['CONFIG_DB_ENGINE'] = 'mysql';
$configValues['CONFIG_DB_HOST'] = 'localhost';
$configValues['CONFIG_DB_PORT'] = '3306';
$configValues['CONFIG_DB_USER'] = 'radiususer';
$configValues['CONFIG_DB_PASS'] = 'radius_password';
$configValues['CONFIG_DB_NAME'] = 'radiusdb'; 

以上内容都设置正确的情况下则可以进入DaloRADIUS设置页面了:
http://your_server/daloradius/
默认的登录用户名为administrator密码为radius。
进入后可以在Configuration -> Operators ->找到administrator并可以修改密码。
可以通过Management中的New User添加需要的账户。

5.配置WAP2-Enterprise:

以ddwrt配置为例:
进入无线设置->无线安全设置,选择WPA2 Enterprise。将WPA算法设置为TKIP+AES保持最大兼容性,设置Radius认证服务器地址,端口以及共享密匙应用后即可生效。

此时的设置其实已经可以用在不少的Radius客户端上了,但是默认的EAP类型是md5,已经无法在Microsoft的客户端或者是其他一些手机客户端上使用了。如果此时进行认证,则会在log上得到如下内容(log需要在/etc/freeradius/radiusd.conf 开启auth、auth_badpass、auth_goodpass)

Wed Feb 28 16:36:20 2018 : Auth: Login incorrect: [username/<via Auth-Type = EAP>] (from client ddwrt port 0 via TLS tunnel) 
Wed Feb 28 16:36:20 2018 : Auth: Login incorrect: [username /<via Auth-Type = EAP>] (from client ddwrt port 20 cli 283f69c9f865) 
Wed Feb 28 17:01:17 2018 : Info: Signalled to terminate
Wed Feb 28 17:01:17 2018 : Info: Exiting normally.

因此我们需要采用EAP-MSCHAPv2鉴权。

6.启用PEAP鉴权:

编辑 /etc/freeradius/eap.conf文件,并修改

default-eap-type = md5 

default-eap-type = peap 
7.设置证书:

由于鉴权需要TLS传输信息,因此需要相应的证书,这里利用freeradius提供的模板进行自签证书的生成。
首先复制/usr/share/doc/freeradius/example/certs的文件:

cd /usr/share/doc/freeradius/examples/certs
sudo cp Makefile ca.cnf server.cnf xpextensions /etc/freeradius/certs
cd /etc/freeradius/certs 

修改ca.cnf与server.cnf以下的内容,务必保证两处相同。

[ CA_default ]
default_days = 3650 # 10 years
[ req ]
input_password = your_inputoutput_password
output_password = your_inputoutput_password
[certificate_authority]
countryName = CN
stateOrProvinceName = somestate
localityName = yourtown
organizationName = yourorg
emailAddress = [email protected]
commonName = "some cool short desription"

然后,生成证书:

make all

如果选择校验证书,还需要将自签的根证书导入windows客户端(ca.der)
修改/etc/freeradius/eap.conf让证书生效:

private_key_password = your_inputoutput_password
8.配置MSCHAPv2

修改/etc/freeradius/modules/mschap,启用以下参数:

use_mppe = yes
require_encryption = yes
require_strong = yes
with_ntdomain_hack = yes

修改/etc/freeradius/sites-enabled/inner-tunnel,让FreeRADIUS在内部CHAP通道传输SQL数据:

# See "Authorization Queries" in sql.conf
sql
# See "Simultaneous Use Checking Queries" in sql.conf
sql
# See "Authentication Logging Queries" in sql.conf
sql 

重新载入库文件并且重启FreeRADIUS服务:

ldconfig
/etc/init.d/freeradius restart

这时候,手机就可以正常的使用PEAP- MSCHAPv2进行认证连接了。

Tips:

在Windows 7连接WAP2-Enterprise网络的时候往往会出现无法连接的问题,通过观察radius日志我发现:

Wed Feb 28 18:05:51 2018 : Auth: Login incorrect (TLS Alert read:fatal:unknown CA): [host/hostname/<via Auth-Type = EAP>] (from client ddwrt port 9 cli 08570039addd) 
Wed Feb 28 18:06:32 2018 : Auth: Login incorrect: [domain \\username/<via Auth-Type = EAP>] (from client ddwrt port 0 via TLS tunnel) 
Wed Feb 28 18:06:32 2018 : Auth: Login incorrect: [domain \\ username /<via Auth-Type = EAP>] (from client ddwrt port 9 cli 08570039addd)

也就是说,Windows 7会校验无效的CA证书,同时会在登录信息中同时发送自己的域信息,也就会造成认证失败。因此对于这种情况,因该向电脑中添加相应的CA根证书(并且在无线网络认证中勾选校验此证书),同时在无线网络属性->安全->设置(选择网络身份验证方法)->配置(选择身份验证方法)->不勾选自动使用Windows登录名和密码选项。重启无线网卡后即可重新认证成功。

Amefs, Bananapi, EFS, IT, Linux
上一篇文章
FontLoader 字体临时载入工具
下一篇文章
有关屏蔽qBittorrent Tracker Authentication以及编译

2条评论. Leave new

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Fill out this field
Fill out this field
请输入有效的邮箱地址。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

keyboard_arrow_up