前言
经常打内网或者做项目的朋友应该都会遇到需要搭建代理的情况,在windows或者macos下,我们有proxifier实现进程级的代理,非常好用,但在linux下就没有这么方便的工具了,很多时候我们都是使用proxychains实现linux下的代理。
但打内网打的多的朋友们应该知道,proxychains不是万能的,不像proxifier能够实现完全的系统级代理,很多命令或者软件的流量都不走proxychains。proxychains的原理是hook了一个网络包来实现的代理,golang写的程序都不走这个,所以golang程序走不了proxychains,比如我之前靶场里的那个长城杯,那里有一步会用到kubectl,这是go binary,golang的编译会直接把一些标准库打包进去,不走系统的,导致proxychains失效。除此之外,有一些比proxychains更底层的命令也会导致流量不走proxychains,golang是自己那套net,除非用其他东西编译依赖底层那几个lib so,否则就是有些命令的流量永远也走不了proxychains。
踩坑
在网上翻了很久,首先映入眼帘的是一位su前辈的文章对 Linux 全局代理的探索,简单来说,这个师傅是使用GOST v3 重写了 Linux 全局代理脚本,然后再用iptable进行流量配置实现的linux全局代理,但有个很难绷的事,就是这个代理只代理对外网的流量访问,对内网的访问是不走代理的。。。虽然理论上这个脚本有把代理转入内网的功能,但是我试了试反正就是有问题,而且开发者现在也不维护了,后来和其他师傅交流了一下,最好的办法还是使用clash的tun功能,这个模式是虚拟网卡,虚拟网络设备,直接在驱动层和l3工作,能实现linux下完全的流量代理。
利用clash实现linux下的全局代理
clash for windows-linux版本下载链接:https://gh-proxy.com/https://github.com/clash-hub/clash_for_windows_pkg/releases/download/Latest/Clash.for.Windows-0.20.39-x64-linux.tar.gz
下载完之后tar zxvf Clash.for.Windows-0.20.39-x64-linux.tar.gz进行解压
然后运行./cfw即可打开
点击Manage,可以看到现在status是Inactive,点一下Install
应该会让你输入密码啥的,如果正常运行就下一步,如果没有正常运行,出现了报错
/bin/bash: line 11:/usr/lib/systemd/system/clash-core-service.service: No such file or directory Failed to enable unit: Unit file clash-core-service.service does not exist. Failed to start clash-core-service.service: Unit clash-core-service.service not
就去/usr/lib/systemd/system/目录创建一个空白的clash-core-service.service文件,再install一次应该就可以了,这时Service Mode旁边的地球应该会变成绿色,这就表示成功安装了
这时我们去Profiles配置一下我们的socks代理
初始的时候应该都是空的,只有这个默认配置,在默认配置文件下面加上我们的socks代理
proxies:
- name: SocksTest
type: socks5
server: xxx //socks服务器ip
port: "6666" //socks的端口
按Ctrl-S保存一下,回到Proxies,应该就有我们新加的这个代理了,选上,然后回到General
点上Tun,然后再点击一下TUN Mode右边那个齿轮
配两个DNS,因为TUN会默认接管你主机的所有流量,有时候会导致你DNS解析失败,所以我们得额外配两个dns服务器,点一下那个绿色的加号,把下面俩ip加上,最后点一下save
119.29.29.29
223.5.5.5
这时本机的所有访问都是走的代理了
这里我们做两个简单的实验来证明我们的流量已经全局代理了,首先在本地起一个简单的web服务,返回fushuling
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'fushuling'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
我这里内网ip是172.18.0.1,可以看到能成功访问内网资源了
当然这个其实走proxychains也能访问到
这里选一个经典的流量不走proxychains的命令,ping命令
开了tun之后,ping命令也走了我们的代理
现在我们就可以愉快的在linux下使用全局代理了,避免了有些特殊命令或者软件不走proxychains所以还得额外配置代理和设置的麻烦
修改etc/environment实现Linux全局代理
吃瓜一线