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

VirtualBox虚拟机中通过Iptables将所有流量路由到127.0.0.1:8080的配置求助

VirtualBox虚拟机中通过Iptables将所有流量路由到127.0.0.1:8080的配置求助

嘿,我明白你遇到的问题了——你用ssh -fND 8080 username@host搭了个SOCKS5代理,但直接用DNAT规则没生效,这其实是因为SOCKS是应用层协议,而iptables的DNAT/REDIRECT只是网络层的转发,没法直接把普通TCP流量转换成SOCKS请求。我来给你一步步讲清楚怎么解决:

为什么你的原有规则失效?

你之前用的iptables -t nat -I OUTPUT -p tcp -s 10.0.2.15 -j DNAT --to-destination 127.0.0.1:8080,本质是把目标地址改成了本地的8080端口,但ssh的-D参数是监听SOCKS连接,它不会主动处理普通的TCP连接请求——只有应用明确发起SOCKS代理请求时,它才会工作。所以直接转发流量过去是没用的,得用一个中间工具来做协议转换。

正确的全局透明代理配置(需要redsocks)

我们需要用redsocks这个工具,把iptables转发过来的普通TCP流量转换成SOCKS5请求,再发给ssh代理。

1. 安装redsocks

以Debian/Ubuntu为例,直接用包管理器安装:

sudo apt update && sudo apt install redsocks -y

2. 配置redsocks

编辑redsocks的配置文件(路径一般是/etc/redsocks.conf),替换成下面的内容:

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;  # 这个是redsocks自己监听的端口,随便选个没被占用的就行
    ip = 127.0.0.1;
    port = 8080;  # 这里填你ssh代理的端口
    type = socks5;
}

3. 启动并启用redsocks

sudo systemctl start redsocks
sudo systemctl enable redsocks  # 开机自启可选

4. 配置iptables规则

我们先创建一个专门的链来处理代理流量,避免和原有规则冲突:

# 创建REDSOCKS链
sudo iptables -t nat -N REDSOCKS

# 排除不需要代理的流量(避免循环或无效代理)
sudo iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN  # 本地回环流量直接通过
sudo iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN  # 虚拟机所在的局域网(你的是10.0.2.0/24,这里用更大的范围也可以)
sudo iptables -t nat -A REDSOCKS -d [你的SSH目标主机IP]/32 -j RETURN  # 必须排除ssh连接的目标IP,不然代理会把自己的ssh流量也转走,导致断连

# 把所有TCP流量转发到redsocks的监听端口
sudo iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 12345

# 让OUTPUT链的所有TCP流量走REDSOCKS链
sudo iptables -t nat -A OUTPUT -p tcp -j REDSOCKS

5. 验证配置

你可以用curl测试一下:

curl -vvv https://example.com

查看输出里的连接信息,应该是通过redsocks转成SOCKS代理出去的。如果要保存iptables规则,避免重启后失效,可以用:

sudo iptables-save > /etc/iptables/rules.v4

如果你只想给特定应用代理(更简单的方式)

如果不需要全局所有流量,只是特定应用用代理,其实不用iptables,直接设置环境变量就行:

export ALL_PROXY=socks5://127.0.0.1:8080
export all_proxy=socks5://127.0.0.1:8080

这样之后,大部分支持代理的应用(比如curl、浏览器)都会自动用这个SOCKS代理。

备注:内容来源于stack exchange,提问作者moninah

火山引擎 最新活动