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