xjasonlyu / tun2socks

tun2socks - powered by gVisor TCP/IP stack
https://github.com/xjasonlyu/tun2socks/wiki
GNU General Public License v3.0
2.85k stars 404 forks source link

Add tun post script #233

Closed Jackarain closed 1 year ago

Jackarain commented 1 year ago

用于在 tun 设备创建后,执行一个自定义的脚本,比如

tun2socks -device tun3 -proxy socks5://127.0.0.1:1080 -postup "/bin/sh /root/proxy/route.sh"

route.sh 内容如:

# 配置 tun3 的 IP
ip addr add 172.16.8.1/24 dev tun3
ip link set dev tun3 up

# 添加代理服务地址直接通过 pppoe-WAN 路由
route add -host xxx.xxx.xxx.xxx dev pppoe-WAN

# 一些需要通过 tun3 代理的 ip 段...
route add -net 103.235.0.0/16 gw 172.16.8.1
route add -net 117.168.0.0/16 gw 172.16.8.1
route add -net 117.18.0.0/16 gw 172.16.8.1
route add -net 149.154.0.0/16 gw 172.16.8.1
route add -net 185.199.0.0/16 gw 172.16.8.1

有了 postup 这个参数,这样用便于做一些 tun 创建之后相关的自己的脚本设定。

xjasonlyu commented 1 year ago

Hi!这个想法我之前有过,不过后来觉得直接集成在里面不够优雅,因为完全可以通过在外部调用解决。

Jackarain commented 1 year ago

是的,外部调用虽然也可以做到。但是拆分成外部调用,会和通过 tun2socks 来调用,这2者用法有很大区别,由其是把 tun2socks 做成系统服务的时候,如果没有这个参数,事情就会变得相对复杂很多。 另外,这可以给人多一个选择,具体用法还取决于用户自己的需求,同样依然可以继续通过外部调用来完成。

xjasonlyu commented 1 year ago

系统服务,例如systemd,可以用ExecStartPost处理,反而更加符合设计原理。

Jackarain commented 1 year ago

比如像 sysvinit 并没有像 systemd 的 ExecStartPost 这种功能,还比如 windows 的服务。 当遇到这种情况的时候,只能使用一个专门的壳程序来启动 tun2socks 及 script 并管理进程,像这种结构并不优雅。

xjasonlyu commented 1 year ago

嗯确实有一些道理。不过既然这样的话,应该也提供一个类似于ExecStartPre的参数。另外需要注意下代码中的一些规范问题,例如日志应该用专门的log模块打印,而不是fmt.Printlnprepost 两个功能最好通过不同的func来分开处理等。

Jackarain commented 1 year ago

谢谢你接受了我的提议,并给出代码上的建议。 后面我会按你的建议重新做修改,命名我将参考 WireGuard 中类似的功能命名为: PreUPPostUP,如果你没有意见的话。

xjasonlyu commented 1 year ago

可以,我觉得这个命名不错!

Jackarain commented 1 year ago

Ok,已经完成,有空帮忙 Review

谢谢

xjasonlyu commented 1 year ago

@Jackarain 看看还有一些changes,改完应该就可以merge了

xjasonlyu commented 1 year ago

Merged!