iptables -A PREROUTING -i usb0 -t mangle -p tcp --dport 8080 -j MARK --set-mark 1
iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
// 将标记为 1 的流量路由到 myusb0 表
ip rule add fwmark 1 table myusb0
ip 路由
192.168.0.0/24 dev usb1 proto kernel scope link src 192.168.0.136 metric 1
192.168.3.0/24 dev usb0 proto kernel scope link src 192.168.3.182 metric 1
ip 规则
0: from all lookup local
32762: from all fwmark 0x1 lookup myusb0
32763: from 192.168.3.0/24 lookup myusb0
32764: from 192.168.0.1/24 lookup myusb1
32766: from all lookup main
32767: from all lookup default
ip 路由 ls 表 myusb0
default via 192.168.3.2 dev usb0
ip 路由 ls 表 myusb1
default via 192.168.0.1 dev usb1
// 在端口 8080 上打开 socks
ssh -f -N -D 0.0.0.0:8080 [email protected]
// 检查是否有效
curl --socks5 192.168.3.182:8080 ip.appspot.com
channel 1: open failed: administratively prohibited: open failed
curl: (7) Failed to receive SOCKS5 connect request ack.
我有两个来自不同 ISP 的 Internet 连接,我想在每个连接上打开代理/socks5。我认为将每个接口与端口号关联起来很有意义,这样我们就可以管理连接。
我为每个设备(和)创建了两个路由表(myusb0
和),然后根据端口号标记流量(例如,在端口上我将其标记为 1),并将该标记上的流量路由到特定表()。然后我尝试在该 IP 上打开 socks5 并在本地尝试,但由于某些原因它不起作用。myusb1
usb1
usb0
8080
myusb0
一旦我让它在本地工作,我想我应该以相反的方式打开袜子,以便我可以让需要使用它的远程服务器使用它。
知道为什么它现在不工作以及我应该如何修复它吗?出于某些原因,我认为 socks 连接正在尝试主表中未设置的默认网关,而是遵循端口8080
标记规则并尝试 myusb0 表。我正在使用 Ubuntu(最新版本)。
值得一提的是,这两家 ISP 都提供动态 IP
编辑
正如我所怀疑的,到端口 8080 的流量似乎没有被路由(不要介意袜子问题),但我不知道为什么
curl portquiz.net:8080
curl: (7) Couldn't connect to server
答案1
事实上,当你这样做时:
$ ssh -f -N -D 0.0.0.0:8080 [email protected]
$ curl --socks5 192.168.3.182:8080 ip.appspot.com
发生以下事件:
- CURL 打开来自[您的主机]:[随机端口]运行 SSHD 的 SOCKS 服务器192.168.3.182:8080
- SSHD 接受连接
- CURL 要求 SSHD 打开一个新连接192.168.3.182:[随机端口]到ip.appspot.com:80
- SSHD 尝试打开 TCP 连接并失败
- SSHD 返回失败消息:“通道 1:打开失败:管理禁止:打开失败”
SSHD 无法打开新连接,因为发往ip.appspot.com:80是在路由器盒中生成的 - 而不是通过它路由。因此,数据包不会收到标记,内核会跳过这两个myusb0和myusb1表中不存在匹配的路由条目主要的表格导致网络不可达错误。如果你想管理本地生成的数据包,则在曼格尔表格将是输出代替预路由。
关于端口测试问题:
$ curl portquiz.net:8080
curl: (7) Couldn't connect to server
请检查路由器配置:
“主”表中是否有默认网关?
$ ip route show
数据包转发是否启用?
$ cat /proc/sys/net/ipv4/ip_forward
数据包是否经过 NAT 处理?
$ iptables -t nat -nvL # iptables -t nat -A POSTROUTING -o myusb0 -j MASQUERADE # iptables -t nat -A POSTROUTING -o myusb1 -j MASQUERADE