OPNsense Forum

International Forums => Chinese - 中文 => Topic started by: deddey on October 17, 2020, 07:07:39 pm

Title: 在opnsense中使用透明代理科学上网的一种方法
Post by: deddey on October 17, 2020, 07:07:39 pm
opnsense因为基于freeBSD + packet filtering 的,这和大多数linux下的环境不同,所以常见的科学上网如V2Ray、clash、shadowsocks等等的redirect(数据包重定向)在opnsense都没法使用。但在某些情况下确实又需要透明代理的功能,比如机顶盒这类不方便安装的,或者大量的机器不想一个一个维护的。
通过摸索,确实有这么一个方式能够在opnsense中实现透明代理科学上网的方法,但是这方法现在还不适合UDP连接,而且稍显复杂。
首先说一下基本方法的吧,抛砖引玉,希望有大神看到能给更简单、更方便的方法,或者能出一个opnsense的插件实现就更好了。
刚才说到,常见的科学上网工具并没有在opnsense中直接实现redirect功能的,但是在opnsense中其实已经有了能实现透明代理的工具,而且不是插件,是包含在opnsense基础功能中的,这就是 服务 > web代理,这个是由squid实现的,通过简单的设置就可以实现透明代理功能,实现网络中http(s)流量通过代理来访问。
squid为缓存而设计,并没有科学上网的功能。但是它却开了另一个窗户,能实现一种曲折但可行的方法,那就是squid支持父级代理,就是把squid代理的流量送到另一个代理来代理。说到这大家应该明白了,squid的父级代理如果能科学上网,那不就是在opnsense中实现了使用透明代理科学上网了。
虽然这个方法挺曲折的,但其实实践下来其实也挺好用的。各种工具中最适合做squid的父级代理的是clash,不但支持分流、web页面控制,还能自动更新节点列表和分流规则,不用老是手动传配置文件。

