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

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的stream量路由到myusb0表

 ip rule add fwmark 1 table myusb0 

IP路由LS

 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规则ls

 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 route ls table myusb1

 default via 192.168.0.1 dev usb1 

//在8080端口打开袜子

 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. 

我有两个不同的互联网服务提供商的互联网连接,我想打开每个代理/袜子5。 我认为将每个接口与一个端口号相关联以便我们可以pipe理这些连接是有意义的。

我为每个设备( usb1usb0 )创build了两个路由表( myusb0myusb1 ),然后根据端口号(例如,在端口8080标记为1)标记stream量,并将该标记上的stream量路由到特定表( myusb0 )。 然后我试图打开一个关于该IP的socks5,并在本地尝试,但由于某些原因,它不起作用。

一旦我在本地工作,我想我应该以相反的方式打开袜子,这样我就可以将它提供给需要使用它的远程服务器。

任何想法,为什么它目前不工作,我应该如何解决它? 由于某些原因,我认为袜子连接试图从主表默认网关,而不是设置,而是遵循端口8080标记规则,并尝试myusb0表。 我正在使用Ubuntu(最新版本)。

应该提到的是,两个ISP都提供dynamic的IP

编辑

正如我怀疑,似乎8080港口的stream量没有被路由(从来不是袜子问题),但我不知道为什么

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

其实,当你这样做的时候:

 $ ssh -f -N -D 0.0.0.0:8080 [email protected] $ curl --socks5 192.168.3.182:8080 ip.appspot.com 

发生以下事件:

  1. CURL从[YOUR-HOST]:[RANDOM-PORT]打开一个TCP连接到SSHD服务器上的SSHD运行192.168.3.182:8080
  2. SSHD接受连接
  3. CURL要求SSHD打开从192.168.3.182:[RANDOM-PORT]ip.appspot.com:80的新连接
  4. SSHD尝试打开TCP连接并失败
  5. SSHD返回失败消息: “通道1:打开失败:pipe理禁止:打开失败”

SSHD无法打开一个新的连接,因为在路由器框中正在生成ip.appspot.com:80的 IP数据包,而不是通过它路由。 因此,数据包不会收到标记,内核会跳过myusb0myusb1表,并且表中缺less匹配的路由条目会导致networking不可达错误。 如果你想pipe理本地生成的数据包, mangle表下的右链将是OUTPUT而不是PREROUTING

关于端口testing问题:

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

请检查路由器configuration:

  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