请教一下这种情况下 iptables 该怎样写

2019-08-29 08:18:22 +08:00
 chunchu

网络简图见下图:

     A                B(Raspberry Pi)              C(VPS)         
192.168.0.*   <--->   192.168.0.112          111.111.111.111   <--->   Internet
                        10.0.2.60     <--->     10.0.2.251
                           tinc                    tinc

A(PC):

B(Raspberry Pi):

C(VPS):

A(PC)与 B(Raspberry Pi)同属 192.168.0.0/24,B(Raspberry Pi)与 C(VPS)通过 tinc 连接,现在想要实现的效果是:A(PC)将网关设置 192.168.0.112 ,所有流量经过 B(Raspberry Pi),然后流量通过 tinc 到达 C(VPS)出口。这样考虑的原因主要是因为 tinc 比较稳定,使用的人也比较少。网络上有使用 OpenVPN 这样干的,但是 OpenVPN 与 tinc 还是稍有差异。V2EX 上这样干过的讨论一下,谢谢!

2555 次点击
所在节点    问与答
24 条回复
xduanx
2019-08-29 08:27:51 +08:00
这个问题再简单不过了
1,树莓派上启用路由转发;树莓派上指默认路由到 VPS 的 10.0.2.251 上;如果默认路由不方便,那就写根据源 IP 的策略路由
2,VPS 上在 111.111.111.111 上写 nat 规则; VPS 写 192.168.0.0 的回城路由,指向 10.0.2.60
chunchu
2019-08-29 08:57:04 +08:00
@xduanx
非常不好意思,这个问题对懂网络的人来说很简单,但是我搞了好久还是搞不定,我也知道做伸手党是不好的,所以我先找了一本书来看看,再尝试一下。
Linux Advanced Routing & Traffic Control
https://lartc.org/
blackeeper
2019-08-29 09:40:01 +08:00
1 楼说的很正确,我来补上命令吧
在树莓派上和 C(VPS)编辑文件:/etc/sysctl.conf,添加如下一行,开启路由转发模式
net.ipv4.ip_forward = 1
执行命令:sysctl -p /etc/sysctl.conf
在 C(VPS)上执行:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
ip route add 192.168.0.0/24 via 10.0.2.60
chunchu
2019-08-29 14:16:35 +08:00
@blackeeper
你好!
树莓派上仅仅开启路由转发模式好像不行吧?如果要添加根据源 IP 的策略路由应该怎样写啊?
blackeeper
2019-08-29 15:13:45 +08:00
@chunchu
树莓派上你需要添加默认路由到 10.0.2.251 ,添加命令如下:
ip route add default via 10.0.2.251
你这个拓扑很简单,不需要写啥策略路由
xduanx
2019-08-29 17:59:29 +08:00
不请自来
源 IP 策略路由
ip rule add from 192.168.0.0/24 table 1000
ip route add default via 10.0.2.251 table 1000

(其中 1000 这个数字随便写,写 20 也行)
chunchu
2019-08-29 21:47:09 +08:00
@blackeeper @xduanx

在树莓派上添加 ip route add default via 10.0.2.251 后不能联网了,查看路由表出现很奇怪的情况,tinc 本身在路由表中添加了两条

```
pi@Pi:~ $ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.2.251 0.0.0.0 UG 0 0 0 tinc
0.0.0.0 192.168.0.1 0.0.0.0 UG 202 0 0 eth0
0.0.0.0 192.168.0.1 0.0.0.0 UG 303 0 0 wlan0
10.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 tinc
169.254.0.0 0.0.0.0 255.255.0.0 U 204 0 0 tinc
192.168.0.0 0.0.0.0 255.255.255.0 U 202 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 303 0 0 wlan0
```
xduanx
2019-08-29 22:07:27 +08:00
不能联网正常啊,因为你修改了他的默认路由,而且有可能 10.0.2.251 的 metric 比另外 2 条默认路由高
你发的路由表现在是在的路由表是正常的,在预料范围捏
xduanx
2019-08-29 22:08:28 +08:00
你就用策略路由吧,不要用默认路由了,6 层所写的那样
xduanx
2019-08-29 22:11:27 +08:00
8 层说错了,metric 越小,优先级越高
xduanx
2019-08-29 22:12:46 +08:00
删掉刚刚添加的默认路由方式 2 中
1,重启
2,ip route del default via 10.0.2.251
xduanx
2019-08-29 22:15:59 +08:00
给你命令,直接复制粘贴吧
1,在树莓派上和 C(VPS)编辑文件:/etc/sysctl.conf,添加如下一行,开启路由转发模式
net.ipv4.ip_forward = 1
执行命令:sysctl -p /etc/sysctl.conf

,2,启用策略路由
ip rule add from 192.168.0.0/24 table 1000
ip route add default via 10.0.2.251 table 1000


3,在 C(VPS)上执行:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
ip route add 192.168.0.0/24 via 10.0.2.60

基本上就是复制刚刚那位老哥的命令
chunchu
2019-08-30 08:05:03 +08:00
@xduanx
现在的情况是,C(VPS)上运行没有问题,树莓派上运行策略路由
ip route add default via 10.0.2.251 table 1000
树莓派就卡住了,网络就断了,需要重启树莓派才行,感觉策略路由添加不上,但是直接添加默认路由可以添加上,可以 ssh 登陆到树莓派,但是 ping 外网不通。这个问题很奇怪。
chunchu
2019-08-30 08:09:33 +08:00
我怀疑是不是树莓派系统的问题,我安装的是 Raspbian 9 stretch.
xduanx
2019-08-30 08:22:41 +08:00
ip rule list 看下输出
ip route show table 1000 看下输出
xduanx
2019-08-30 08:47:42 +08:00
用默认路由办法如下
ip route add 111.111.111.111/32 via 192.168.0.1
ip route add default via 10.0.2.251
xduanx
2019-08-30 08:50:04 +08:00
不是我吹牛逼,你这个小项目,我在公司连续干了一年,每天就是翻来覆去改这些东西
所以,你这个不伦什么刁钻的问题,截图就行了
xduanx
2019-08-30 08:52:49 +08:00
你这个除了 tinc 还有其他多选
gre/vxlan/l2tp over ipsec
wireguard
openvpn
单纯的 ipsec
chunchu
2019-08-30 09:10:12 +08:00
@xduanx

ip rule lis 显示已经添加成功了

pi@Pi:~ $ sudo ip rule list
0: from all lookup local
32765: from 192.168.0.0/24 lookup 1000
32766: from all lookup main
32767: from all lookup default

我不是怀疑你的能力问题,你给出的代码肯定没有问题,我怀疑是系统的问题。我重新装一下树莓派的系统试试。
xduanx
2019-08-30 09:17:21 +08:00
哈哈,都可以,随便你怎么折腾,我都能搞得定;
我也没怀疑自己的能力,只是在 V 站这个大神聚集的地方看到了可以露脸的机会,
情不自禁的想吹一波牛逼

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

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

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

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

© 2021 V2EX