Hysteria 是一个功能丰富的,专为恶劣网络环境进行优化的网络工具(双边加速),比如卫星网络、拥挤的公共 Wi-Fi、连接外围服务器等。 基于修改版的 QUIC 协议。新版本支持在FreeBSD系统上进行部署,并支持以下代理形式:
- SOCKS5 代理 (TCP & UDP)
- HTTP/HTTPS 代理
- TCP/UDP 转发
- TCP/UDP TPROXY 透明代理 (Linux)
- TCP REDIRECT 透明代理 (Linux)
- TUN (Windows 下为 TAP)
接下来介绍在OPNsense22.7.6上配置Hysteria,并使用tun接口进行策略路由的方法。为防止DNS污染,使用mosdns解析域名。
一、服务器配置
以运行Ubuntu 20.04 LTS系统为例,服务器端的配置如下:
1、创建并进入Hysteria程序存放的文件夹
mkdir hy cd hy
2、下载Hysteria
注意:请到官方更新下载地址。也可以用Winscp等工具上传到指定目录。
wget https://github.com/HyNetwork/hysteria/releases/download/v1.3.0/hysteria-linux-amd64
3、设置执行权限
chmod 755 hysteria-linux-amd64
4、生成私钥
openssl ecparam -genkey -name prime256v1 -out ca.key
5、生成证书:
openssl req -new -x509 -days 36500 -key ca.key -out ca.crt -subj "/CN=bing.com"
6、转发端口范围到指定监听端口9999
从1.3.0 版本开始,Hysteria 加入了多端口/端口范围地址的支持,客户端可以在指定端口范围内自动跳跃,解决了长时间单端口UDP连接容易被运营商封锁/QoS的问题。
# IPv4
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 20000:50000 -j DNAT --to-destination :9999
#IPv6
ip6tables -t nat -A PREROUTING -i eth0 -p udp --dport 20000:50000 -j DNAT --to-destination :9999
如果提示命令出错,那说明系统没有安装iptables。使用以下命令进行安装iptables。
apt update apt install iptables
7、服务端配置
用vi编辑工具在当前目录新建一个config.json配置文件,代码如下:
注意,从1.这里的端口可以自定义,建议使用不常见的端口号。
{ "listen": ":9999", "cert": "/root/hy/ca.crt", "key": "/root/hy/ca.key", "obfs": "password" }
8、开放端口访问:
通过apt软件管理器安装UFW。
apt update apt install ufw
执行以下命令,开放访问端口:
ufw allow 9999/udp
9、运行服务端
nohup ./hysteria-linux-amd64 server > hysteria.log 2>&1 &
提示:也可以使用一键脚本来安装,该脚本可以自动生成Clash.Meta、v2rayN的配置文件,单击这里观看配置视频。
二、mosdns配置
1、创建Workers
注册cloudflare账号并登陆,点最左边的Workers(不需要域名),创建服务,名称dns1,点快速编辑,进入编辑模式,全选删除所有内容,粘贴附件worker-dns1中的代码。
继续创建服务,名称dns2,点快速编辑,粘贴附件worker-dns2中的代码。
2、修改配置文件
回到wokers,记录两个workers的域名。修改附件dns文件夹下的config.yaml文件,替换120行和122行对应域名。
三、OPNsense配置
1、禁用OPNsense的DNS解析
由于使用mosdns进行解析,所以必须禁用防火墙的DNS解析功能。
禁用DNSMASQ DNS。
禁用UNBOUND DNS。
2、上传文件
使用finalshell软件连接pfSense,下载最新版的基于FreeBSD系统的hysteria和mosdns程序,替换本文后面附件中的对应文件。将dns和vpn文件夹上传到/root目录,并赋予程序执行权限。
chmod +x /root/dns/mosdns chmod +x /root/vpn/vpn
3、运行客户端
启动hysteria客户端。
nohup /root/vpn/vpn -c /root/vpn/vpn1.json
注意:配置文件vpn.json必须包含tun接口名称。从1.30版本开始,支持多端口跳跃,服务器端口可以填写一个指定范围,如下所示:
{ "server": "xxx.xxx.xxx.xxx:20000-50000", "protocol": "udp", "obfs": "password", "up_mbps": 500, "down_mbps": 1000, "insecure": true, "tun": { "name": "tun_vpn1", "timeout": 300, "mtu": 1500, }, }
4、添加tun接口
导航到接口>分配,添加tun接口并分配IP,IP地址不能与LAN接口网络冲突。该接口不需要添加防火墙规则。
接口分配一个静态IP地址:
5、添加接口网关
导航到系统>网关,在该VPN1接口上添加网关,网关地址不能与接口地址相同。选中禁用网关监控。
6、添加GeoIP别名
根据官方使用说明,需要先注册一个GeoLite2帐号,登录后,点击左侧的管理许可证密钥,生成一个新的API密钥。
用生成的注册码,替换下面地址的红字部分:
https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country-CSV&license_key=My_License_key&suffix=zip
将修改后的地址填入防火墙>别名>Geoip设置的网址栏,点击应用。
下载完成后,回到防火墙>别名,添加一个Geoip地址别名,内容选中国。
7、设置策略路由
在防火墙的lan接口,设置三条规则,第一条,放行DNS所使用的默认端口,走默认网关。第二条,访问国内地址走默认网关,目标选前面添加的别名。第三条,其他地址走代理网关,高级选项里的网关选VPN1。
注意,为了避免环回环,对VPS的访问要走本地网关;如果配置了Zerotier或Tailscale,也需要将远程局域网设置为走本地网关,不走VPN出站。
8、运行MOSDNS
打开另一个shell窗口,运行以下命令启动mosdns。客户端网关、DNS设置为防火墙的LAN接口地址,测试网络访问情况。
/root/dns/mosdns start -c /root/dns/config.yaml -d /root/dns/
9、添加开机启动项
根据官方说明,可以在/usr/local/etc/rc.syshook.d/start目录下添加启动脚本,也可以直接在/usr/local/etc/rc.syshook.d/start/20-freebsd文件中添加脚本:
# run mosdns ping -c 3 127.1 nohup /root/dns/mosdns start -c /root/dns/config.yaml -d /root/dns/ >/dev/null 2>&1 & # run hysteria ping -c 4 127.1 nohup /root/vpn/vpn -c /root/vpn/vpn1.json > /dev/null 2>&1 & ping -c 5 127.1 ifconfig tun_vpn1 10.0.0.1 netmask 0xffffffff
10、重启防火墙
重启防火墙,检查脚本运行是否正常。
11、测试
重启后检查各项配置是否正常,客户端测试网络访问是否正常。
12、已知问题
由于使用的大陆白名单,所有的国外地址全部走VPS出站,下载国外资源时,受VPS带宽的限制,下载的速度会受到影响。解决办法是使用国外黑名单来排除,即黑名单地址才走国外VPS出站,但目前没找到黑名单对应的IP地址更新列表,且黑名单大都使用了base64进行加密。
网关监控不能自动启用。重启防火墙后,如果启用了VPN网关监控,网关并不会显示在线,这并不影响使用。可以在服务列表手动启用网关监控服务。
与多WAN不兼容。OPNsense多WAN依赖UNBOUND DNS进行网关策略路由,如果使用hysteria,由于不能使用防火墙自身的DNS解析,造成多WAN负载平衡功能无法实现,只能实现故障转移功能。
为了解决上述问题,可以使用Clash Meta来配置hysteria节点,能过OPNsense的Web代理功能来实现透明代理。具体请参阅OPNsense配置Clash透明代理。
感谢群友老D提供技术指导。
配置文件示例下载:附件 解压密码:pfchina.org
相关文章: