特定域名流量跨服务器路由的可行性与实现咨询
当然可以实现这种针对单一域名的流量路由需求,不用把所有流量都塞进SSH隧道里,咱们针对性配置就能搞定!
先明确你的核心需求:vserver-A(Debian虚拟机)平时直接走公网,但访问abc.com时必须通过vserver-B转发,让abc.com只看到vserver-B的IP,同时vserver-A对外只和vserver-B建立连接。下面给你两种实用的实现方案:
方案一:全局自动转发(适合所有应用)
这个方案能让vserver-A上所有访问abc.com的流量自动走vserver-B,不用给每个应用加前缀,步骤如下:
建立SSH动态隧道:在vserver-A上执行命令,打通到vserver-B的SOCKS代理隧道:
ssh -D 1080 -Nf -o "ExitOnForwardFailure yes" 你的vserver-B用户名@vserver-B公网IP解释一下:
-D 1080是在本地开一个SOCKS5代理端口1080,-Nf让SSH后台运行不执行远程命令,ExitOnForwardFailure确保隧道建立失败时直接退出,避免无效进程。安装并配置redsocks:redsocks能把TCP流量转发到SOCKS代理,正好用来把
abc.com的流量导进刚才的SSH隧道:- 安装:
apt install redsocks - 修改配置文件
/etc/redsocks.conf,找到redsocks段,改成下面的内容:redsocks { local_ip = 127.0.0.1; local_port = 12345; # 选一个本地未使用的端口就行 type = socks5; ip = 127.0.0.1; port = 1080; # 对应刚才SSH隧道的本地SOCKS端口 } - 启动并设置开机自启:
systemctl start redsocks && systemctl enable redsocks
- 安装:
配置iptables规则:把
abc.com的流量标记出来,转发到redsocks:- 先解析
abc.com的IP(如果有多个IP,要把所有IP都加进去):dig +short abc.com,假设得到IP是x.x.x.x - 创建自定义iptables链:
iptables -t nat -N REDSOCKS - 排除本地流量,避免循环转发:
iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN - 把
abc.com的流量转发到redsocks端口:iptables -t nat -A REDSOCKS -d x.x.x.x/32 -j REDIRECT --to-ports 12345 - 让所有访问
abc.com的出站流量走这个自定义链:iptables -t nat -A OUTPUT -d x.x.x.x/32 -j REDSOCKS
要是
abc.com的IP经常变化,你可以写个脚本定期解析IP并更新iptables规则,避免失效。- 先解析
方案二:按需应用转发(适合指定程序)
如果只想让特定应用访问abc.com时走vserver-B,其他应用不受影响,用proxychains-ng更灵活:
- 安装proxychains-ng:
apt install proxychains-ng - 修改代理配置:编辑
/etc/proxychains.conf,把最后一行的socks4 127.0.0.1 9050改成:
同样要先建立好方案一里的SSH动态隧道(端口1080)。socks5 127.0.0.1 1080 - 创建自定义规则文件:比如在用户目录下建
~/.proxychains/abc_rules.conf,内容如下:[ProxyList] socks5 127.0.0.1 1080 [ProxyRules] + abc.com # 只有访问abc.com走代理 - * # 其他所有域名直接走公网 - 启动应用时指定规则:比如用curl访问
abc.com:
这样只有这个curl请求会走vserver-B,其他应用还是直接用公网。proxychains4 -f ~/.proxychains/abc_rules.conf curl abc.com
两种方案都能满足你的需求:vserver-A平时直接访问互联网,只有abc.com的流量通过vserver-B转发,abc.com只会看到vserver-B的IP,vserver-A对外只和vserver-B保持SSH隧道连接。
备注:内容来源于stack exchange,提问作者Jonathan




