路由能 iptables 某个机器所有数据到另一个机器的某端口么?

2014-08-11 10:57:09 +08:00
 1314258
基本:
路由设备 openwrt的路由一个 ip为192.168.1.1
透明设备 一个运行了ss-redir类似的设备,透明代理端口为9040 ip为192.168.1.2
无知用户 一个需要全局翻寡妇王而无感觉的用户。ip为192.168.1.3

我的做法
路由设备 iptables -t nat -A PREROUTING -s 192.168.1.3 -p tcp --syn -j DNAT --to-destination 192.168.1.2:9040

但无知用户貌似还是上不了网。望指正。

@extreme @onemoo @letitbesqzr
怕帖子0回复,特地at些人回复一下,其他ver认识的,指教一下。
5780 次点击
所在节点    Linux
11 条回复
ryd994
2014-08-11 14:30:25 +08:00
我iptables学得不多,先抛个砖……
你只转发syn大概不行吧,把 --syn 去了。
如果只是要代理劫持的话,可以古狗 iptables transparent proxy
比如: http://www.tldp.org/HOWTO/TransparentProxy-6.html
s7lx
2014-08-11 15:03:08 +08:00
可以。

我的方案效果和你想通,但思路不太一样,如下:
局域网内有家用路由器192.168.2.1,肩负网关、DHCP等众多任务
运行了一个192.168.2.5的Debian,内有ss-redir一个
所有用户DHCP获取192.168.2.0/24 其他的IP地址,要求完全透明的翻墙。

首先在DHCP上配置DNS和网关地址为192.168.2.5,这样所有人的数据默认都会先发到这台设备上,DNS也会从这里解析(DNS如何避免污染另谈)
接着打开192.168.2.5上的IPv4数据转发
sudo echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
sudo sysctl -p
这样所有的数据都从192.168.2.5这里通过了,这是科学上网的基础:让所有数据通过那台设备走。
确保192.168.2.5的下一跳是192.168.2.1 直接在/etc/network/interfaces里直接指定
iface eth0 inet static
address 192.168.2.5
netmask 255.255.255.0
gateway 192.168.2.1

确保结果如下
===============
$ traceroute www.sina.com.cn
traceroute: Warning: www.sina.com.cn has multiple addresses; using 58.63.236.37
traceroute to ara.sina.com.cn (58.63.236.37), 64 hops max, 52 byte packets
1 192.168.2.5 (192.168.2.5) 1.645 ms 1.134 ms 1.077 ms
2 192.168.2.1 (192.168.2.1) 1.541 ms 1.496 ms 1.349 ms
以下省略
===============

然后启动ss-redir到12345端口
接着
sudo iptables -t nat -N SHADOWSOCKS
sudo iptables -t nat -A SHADOWSOCKS -p tcp -d 8.8.8.0/24 -j REDIRECT --to-ports 12345
sudo iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS
sudo iptables -t nat -A OUTPUT -p tcp -j SHADOWSOCKS

这样所有访问8.8.8.0/24的数据都走Debian的12345端口的shadowsocks了,其他数据继续走到192.168.2.1,然后到公网。
tmqhliu
2014-08-11 15:58:27 +08:00
全局翻的话直接添加默认路由即可,用不着那么麻烦
1314258
2014-08-11 16:24:13 +08:00
@tmqhliu 那是怎么搞呢?伸手党请教了。
1314258
2014-08-11 18:00:21 +08:00
@ryd994 单单去了貌似不行
onemoo
2014-08-13 09:01:03 +08:00
@1314258
肯定不能只传递syn数据包,所以--syn一定要去掉。但是你说这样还不行,我也搞不懂了。

咱们来一起分析一下数据流的路径:
局域网中的192.168.1.3和192.168.1.2是可以直接互访的,但你为了让192.168.1.3能直接无感翻墙,所以在路由(网关)上,把它的外联数据包都重定向给192.168.1.2的ss-redir服务,而当数据返回192.168.1.2时,它应该可以直接把数据包送回192.168.1.3的,所以按说在路由上只有这一个iptables配置就够了。

要么就是我对网络拓扑的理解不对,要么就是哪里还有问题:
192.168.1.3是所有网站都不能上吗?还是某些网站不能翻?
如果是某些网站不能翻,你确定解决DNS问题了吗?
你说的192.168.1.2上面运行的是类ss-redir设备,运行的是不是ss-redir?
1314258
2014-08-13 18:43:09 +08:00
@onemoo 是192.168.1.3所有网站都不能上了。
192.168.1.2运行的不是ss-redir,是tor的transport功能。

道理上来说,这个iptables应该是没问题的了。
onemoo
2014-08-14 09:23:28 +08:00
@1314258
我不太清楚tor的工作方式,也许问题出在它这里。
抱歉啦,帮不了你了。
1314258
2014-08-14 13:05:02 +08:00
1314258
2014-08-14 13:55:54 +08:00
@s7lx 终于采取了你这种方案。


@onemoo 我估计是redirect和DNAT --to-destination不是一样的功能。
@ryd994
@tmqhliu

感谢以上各位了。
onemoo
2014-08-14 16:29:12 +08:00
@1314258
原来是这样。
我只考虑了数据包可以回到192.168.1.3,没想到回来的那个握手包的源地址已经不是发送时的目的地址了,所以会被直接忽略掉。
也许你也可以像那个帖子中说的,把代理设备放到另一个子网中,当然前提是路由器能够再划分一个子网出来。

2L的办法是不是因为已经设置代理设备为网关了,所以数据本来就从那里走,就没有这些问题了?(来去数据的路径一样)
redirect除了只能改变目标端口外,没有更多的作用了吧?

怪不得通常的办法是直接在路由器上运行这类服务呢,就没有这些问题了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/127172

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX