Ubuntu 20.04下如何将全系统流量通过代理转发(实现类VPN功能)
Ubuntu 20.04下如何将全系统流量通过代理转发(实现类VPN功能)
嗨,我来帮你搞定Ubuntu 20.04下全系统流量走代理的问题——不管你用的是HTTP还是SOCKS5代理,都有办法让所有应用(包括Telegram这类)都用上,不像浏览器单独设置或者终端环境变量那样只能覆盖部分场景。下面分几种方法逐步说明:
方法一:通过系统图形界面配置全局代理(简单易用)
这是最直观的方式,能覆盖大部分GUI应用:
- 打开系统设置 -> 网络 -> 网络代理
- 选择手动模式,然后根据你的代理类型填写信息:
- 要是用HTTP代理:在「HTTP」栏填入代理的IP和端口,勾选「对所有协议使用相同的代理」(如果你的HTTP代理支持HTTPS的话)
- 要是用SOCKS5代理:在「SOCKS」栏填入代理的IP和端口,同样可以勾选上面的选项
- 设置完成后点击应用到整个系统
- 大部分GUI应用(比如Telegram)会自动生效,个别老应用可能需要重启一下才能识别新设置
方法二:配置系统级环境变量(覆盖终端和后台应用)
如果图形界面的设置没覆盖到终端工具、后台服务这类场景,就试试修改系统环境变量:
- 用sudo权限编辑
/etc/environment文件:sudo nano /etc/environment - 根据你的代理类型添加对应的变量:
- HTTP/HTTPS代理:
http_proxy="http://你的代理IP:端口/" https_proxy="http://你的代理IP:端口/" ftp_proxy="http://你的代理IP:端口/" no_proxy="localhost,127.0.0.1,::1" - SOCKS5代理:
http_proxy="socks5://你的代理IP:端口/" https_proxy="socks5://你的代理IP:端口/" ftp_proxy="socks5://你的代理IP:端口/" no_proxy="localhost,127.0.0.1,::1"
- HTTP/HTTPS代理:
- 保存文件后,执行下面的命令让设置立即生效(重启系统会更彻底):
要是Telegram这类应用没生效,关掉重开一次就行source /etc/environment
方法三:用redsocks实现强制全系统SOCKS5代理(类VPN效果)
如果上面两种方法还是有不遵守系统代理设置的“顽固”应用,试试用redsocks配合iptables强制所有流量走SOCKS5代理,这几乎能达到VPN的效果:
- 先安装redsocks:
sudo apt install redsocks - 编辑redsocks的配置文件
/etc/redsocks.conf:
修改成下面的内容,替换成你的SOCKS5代理信息:sudo nano /etc/redsocks.confbase { log_debug = off; log_info = on; log = "file:/var/log/redsocks.log"; daemon = on; redirector = iptables; } redsocks { local_ip = 127.0.0.1; local_port = 12345; # 选一个没被占用的端口就行,比如12345 ip = 你的代理IP; port = 你的代理端口; type = socks5; # 如果你的SOCKS5需要用户名密码,取消下面两行注释并填写 # login = "你的用户名"; # password = "你的密码"; } - 启动redsocks服务并设置开机自启:
sudo systemctl start redsocks sudo systemctl enable redsocks - 配置iptables规则,强制所有TCP流量转发到redsocks:
要是需要UDP流量也走代理,可以参考上面的规则配置UDP,但注意有些SOCKS5服务器不支持UDP转发# 创建一个专门的REDSOCKS链 sudo iptables -t nat -N REDSOCKS # 跳过本地和私有网段的流量(这些不需要代理) sudo iptables -t nat -A REDSOCKS -d 0.0.0.0/8 -j RETURN sudo iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN sudo iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN sudo iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURN sudo iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN sudo iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN sudo iptables -t nat -A REDSOCKS -d 224.0.0.0/4 -j RETURN sudo iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN sudo iptables -t nat -A REDSOCKS -d 127.0.0.1 -j RETURN # 把所有TCP流量重定向到redsocks的本地端口 sudo iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 12345 # 让所有出站TCP流量都经过REDSOCKS链 sudo iptables -t nat -A OUTPUT -p tcp -j REDSOCKS - 保存iptables规则,防止重启后失效:
sudo apt install iptables-persistent sudo netfilter-persistent save
注意事项
- 不需要代理时,记得清空iptables规则:
sudo iptables -F -t nat,然后停止redsocks服务:sudo systemctl stop redsocks - 有些应用比如Telegram本身也支持手动设置代理,不过系统级设置生效的话就不需要单独配置了
备注:内容来源于stack exchange,提问作者Ardalan




