tun2socks是一个轻量化的代理工具,可以处理来自本设备的任意网络应用的所有网络流量并通过代理转发。支持HTTP/Socks4/Socks5/Shadowsocks等代理协议, 可以作为第三层网关处理来自同一网络中其他设备的所有网络流量。有网友完整总结了在OPNsense上的配置过程,现在全文转载如下:
由于OPNsense上的Squid 包将被降低支持力度,且该方法无法代理 UDP/Quic 流量,故使用一种全新的方法来解决这个问题。
准备可执行文件和配置文件
前往xjasonlyu/tun2socks下载最新的适用于FreeBSD的tun2socks
可执行文件,使用winscp等软件,将文件复制到防火墙/usr/local/tun2socks
。
新建配置文件/usr/local/tun2socks/config.yaml
,内容如下:
# debug / info / warning / error / silent
loglevel: info
# URL format: [protocol://]host[:port]
# 这里填写到代理服务器的链接
# 配置透明网关可参考文章:https://rxclc.club/index.php/archives/18/
proxy: socks5://192.168.3.10:7891
# URL format: [driver://]name
# TUN 设备名称,避免使用 tun0
device: tun://proxytun2socks0
# Maximum transmission unit for each packet
mtu: 1500
# Timeout for each UDP session, default value: 60 seconds
udp-timeout: 120s
运行 tun2socks -config config.yaml
,测试配置文件是否正确。
新建服务文件
新建/usr/local/etc/rc.d/tun2socks
文件,内容如下:
#!/bin/sh
# PROVIDE: tun2socks
# REQUIRE: LOGIN
# KEYWORD: shutdown
. /etc/rc.subr
name="tun2socks"
rcvar="tun2socks_enable"
load_rc_config $name
: ${tun2socks_enable:=no}
: ${tun2socks_config:="/usr/local/tun2socks/config.yaml"}
pidfile="/var/run/${name}.pid"
command="/usr/local/tun2socks/tun2socks"
command_args="-config ${tun2socks_config} > /dev/null 2>&1 & echo \$! > ${pidfile}"
start_cmd="${name}_start"
tun2socks_start()
{
if [ ! -f ${tun2socks_config} ]; then
echo "${tun2socks_config} not found."
exit 1
fi
echo "Starting ${name}."
/bin/sh -c "${command} ${command_args}"
}
run_rc_command "$1"
赋予运行权限:
chmod +x /usr/local/etc/rc.d/tun2socks
如果 tun2socks
可执行文件和配置文件放在其他地方,请更改文件内的对应路径。
创建 /etc/rc.conf
并添加以下内容:
tun2socks_enable="YES"
新建 configd 文件
/usr/local/opnsense/service/conf/actions.d/actions_tun2socks.conf
文件,内容如下:
[start]
command:/usr/local/etc/rc.d/tun2socks start
parameters:
type:script
message:starting tun2socks
[stop]
command:/usr/local/etc/rc.d/tun2socks stop
parameters:
type:script
message:stopping tun2socks
[restart]
command:/usr/local/etc/rc.d/tun2socks restart
parameters:
type:script
message:restarting tun2socks
[status]
command:/usr/local/etc/rc.d/tun2socks status; exit 0
parameters:
type:script_output
message:request tun2socks status
运行service configd restart
,重启configd
服务应用更改。
新建插件
参考: Using plugins。
新建/usr/local/etc/inc/plugins.inc.d/tuntosocks.inc
文件 ,内容如下:
<?php
/**
* register service
* @return array
*/
function tuntosocks_services()
{
global $config;
$services = array();
$services[] = array(
'description' => gettext('tun2socks gVisor TCP/IP stack'),
'configd' => array(
'restart' => array('tun2socks restart'),
'start' => array('tun2socks start'),
'stop' => array('tun2socks stop'),
),
'name' => 'tun-socks',
'pidfile' => '/var/run/tun2socks.pid'
);
return $services;
}
function tuntosocks_syslog()
{
$logfacilities = array();
$logfacilities['tun2socks'] = array(
'facility' => array('tun2socks'),
);
return $logfacilities;
}
使用pluginctl -s
读取并加载插件。如果输出列表中有出现tun-socks
在Web-GUI的 Services内出现tun-socks
服务,点击运行能够成功运行,则说明插件注册成功。
开机启用服务
创建/usr/local/etc/rc.syshook.d/early/60-tun2socks
,注意最好前面的数字不要和文件夹内已有文件重复。填写以下内容:
#!/bin/sh # Start tun2socks service /usr/local/etc/rc.d/tun2socks start
赋予文件可执行权限:
chmod +x /usr/local/etc/rc.syshook.d/early/60-tun2socks
然后重启系统,测试 tun2socks
是否正常启动。
新建端口和配置网关
参考: opnsense使用透明代理并分流。
在 Interfaces ‣ Assignments 里,将刚刚创建的 TUN 设备新建为新端口,保存设置。
在 Interfaces ‣ [刚刚添加的网口],进行以下设置,保存应用:
设置 | 值 |
---|---|
Enable | Enable Interface |
Description | TUN2SOCKS |
IPv4 Configuration Type | Static IPv4 |
IPv4 address | 10.0.3.1/24 |
其中 IPv4 地址要和目前所用局域网地址不同。
在 System ‣ Gateways ‣ Single 里,添加网关:
设置 | 值 |
---|---|
Name | TUN2SOCKS_PROXY |
Interface | TUN2SOCKS |
Address Family | IPv4 |
IP address | 10.0.3.2 |
Disable Gateway Monitoring | True |
保存并应用。
使用别名(Aliases)
别名的配置在 Firewall ‣ Aliases 里,可以通过自定义别名来快速选定一个或多个对象。
本人常用的别名类型为 Host(s)、Port(s)、MAC Address、Network Group。其中 Host(s) 类型用来存储那些不想被代理的网站,Port(s) 类型用来存储想要代理的端口,MAC Address 类型用来存储想要代理的单个设备,Network Group 类型用来存储代理设备集合、非代理目标集合。
下面要使用的别名有:
名称 | 类型 | 描述 |
---|---|---|
NoProxyGroup | Network group | 包括非代理域名、局域网地址 |
ProxyDevices | Network group | 包括所有想要代理的设备 MAC 地址 |
ProxyPort | Port(s) | 80 端口和 443 端口 |
也可以上GeoIP规则,但需要注册MaxMind 账号。
配置防火墙规则
在 Firewall ‣ Rules ‣ LAN 中添加规则,且该规则在默认的 Default allow LAN to any rule
和 Default allow LAN IPv6 to any rule
之前:
设置 | 值 |
---|---|
TCP/IP Version | IPv4 |
Protocol | TCP/UDP |
Source | ProxyDevice |
Destination / Invert | True |
Destination | NoProxyGroup |
Destination port range | ProxyPort to ProxyPort |
Gateway | TUN2SOCKS_PROXY |
保存并应用。