每个用户路由似乎没有工作

所以,我试图实现每个用户的路由,以便我能够通过VPN路由所有btpd洪streamstream量。 不幸的是,btpd目前不允许你绑定到一个特定的IP地址。 🙁

我决定尝试遵循这个指南 。

基本上,你标记任何数据包,然后对数据包做SNAT或DNAT或MASQUERADE,然后使用ip规则强制一个特定的路由表。

最后,我的设置:

(To my router) eth1 Link encap:Ethernet HWaddr 00:0a:cd:18:8a:ae inet addr:172.29.5.10 Bcast:172.29.5.255 Mask:255.255.255.0 inet6 addr: fe80::20a:cdff:fe18:8aae/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:2073338425 errors:0 dropped:0 overruns:0 frame:0 TX packets:2031270514 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:3014149031 (2.8 GiB) TX bytes:1897259705 (1.7 GiB) Interrupt:17 Base address:0x6c00 (my VPN) tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:10.1.1.4 PtP:10.1.1.4 Mask:255.255.255.0 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:7842859 errors:0 dropped:0 overruns:0 frame:0 TX packets:8040846 errors:0 dropped:41433 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:1544016294 (1.4 GiB) TX bytes:1737654278 (1.6 GiB) 

iptables -t mangle -vnL (这是我标记数据包的地方):

 Chain PREROUTING (policy ACCEPT 42 packets, 3595 bytes) pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 42 packets, 3595 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 36 packets, 3461 bytes) pkts bytes target prot opt in out source destination 0 0 MARK icmp -- * * 0.0.0.0/0 0.0.0.0/0 owner UID match 1000 MARK set 0x2a 0 0 MARK udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:!53 owner UID match 1000 MARK set 0x2a 0 0 MARK tcp -- * * 0.0.0.0/0 0.0.0.0/0 owner UID match 1000 MARK set 0x2a Chain POSTROUTING (policy ACCEPT 36 packets, 3461 bytes) pkts bytes target prot opt in out source destination 

我的iptables -t nat (我在哪里切换源地址):

 Chain PREROUTING (policy ACCEPT 10 packets, 536 bytes) pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 10 packets, 536 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 6 packets, 360 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 6 packets, 360 bytes) pkts bytes target prot opt in out source destination 0 0 MASQUERADE all -- * tun0 0.0.0.0/0 0.0.0.0/0 

ip rule show输出ip rule show

 0: from all lookup local 32761: from all fwmark 0x2a lookup 42 32762: from 10.1.0.0/16 lookup 42 32766: from all lookup main 32767: from all lookup default 

最后, ip route show table 42输出:

 default via 10.1.1.1 dev tun0 

现在,当我首先在我的VPN接口上执行tcpdump时,一切似乎都正常。 但是,那么很显然,我的程序没有收到三方握手的SYN-ACK。

这是uid 1000运行curl ifconfig.me的用户的输出:

 21:34:08.585901 IP 10.1.1.4.55707 > www1465.sakura.ne.jp.http: S 342876994:3342876994(0) win 5840 <mss 1460,sackOK,timestamp 2892988166 0,nop,wscale 6> 21:34:08.852160 IP www1465.sakura.ne.jp.http > 10.1.1.4.55707: S 530223170:3530223170(0) ack 3342876995 win 65535 <mss 1368,nop,wscale 6,sackOK,timestamp 248042701 2892988166> 21:34:11.587175 IP 10.1.1.4.55707 > www1465.sakura.ne.jp.http: S 342876994:3342876994(0) win 5840 <mss 1460,sackOK,timestamp 2892991168 0,nop,wscale 6> 21:34:11.848906 IP www1465.sakura.ne.jp.http > 10.1.1.4.55707: S 530223170:3530223170(0) ack 3342876995 win 65535 <mss 1368,nop,wscale 6,sackOK,timestamp 248042701 2892991168> 21:34:14.890209 IP www1465.sakura.ne.jp.http > 10.1.1.4.55707: S 530223170:3530223170(0) ack 3342876995 win 65535 <mss 1368,nop,wscale 6,sackOK,timestamp 248042701 2892991168> 21:34:17.603173 IP 10.1.1.4.55707 > www1465.sakura.ne.jp.http: S 342876994:3342876994(0) win 5840 <mss 1460,sackOK,timestamp 2892997184 0,nop,wscale 6> 21:34:17.863614 IP www1465.sakura.ne.jp.http > 10.1.1.4.55707: S 530223170:3530223170(0) ack 3342876995 win 65535 <mss 1368,nop,wscale 6,sackOK,timestamp 248042701 2892997184> 21:34:20.901869 IP www1465.sakura.ne.jp.http > 10.1.1.4.55707: S 530223170:3530223170(0) ack 3342876995 win 65535 <mss 1368,nop,wscale 6,sackOK,timestamp 248042701 2892997184> 21:34:26.962022 IP www1465.sakura.ne.jp.http > 10.1.1.4.55707: S 530223170:3530223170(0) ack 3342876995 win 65535 <mss 1368,nop,wscale 6,sackOK,timestamp 248042701 2892997184> 21:34:39.099655 IP www1465.sakura.ne.jp.http > 10.1.1.4.55707: S 530223170:3530223170(0) ack 3342876995 win 65535 <mss 1368,nop,wscale 6,sackOK,timestamp 248042701 2892997184> 

正如你所看到的,伪装似乎正在工作,我得到一个回报的回应。 然而,curl行为像是没有得到回应。 这可以通过netstat -an | grep SYN快速validation 显示curl的netstat -an | grep SYN试图使用我的内部networking,而不是VPN。

 tcp 0 1 172.29.5.10:58000 219.94.163.75:80 SYN_SENT 

我已经尝试做SNAT和DNAT与MASQUERADE达到相同的确切结果。 在这一点上,我不知道为什么curl没有得到回应。 谢谢。

请确认rp_filter已被禁用。 参见LARTC HOWTO的10.1节。 。 也可以在类似的问题上看到这个答案


另外,如果你做一个ip route show table main | grep 'dev tun0' ip route show table main | grep 'dev tun0'你可能会看到如下的路由。 你需要创build一个像这样的table 41的路线。

 10.1.1.0/24 proto kernel scope link dev tun0 src 10.1.1.4 

解决方法是如前所述禁用rp_filter。 但是你不应该白白禁用rp_filter。 我试过这个,发现你只需要在“per-user”接口上closures它,在我的情况下是ppp0:

 echo 0 | sudo tee /proc/sys/net/ipv4/conf/ppp0/rp_filter 

当然你可以通过将它放到/etc/sysctl.conf来更正确一些。