如何强制所有 Linux 应用使用 SOCKS 代理

如何强制所有 Linux 应用使用 SOCKS 代理

使用 Linux,我需要一种方法来通过 SOCKS4 192.168.1.2:1080(或任何 SOCKS 代理)路由接口 enp2s0 的所有网络流量 - 类似于 Windows 中的 Proxifier。在 Chrome 或 Firefox 中手动设置时,代理可以正常工作。

操作系统:Linux Mint 19.1

我尝试过的事情:

  • 我在网络设置中手动设置了代理,但就像我没有设置一样;Chrome 仍然直接连接。以下是屏幕截图:

  • Proxychains 运行良好,但我必须从终端手动单独启动每个应用程序。

我(还)不知道如何使用 redsocks 或 iptables。

我希望有一个像 Linux 的 Proxifier 这样的 GUI,但是基于终端 (CLI) 的解决方案也可以。

答案1

对于没有耐心的人,只需执行以下操作;假设代理是example.com:7777socks5(稍后用您自己的代理更改)

  • 首先安装 redsockssudo apt-get install redsocks

,在任意位置创建一个空文件并将其命名为 redsocks.conf(或其他名称),我假设它在这里/etc/redsocks.conf(用您自己的名称更改它)。

  • 编辑您创建的文件(redsocks.conf),如下所示
base {
 log_debug = on;
 log_info = on;
 log = "stderr";
 daemon = off;
 redirector = iptables;
}

redsocks {
    local_ip = 127.0.0.1;
    local_port = 12345;

    ip = example.com;
    port = 7777;
    type = socks5;
      // known types: socks4, socks5, http-connect, http-relay

    // login = username;
    // password = password;
        }

example.com 7777使用您的代理进行更改,(请注意,您可以使用local_port除此以外的任何其他12345代理,这是我们将设置 iptable 规则来将流量重定向到的本地端口,因此如果您使用其他代理,请确保在下面的后续步骤中使用它)

-- 现在使用配置文件目标运行 redsocks,如下所示

sudo redsocks -c /etc/redsocks.conf

更改 redsocks.conf 的目标(如果出现“bind: Address already in use”尝试killall redsocks),您还可以检查 redsocks 是否已绑定到本地端口 12345netstat -tulpn

-- 现在 redsocks 已运行并准备就绪,让我们将 iptables 规则更改为使用 redsocks。这应该根据您的需要进行定制,但如果您希望通过代理重定向所有 HTTP 和 HTTPS 数据包。定义以下规则。

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 -p tcp -j REDIRECT --to-ports 12345
    
sudo iptables -t nat -A OUTPUT -p tcp --dport 443 -j REDSOCKS
sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDSOCKS
    
sudo iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDSOCKS
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDSOCKS

现在你的 http 和 https 流量应该被重定向到example.com:7777

如果你想要重置 iptables,请使用:

iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X

答案2

您需要使用 转发所有传出的本地流量iptables。不知道有任何 GUI 程序可以做到这一点。我的使用iptables仅限于编写非常简单的脚本来调用它来构建路由器等,或者使用 进行典型的基于主机的防火墙设置ufw。有一个 GUI ufwgufw,想象一下)但我从未使用过它。

这个(由于偏离主题而关闭)问题/答案应该可以帮助您入门。

https://stackoverflow.com/questions/23180696/linux-iptables-redirect-outgoing-traffic-to-local-port

答案3

我使用了你的配置文件,但遇到了一个问题。通过参考参考网站并使用主配置文件,我能够完成这项工作。

由于我系统上用的是v2ray,所以没有使用服务器的IP和端口,而是用了v2ray的IP和输出端口。

这是我的示例配置代码。如果您想使用我的代码,请删除注释。

base {
log_debug = off;
log_info = on;
log = stderr;
daemon = off;
redirector = iptables;
}

redsocks {
local_ip = 127.0.0.1;
local_port = 1082; // I changed port number "12345" to this.
ip = 127.0.0.1; //goes from v2ray
port = 1081; //goes from v2ray
type = socks5;
}

redudp {
local_ip = 127.0.0.1;
local_port = 1083;
ip = 127.0.0.1; //goes from v2ray
port = 1081; //goes from v2ray
dest_ip = 8.8.8.8;
dest_port = 53;
udp_timeout = 30;
udp_timeout_stream = 180;
}

答案4

使用mitmproxy拦截流量。

所有更改均已完成sysctliptables在重启时重置。如果您希望在重启后仍保持此状态,则需要调整 /etc/sysctl.conf 或新创建的 /etc/sysctl.d/mitmproxy.conf(参见此处)。

解决方法是重定向来自机器本身的流量(Linux)

mitmproxy 文档

启用 IP 转发。

sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv6.conf.all.forwarding=1

禁用 ICMP 重定向。

如果您的测试设备位于同一物理网络上,则您的机器不应通过跳过代理来通知设备有更短的可用路由。

sysctl -w net.ipv4.conf.all.send_redirects=0

创建用户来运行mitmproxy

sudo useradd --create-home mitmproxyuser
sudo -u mitmproxyuser -H bash -c 'cd ~ && pip install --user mitmproxy'

配置 iptables 规则。

然后,配置 iptables 以将所有流量从我们的本地计算机重定向到 mitmproxy。如果遇到问题,iptables -t nat -F一种粗暴的方法是清除 iptablesnat表中的所有规则(其中包括您配置的任何其他规则)。

sudo iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner mitmproxyuser --dport 80 -j REDIRECT --to-port 8080
sudo iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner mitmproxyuser --dport 443 -j REDIRECT --to-port 8080
sudo ip6tables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner mitmproxyuser --dport 80 -j REDIRECT --to-port 8080
sudo ip6tables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner mitmproxyuser --dport 443 -j REDIRECT --to-port 8080

这会将除本机之外的所有用户的数据包重定向mitmproxyuser到 mitmproxy。为了避免循环,请以用户身份运行 mitmproxy mitmproxyuser

运行 mitmproxy

sudo -u mitmproxyuser -H bash -c '$HOME/.local/bin/mitmproxy --mode transparent --showhost --set block_global=false'

相关内容