You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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)会自动生效,个别老应用可能需要重启一下才能识别新设置

方法二:配置系统级环境变量(覆盖终端和后台应用)

如果图形界面的设置没覆盖到终端工具、后台服务这类场景,就试试修改系统环境变量:

  1. 用sudo权限编辑/etc/environment文件:
    sudo nano /etc/environment
    
  2. 根据你的代理类型添加对应的变量:
    • 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"
      
  3. 保存文件后,执行下面的命令让设置立即生效(重启系统会更彻底):
    source /etc/environment
    
    要是Telegram这类应用没生效,关掉重开一次就行

方法三:用redsocks实现强制全系统SOCKS5代理(类VPN效果)

如果上面两种方法还是有不遵守系统代理设置的“顽固”应用,试试用redsocks配合iptables强制所有流量走SOCKS5代理,这几乎能达到VPN的效果:

  1. 先安装redsocks:
    sudo apt install redsocks
    
  2. 编辑redsocks的配置文件/etc/redsocks.conf
    sudo nano /etc/redsocks.conf
    
    修改成下面的内容,替换成你的SOCKS5代理信息:
    base {
        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 = "你的密码";
    }
    
  3. 启动redsocks服务并设置开机自启:
    sudo systemctl start redsocks
    sudo systemctl enable redsocks
    
  4. 配置iptables规则,强制所有TCP流量转发到redsocks:
    # 创建一个专门的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
    
    要是需要UDP流量也走代理,可以参考上面的规则配置UDP,但注意有些SOCKS5服务器不支持UDP转发
  5. 保存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

火山引擎 最新活动