如何根据端口号通过不同的接口路由流量?

如何根据端口号通过不同的接口路由流量?
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 并在本地尝试,但由于某些原因它不起作用。myusb1usb1usb08080myusb0

一旦我让它在本地工作,我想我应该以相反的方式打开袜子,以便我可以让需要使用它的远程服务器使用它。

知道为什么它现在不工作以及我应该如何修复它吗?出于某些原因,我认为 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

发生以下事件:

  1. CURL 打开来自[您的主机]:[随机端口]运行 SSHD 的 SOCKS 服务器192.168.3.182:8080
  2. SSHD 接受连接
  3. CURL 要求 SSHD 打开一个新连接192.168.3.182:[随机端口]ip.appspot.com:80
  4. SSHD 尝试打开 TCP 连接并失败
  5. SSHD 返回失败消息:“通道 1:打开失败:管理禁止:打开失败”

SSHD 无法打开新连接,因为发往ip.appspot.com:80是在路由器盒中生成的 - 而不是通过它路由。因此,数据包不会收到标记,内核会跳过这两个myusb0myusb1表中不存在匹配的路由条目主要的表格导致网络不可达错误。如果你想管理本地生成的数据包,则在曼格尔表格将是输出代替预路由

关于端口测试问题:

$ curl portquiz.net:8080 
curl: (7) Couldn't connect to server

请检查路由器配置:

  1. “主”表中是否有默认网关?

    $ ip route show
    
  2. 数据包转发是否启用?

    $ cat /proc/sys/net/ipv4/ip_forward
    
  3. 数据包是否经过 NAT 处理?

    $ iptables -t nat -nvL
    # iptables -t nat -A POSTROUTING -o myusb0 -j MASQUERADE
    # iptables -t nat -A POSTROUTING -o myusb1 -j MASQUERADE
    

相关内容