作为一个自由的跨平台软件,Stunnel用于提供全局的TLS/SSL加密服务。针对本身无法进行TLS或SSL通信的客户端及服务器,Stunnel可提供安全的加密连接。该软件可在许多操作系统下运行,包括Unix-like系统,以及Windows。Stunnel基于OpenSSL,严格意义上Stunnel并非一个完整的产品,运行stunnel需要有一个SSL库,典型的就是OpenSSL。
因其全局SSL/TLS加密的特性,且协议上支持应用层之下的socks,所以我们无需添加额外的tun2socks或proxy接驳组件,可直接通过socks over TLS组建socks VPN,在经典的富强应用场景下,若干年来的示例都是错误的,简单的事情复杂化、脱裤子放屁。同时,stunnel也支持PSK身份验证(源自OpenSSL),对于家庭用户和小型企业非常友好,避免了CA/PKI服务的开销以及密钥交换的繁琐管理要求。本文示例采用PSK身份验证方式,有关证书验证方式另文「精悍的工具-Stunnel搭建跨境加密隧道及代理实现」加以分享。
1.VPS上安装Stunnel服务端
首先,使用apt安装stunnel4(安装后stunnel仅仅是stunnel4的软链接)以及检查IP转发和启动设置。
apt install stunnel4 -y #apt install stunnel -y #与上一命令等效 #cat /etc/sysctl.conf #cat /etc/default/stunnel4
具体检查IP转发和启动设置的详细内容参考「前文」,这里不再重复。完成检查后,编辑、修改stunnel配置文件,配置文件中的具体选项可参考另文 「Stunnel配置文件主要选项」。
syslog = no debug = 3 output = /var/log/stunnel4/st.log pid = /var/run/stunnel.pid [tunnelproxy] accept = <port> ciphers = PSK PSKsecrets = /etc/stunnel/psk.ini protocol = socks ;socket = l:TCP_NODELAY=1 ;socket = r:TCP_NODELAY=1 TIMEOUTidle = 3600
上述示例文件中,注释的两行“socket =...”对于普通场景应用意义不大,对游戏应用应该有所帮助和提升,可能增加的网络负载理论上不会造成太大影响。本例中并没有使用connect选项,如果取消注释,使用“socket = l:TCP_NODELAY=1”一行即可,对应地,应将“socket = r:TCP_NODELAY=1”添加至客户端配置文件的服务块中。
配置文件编辑保存后使用systemctl重启stunnel4服务。需要提醒两点:
- 服务是stunnel4.service,不是stunnel.service,重启后者必定出错;
- stunnel4.service服务描述文件已自动创建,不要试图再去手动创建。
2.客户端/OpenWRT上安装与配置
2.1 安装
OpenWRT可以通过opkg包管理器直接安装,通过luci的software Web GUI界面,实际也是调用opkg包管理器进行安装。当前安装的stunnel版本为5.62,高于debian/ubuntu安装的版本。
opkg update opkg install stunnel
在luci界面,软件包搜索stunnel即可安装或移除,stunnel本体不足80k,主要依赖为openssl。
2.2 stunnel客户端配置
安装完成后,init.d启动脚本文件、uci stunnel配置文件、stunnel原生配置文件分别为/etc/init.d/stunnel、/etc/config/stunnel和/etc/stunnel/stunnel.conf,启动脚本文件可以直接运行,不经uci直接加载原生配置文件,使用service命令则由uci接管加载uci stunnel配置文件,创建原生配置文件并启动stunnel。
stunnel启动脚本中定义了配置文件(原生)、pid文件等,如果不适用uci,则原生配置文件中不应再行指定pid文件以及其他启动脚本中已有定义的全局配置。
stunnel的uci配置文件为/etc/config/stunnel,可参考以下样例文件,与服务端保持一致采用PSK预共享密钥验证方式。
config service 'tunnelproxy' option enabled '1' option client '1' option accept '127.0.0.1:10088' option connect 'server_ip:port' option ciphers 'PSK' option PSKsecrets '/etc/stunnel/psk.ini'
注意将上述“server_ip:port”修改为实际的远程服务端的IP地址和监听端口,编辑完成后保存。无论是否使用uci,都需要在创建psk文件,文件路径和名称和配置文件的PSKsecrets选项指定的保持一致。
完成上述工作后,就可以使用service命令启动或重启stunnel服务。一般情况下,stunnel安装完成后会以initi.d守护进程自动启动,因此建议使用restart参数重启服务。
service stunnel restart
另外,可以在luci界面,通过『系统』菜单,点开『启动项』后,可以对stunnel进行启动、重启、停止以及停用、启用等操作。
stunnel安装过程中会创建默认的/etc/stunnel/stunnel.conf样例文件,与windows下的样例文件内容相同,可直接在最后添加自定义服务块内容,也将其备份并新建。如果备份在同一目录下,建议后缀不使用“.conf”。在OpenWRT的/etc/init.d/下,stunnel的启动脚本文件定义了配置文件。
mv /etc/stunnel/stunnel.conf /etc/stunnel/stunnel.conf.backup nano /etc/stunnel/stunnel.conf
本文演示的配置文件/etc/stunnel/stunnel.conf内容如下,Ctrl+O保存后Ctrl+X退出。
[tunnelproxy] client = yes accept = 127.0.0.1:10088 connect = server_ip:port ciphers = PSK PSKsecrets = /etc/stunnel/psk.ini ;socket = r:TCP_NODELAY=1
在使用uci的情况下,uci会自动生成stunnel原生配置文件,除全局配置和服务配置选项的顺序不同外,服务配置内容上应完全一致。如果启动失败,uci生成的原生配置文件仅有全局配置块,或者于上述手动编辑的配置文件内容不同,说明配置错误。配置完成后,直接运行stunnel即可启动,启动脚本会直接加载/etc/stunnel/stunnel.conf配置文件。
3.终端配置
路由器配置完成后可以使用
Windows下使用Chrome/Edge SwitchyOmega插件,选择socks5协议,代理IP和端口指向路由器地址即可,不再赘述。
对于系统代理的配置,尽管win11取消了协议选择,但仍可强制配置。需要分为两步或直接在注册表新建相应的REG_SZ值,测试重启后不会失效。第一步是是配置代理为“socks=127.0.0.1”,地址、端口可随意填写,配置虽然错误,但系统会新建注册表项,正确的配置反而不会新建注册表项。
点击『保存』后,通过『windows徽标键+R』,输入『regedit』,回车打开注册表编辑器。需要修改的注册表项路径为“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings”,名称为ProxyServer。
双击ProxyServer项打开,修改为正确的代理地址及端口,socks代理应为“socks://ip:port”,保存之后即刻生效。
这样,windows主机就可以不安装任何软件和插件,全局通过stunnel隧道访问互联网。老E认为,如果不是完全访问境外站点或服务,这么做没有必要,但总有人会有这种需求,所以附带略作介绍。
文章评论
请教如何设置某些网址代理呢?
@mto 分流是吧 某些代理 某些不代理 装ipset就是简化这方面工作的 还没来得及码字说明
请教大佬!按你的方法服务端和windows客户端可以正常访问,但openwrt始终连接不上。我理解的是配置/etc/config/stunnel成功后service stunnel restart,会自动生成或配置/etc/stunnel/stunnel.conf,但是我无论怎么配置/etc/config/stunnel,/etc/stunnel/stunnel.conf的内容都不会改变
@Tesoo openwrt上改配置用uci 有单独的配置文件 服务重启会用uci配置并覆盖/etc/stunnel下的