基本方法说完了,下面简单说一下如何实现的。注意,这里说的简单说一下,是真的"简单"说一下,小白就此打住吧。
首先是web代理的设置,请参考官方文档https://docs.opnsense.org/manual/proxy.html,完成启用并实现透明代理功能。不同的是在正向代理>转发常规设置中,要勾选 “仅记录SNI信息” ,这个可以实现在不需要在终端中安装证书。(如果你有缓存https流量的需求,请按文档操作)完成后在终端中测试一下,方法是不启用任何代理访问一个网站,这网站出现在 Access Log中,说明透明代理设置成功。
在  代理常规设置 > 父代理设置  中填写相应信息,对clash来说一般IP和端口是 127.0.0.1:7890,这个在clash设置完成后再启用。
然后是在opnsense中的捣鼓一个clash出来,因为没有现成插件,这个只有手动了。
首先准备要上传的文件。第一个是clash程序本身,记得是freebsd版的,个人建议premium版,(https://github.com/Dreamacro/clash/releases/tag/premium) 因为Rule Providers功能,毕竟这里配置传一次挺麻烦,尽量一份配置能一直用不用随时改。第二个是你的配置文件config.yaml,可以把神机规则拿来修改待用,(https://github.com/DivineEngine/Profiles/blob/master/Clash/Outbound.yaml) 为启用web控制界面要修改这两排
Code: [Select]
external-controller: 0.0.0.0:9090
external-ui: ./ui
如果在配置中引用了外部的节点列表和分流规则,请先在本地按这个配置先运行一次clash,把节点列表和分流规则先下载下来准备好,否则在opnsense中直接运行clash,会因为某些墙外的连接无法下载而启动失败。第三个是web控制界面clash dashboard (https://github.com/Dreamacro/clash-dashboard/archive/gh-pages.zip),下载、解压、修改文件夹名为“ui”。以上准备完后,有clash,config.yaml两个文件和 Proxy、RuleSet、ui三个文件夹。
然后是手动安装了,通过ssh登录,把刚才准备的文件都上传,然后复制clash执行程序到 /usr/local/bin/clash,修改程序所有者为 root:wheel ,添加执行权限,新建 /usr/local/etc/clash 文件夹,把config.yaml和 Proxy、RuleSet、ui三个文件夹 复制/usr/local/etc/clash下面,修改 /usr/local/etc/clash 和下面所有文件所有者为 root:wheel 。
在shell输入 “/usr/local/etc/clash -d  /usr/local/bin/clash"测试一下,如果能跑起来说明clash可以正常运行了
可以正常运行之后,需要把clash设置为系统服务,让opnsense开机启动clash。但这个有个坑,因为clash作为系统服务启动后,并没有完成启动后就保持后台运行的功能,这样每次系统重启后会启动到clash之后就不会往后走,因该clash一直会保持在前台,导致排在clash后面的待启动服务就没法启动了。所以这里需要一个变通的办法,通过monit来管理启动clash。下面是具体的干货:

Code: [Select]
vi /usr/local/etc/rc.d/clash #建立服务配置文件
chmod +x /usr/local/etc/rc.d/clash #给刚才建立服务配置文件添加执行权限

服务配置文件内容如下:
Code: [Select]
#!/bin/sh
# $FreeBSD$

# PROVIDE: clash
# REQUIRE: LOGIN cleanvar
# KEYWORD: shutdown

# Add the following lines to /etc/rc.conf to enable clash:
# clash_enable (bool):  Set to "NO" by default.
#      Set to "YES" to enable clash.
# clash_config (path): Clash config dir.
#      Defaults to "/usr/local/etc/clash"


. /etc/rc.subr

name="clash"
rcvar=clash_enable


load_rc_config $name

: ${clash_enable:="NO"}
: ${clash_config="/usr/local/etc/clash"}

command="/usr/local/bin/clash"
#pidfile="/var/run/clash.pid"
required_files="${clash_config}"

command_args="-d $clash_config"

run_rc_command "$1"

这里没法生成pid文件,所以 pidfile="/var/run/clash.pid" 这行注释掉了,这个问题还请能有大神解答

然后建立/usr/local/opnsense/service/conf/actions.d/actions_clash.conf 文件,这个方便monit管理启动clash。
Code: [Select]
vi /usr/local/opnsense/service/conf/actions.d/actions_clash.conf
service configd restart #使刚才的文件生效
actions_clash.conf文件内容如下
Code: [Select]
[start]
command:/usr/local/etc/rc.d/clash onestart
type:script
message:starting clash

[stop]
command:/usr/local/etc/rc.d/clash stop
type:script
message:stoping clash

[status]
command:/usr/local/etc/rc.d/clash statusexit 0
type:script_output
message:get clash status

[restart]
command:/usr/local/etc/rc.d/clash onerestart
type:script
message:restarting clash

最后,终于到最后了,启用monit服务,参考官方文档https://docs.opnsense.org/manual/monit.html?highlight=monit
在monit的 Service Tests Settings 中添加两个:

第一个

| Setting   | Value                                    |
| --------- | ---------------------------------------- |
| Name      | Clash                                    |
| Condition | failed host 127.0.0.1 port 7890 type tcp |
| Action    | Restart                                  |

第二个,避免重启死循环

| Setting   | Value                                    |
| --------- | ---------------------------------------- |
| Name      | RestartLimit4                            |
| Condition | 5 restarts within 5 cycles               |
| Action    | Unmonitor                                |

在monit的 Service Settings 中添加:

| Setting   | Value                                    |
| --------- | ---------------------------------------- |
| Name      | Clash                                    |
| Match     | clash                                    |
| Start     | /usr/local/sbin/configctl clash start    |
| Stop      | /usr/local/sbin/configctl clash stop     |
| Tests     | Clash,RestartLimit4                      |

完成后隔一会,monit会启动clash,在终端中输入 /usr/local/sbin/configctl clash status,查看clash运行状态。

至此,使用透明代理科学上网完成,别忘了在web代理中启用刚才说的父代理功能。

注:这里也可以直接将 ”网关地址“:7890  作为代理服务使用,但前提是需要的规则中允许 lan网络 到 ”网关地址“:7890 的连接。
Title: Re: 在opnsense中使用透明代理科学上网的一种方法
Post by: dulluke on February 21, 2021, 09:05:52 am
看到lz的主题才发觉freebsd和linux对包处理方式的不同。

也就是说clash的freebsd版本就是个阉割版?
Title: Re: 在opnsense中使用透明代理科学上网的一种方法
Post by: deddey on March 17, 2021, 04:48:27 am
并不是说freebsd 版的clash 是阉割版,而是clash的redirect 功能基于linux下常用的Netfilter包过滤器,但是opnsense 的包过滤器不是Netfilter 而是 packet filtering(简称PF) ,自然没法使用redirect 功能
Title: Re: 在opnsense中使用透明代理科学上网的一种方法
Post by: Polane on March 22, 2021, 06:16:31 am
不明觉厉,看群主写的,代码一溜一溜的,看的脑瓜大。 :'(
如是我的话,想要科学上网 (https://wallvpn.com)那就直接找一些好用的软件来用,不懂的就直接去问软件的客服了。 :o
Title: Re: 在opnsense中使用透明代理科学上网的一种方法
Post by: hugovk on March 26, 2021, 01:27:48 am
请问你现在opnsense能用clash实现科学上网了吗?能实现指定节点分流吗?
Title: Re: 在opnsense中使用透明代理科学上网的一种方法
Post by: deddey on March 28, 2021, 12:51:32 pm
不明觉厉,看群主写的,代码一溜一溜的,看的脑瓜大。 :'(
如是我的话,想要科学上网那就直接找一些好用的软件来用,不懂的就直接去问软件的客服了。 :o
这也能插小广告我也是服了

这帖子是抛砖引玉的。
比如没有电视、盒子、游戏机等没法安装科学上网软件的设备也可以不需要透明代理,squid的设置步骤可以省掉。
又比如monit的监控重启其实也大可省掉,clash跑起来基本也不会死掉。
教程是有点唠叨,你要是头大可以不看啊。
Title: Re: 在opnsense中使用透明代理科学上网的一种方法
Post by: yyds on April 06, 2023, 09:14:01 am
有大神开发了在OPNsense上的clash插件,详情参阅这里 (https://www.reddit.com/r/OPNsenseFirewall/comments/zy5u4d/new_community_repo_plugin_clash/)。
OPNsense配置clash透明代理的完整教程来了,教程在这里 (https://pfchina.org/?p=10526)。