平台: bananapi M1开发板(双核心ARM Crotex-A7)
操作系统: Raspbian (2016-07-13-raspbian-jessie-bpi-m1-m1p-r1.img)
主要目的:
由于家中不再需要Android电视盒,因此BPI M1也就积灰许久,我考虑后决定将M1部署为服务器,提供VPN访问,方便在越来越常见的开放无线热点中保障自己的通信安全;同时部署Radius服务,提高家庭无线网络认证的安全性。
Contents
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登录名和密码选项。重启无线网卡后即可重新认证成功。
2条评论. Leave new
老铁,第六点写的有问题吧?
6.启用PEAP鉴权:
编辑 /etc/freeradius/eap.conf文件,并修改
default-eap-type = md5
为
default-eap-type = md5
是的,此处应该是改为peap