![如何强制所有 Linux 应用使用 SOCKS 代理](https://linux22.com/image/1581627/%E5%A6%82%E4%BD%95%E5%BC%BA%E5%88%B6%E6%89%80%E6%9C%89%20Linux%20%E5%BA%94%E7%94%A8%E4%BD%BF%E7%94%A8%20SOCKS%20%E4%BB%A3%E7%90%86.png)
使用 Linux,我需要一种方法来通过 SOCKS4 192.168.1.2:1080(或任何 SOCKS 代理)路由接口 enp2s0 的所有网络流量 - 类似于 Windows 中的 Proxifier。在 Chrome 或 Firefox 中手动设置时,代理可以正常工作。
操作系统:Linux Mint 19.1
我尝试过的事情:
我(还)不知道如何使用 redsocks 或 iptables。
我希望有一个像 Linux 的 Proxifier 这样的 GUI,但是基于终端 (CLI) 的解决方案也可以。
答案1
对于没有耐心的人,只需执行以下操作;假设代理是example.com:7777
socks5(稍后用您自己的代理更改)
- 首先安装 redsocks
sudo 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 ufw
(gufw
,想象一下)但我从未使用过它。
这个(由于偏离主题而关闭)问题/答案应该可以帮助您入门。
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拦截流量。
所有更改均已完成sysctl
并iptables
在重启时重置。如果您希望在重启后仍保持此状态,则需要调整 /etc/sysctl.conf 或新创建的 /etc/sysctl.d/mitmproxy.conf(参见此处)。
解决方法是重定向来自机器本身的流量(Linux)
启用 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'