将所有本地流量重定向到 shadow-socks 代理

将所有本地流量重定向到 shadow-socks 代理

Iptables 重新路由至 shadowsocks

我有一台 ubuntu 20.04 vps,上面有 shadow-socks 服务器。

我的电脑上也有 ubuntu 20.04,上面运行着 shadow-socks 客户端。目前正在使用影子袜子-libev版本。


目标是将所有请求重定向到代理客户端正在运行的 127.0.0.1:1080。

我遵循了问题和博客,答案指向那里。还看到了问。

然而,没有什么能帮我实现这一点。


我采取的步骤

我、我创建了管理员用户仅用于运行 shadow socks 客户端。

II. 我制作了 systemd 单元以从单独用户启动客户端,文件内容如下:

[Unit]
Description=SahdowSocks
After=network.target
After=network-online.target

[Service]
ExecStart=ss-local -c /etc/shadowsocks-client/config.json
Restart=on-failure
User=socks_user
Group=socks_user

[Install]
WantedBy=multi-user.target 

此时,如果我在浏览器(firefox)中将 127.0.0.1:1080 设置为 socks5 代理 - 它可以正常工作。

III.然后我根据上面的链接制定了 iptables 规则。

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

之后,如果通过设置直接连接到代理,我仍然可以使用该浏览器,但切换到无代理/系统代理后,请求超时。所有其他应用程序也都无法连接。

̶*̶只是提及一下,̶如果我̶确实̶ping̶到̶1̶.̶1̶.̶1̶.̶1̶,它̶返回̶很好̶(在评论中得到答案。)

*如果我执行 wget http://someurl,则不会有任何结果。

因此我认为我遇到了重新路由循环(?),但不明白为什么。

答案1

问题是,如果 shadowsocks 正在运行,iptables 应该只将流量重定向到 shadowsocks。iptables 无法检查 shadowsocks 是否正在运行,因为 iptables 只处理流量包。相反,需要一个脚本来处理 shadowsocks 服务和 iptables 规则。——顺便说一句,这就是管理 Linux 的精神。

处理 shadowsocks 和 iptables 的脚本示例:

#!/bin/bash

start_service() {
    service shadowsocks_libev start
}

stop_service() {
    service shadowsocks_libev stop
}

start_iptables() {
    iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner socks_user --dport 80 -j REDIRECT --to-port 1080
    iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner socks_user --dport 443 -j REDIRECT --to-port 1080
}

stop_iptables() {
    # Remove iptables rules
}

show_help() {
    echo "usage: $0 start|stop|restart"
}

start() {
    echo "start ..."
    start_service
    start_iptables
    echo "start end"
}

stop() {
    echo "stop ..."
    stop_iptables
    stop_service
    echo "stop end"
}

restart() {
    stop
    sleep 1
    start
}

main() {
    if [ $# -ne 1 ]; then
        show_help
        return 1
    fi

    for funcname in "$@"; do
        if [ "$(type -t $funcname)" != 'function' ]; then
            show_help
            return 1
        fi
    done

    for funcname in "$@"; do
        $funcname
    done
    return 0
}
main "$@"

- 此示例基于来自 shadowsocks 的脚本

Iptables 可以通过-A附加、-I插入和-D删除来进行管理。

答案2

您将需要使用 TCP 代理转发服务并相应地设置您的 IP 表。

我计划使用 REDSOCKS 作为转发服务。 https://github.com/darkk/redsocks

以下是我管理此问题的方法。我设置了一个运行 ShadowSocks 的 EC2 实例。在我的 UDM PRO 中,我运行 ShadowSocks 作为客户端,并配置了一个在 129.168.1.1:1080 上运行的本地 Socks5 服务器

然后我在 UDM PRO 中运行 REDSOCKS 并将其指向我的本地 socks 5 服务器。

接下来在 UDM IPTABLES 中,我将按照这里提到的设置规则。https://github.com/darkk/redsocks

由于我希望将网络上一台计算机的所有流量引导到代理,因此我在 UDM 中启用了此规则。

iptables -t nat -A PREROUTING -s 192.168.1.118 -j REDSOCKS

如果您想要路由特定的应用程序,那么您可以获取端口号并将您的端口设置为选择器。

相关内容