请教 iptables 防火墙及路由配置的打通两地局域网的问题

2020-02-11 14:32:07 +08:00
 lilogo

各位,基于 tinc 已经可以把各个节点都连接起来了,但是问题是每个要访问的节点上都需要安装 tinc,比较麻烦。

因此想通过配置路由的方式打通两地的局域网,这样只需要在路由器或 Linux 节点上配置一次 tinc 客户端即可,以下是网络拓扑:

+--------------------+       +       +--------------------+
|                    |       |       |                    |
|192.168.1.1/24 - LAN|       +<------+10.200.30.1/24 - LAN|
|172.16.14.1/24 - VPN+------>+       |172.16.14.2/24 - VPN|
|                    |       |       |                    |
+--------------------+       +       +--------------------+
          A                                     B

A、B 分别作为网关(路由器)。现在是想通过在 A、B 两个节点上配置路由和 iptables 规则,以达到 A 节点网络内主机可以访问 B 节点局域网其他主机的内容。

在 A 节点上配置路由:

ip route add 10.200.30.0/24 via 172.16.14.2

在 B 节点上配置路由和 iptables 规则:

iptables -A FORWARD -o tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -j ACCEPT
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o br-lan -j MASQUERADE

由于 B 节点不需要访问 A 节点内资源,因此没有在 B 上配置到 A 的路由。

但目前现在好像 A 节点和 A 节点局域网内的其他主机依然 ping 不通 B 节点网络内的主机。 不知道是哪里出了问题。。。

8267 次点击
所在节点    宽带症候群
117 条回复
izoabr
2020-02-11 22:45:32 +08:00
ifconfig -a 看看
别是 tun0 的 MTU 有问题吧
izoabr
2020-02-11 22:51:43 +08:00
172.16.14.0/24 dev ztmjffzrix proto kernel scope link src 172.16.14.1
172.16.14.0/24 dev tun0 proto kernel scope link src 172.16.14.1
好像是这两行的问题,ztmjffzrix 是个啥?
lilogo
2020-02-11 22:56:47 +08:00
@izoabr
@weyou 根据 #31 的方法 A、B 两个节点已经通了,感谢!
但是这只解决了一半的问题,因为 A、B 两个是路由器,A、B 虽然可以互通,但是 A、B 两个路由后端的机器还是没有通。我是想在 A、B 两个节点增加一下 iptables MASQUERADE:
```
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
```
不过还是 ping 不通 A、B 后面的其他主机,如下,
在 A 节点 ping B 路由器后面的主机( IP 为 10.200.30.67 ):
```
root@OpenWrt:~# ping 10.200.30.67
PING 10.200.30.67 (10.200.30.67): 56 data bytes
^C
--- 10.200.30.67 ping statistics ---
9 packets transmitted, 0 packets received, 100% packet loss
root@OpenWrt:~#
```
此时在 B 路由器上 tcpdump -i tun0 已经收到包了,但是还是不通:
```
root@OpenWrt:~# tcpdump -i tun0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes
14:53:53.548755 IP6 fe80::31ad:504:165b:1666.546 > ff02::1:2.547: dhcp6 solicit
14:53:53.648347 IP 172.16.14.1 > 10.200.30.67: ICMP echo request, id 53116, seq 5, length 64
14:53:53.648366 IP 172.16.14.2 > 172.16.14.1: ICMP 10.200.30.67 protocol 1 port 11387 unreachable, length 92
14:53:54.648702 IP 172.16.14.1 > 10.200.30.67: ICMP echo request, id 53116, seq 6, length 64
14:53:54.648722 IP 172.16.14.2 > 172.16.14.1: ICMP 10.200.30.67 protocol 1 port 57910 unreachable, length 92
14:53:55.648533 IP 172.16.14.1 > 10.200.30.67: ICMP echo request, id 53116, seq 7, length 64
14:53:55.648553 IP 172.16.14.2 > 172.16.14.1: ICMP 10.200.30.67 protocol 1 port 46322 unreachable, length 92
^C
7 packets captured
7 packets received by filter
0 packets dropped by kernel
root@OpenWrt:~#
```
izoabr
2020-02-11 23:00:04 +08:00
你就别 MASQUERADE 了,这种已知的固定 IP 直接做 SNAT 呗,两头都做一下,伪装成 172.16.14.1 和 14.2 去通讯就好了。
PREROUTING 上加策略哦
lilogo
2020-02-11 23:07:17 +08:00
@izoabr ztmjffzrix 这个上 zerotier 建的虚拟设备,我编辑的时候编辑错了,忽略几块,参考 #43 #31 A、B 两节点已经可以通讯了。
hawhaw
2020-02-11 23:17:26 +08:00
@lilogo 我的错误。在 A 和 B 上的路由指的是下一条(也就是对端 VPN 的地址)的地址,A 上应该指到 172.16.14.2 ; B 上应该指到 172.16.14.1
hawhaw
2020-02-11 23:19:59 +08:00
@lilogo 还有,这种情况我通常都是建议直接路由过去,所以:snat , masq 都不用做。一个配置起来简单,再一个,通讯双方能明确知道对端的真实 ip
weyou
2020-02-11 23:20:15 +08:00
@lilogo 不需要 MASQUERADE 啊。按照#31 正常就应该能访问 B 后面的机器了。B 端有没有加上 A 的路由啊,看看 ip route 的结果呢
weyou
2020-02-11 23:30:49 +08:00
@lilogo 看起来你是 openwrt 啊,需要配置下 openwrt 的防火墙
hawhaw
2020-02-11 23:31:58 +08:00
@lilogo 你这种需求我们通常称之为“打洞”,我一般的搞法是不配置 tunnel 两端的所谓“互联 ip”,这里对应的是 172.16.14.1 和 172.16.14.2,为什么呢?有这个互联 ip 以后引入了复杂度,再者,你在 A 或 B 上直接 ping 对端网络的其他机器,哈哈,会发现不通。因为你的 src ip 是互联 ip(172.16.14.),对端网络根本就没有这个段的路由!当然也有解决方法,对端都加上互联 ip 段的路由,但这是个蠢办法,高明一点的是在 A,B 上添加对端网络路由的时候指定 src up 为自己段的真实 ip(如 192.168.1.1 和 10.200.30.1),当然更高明的是根本就不引入互联 ip:)
lilogo
2020-02-11 23:34:01 +08:00
@weyou 路由已经加了,但是 ping 不通 A、B 路由后面的机器:

A 节点:
```
root@OpenWrt:/etc/tinc/cloud/hosts# ip route show
default via 53.3.94.1 dev pppoe-wan proto static
10.200.30.0/24 dev tun0 scope link
53.3.94.1 dev pppoe-wan proto kernel scope link src 53.3.94.180
192.168.1.0/24 dev br-lan proto kernel scope link src 192.168.1.1
172.16.14.0/24 dev tun0 proto kernel scope link src 172.16.14.1
root@OpenWrt:/etc/tinc/cloud/hosts#
```

B 节点:
```
root@OpenWrt:~# ip route show
default via 10.200.30.250 dev br-lan src 10.200.30.55
10.200.30.0/24 dev br-lan scope link src 10.200.30.55
192.168.1.0/24 dev tun0 scope link
172.16.15.0/24 dev tun0 scope link src 172.16.15.2
root@OpenWrt:~#
```
lilogo
2020-02-11 23:35:54 +08:00
@weyou openwrt 的防火墙要配置什么呢?
lilogo
2020-02-11 23:38:12 +08:00
@hawhaw 感觉越来越高明的样子,不是学网络的,看不懂哈。。。如果大佬有时间能否多讲解一二呢。
weyou
2020-02-11 23:43:36 +08:00
@lilogo 你的 tun0 接口是在 interface 页面创建的不?
在 Network > Interfaces > NETNAME ( tun0 接口) > Firewall Settings 设置中 ,创建新的防火墙区域 tinc。然后在 Network > Firewall > General Settings > Zones 设置中,编辑防火墙区域 tinc,使其能和防火墙区域 lan 相互转发。不然确实是访问不到子网的
pubby
2020-02-11 23:54:06 +08:00
@lilogo
你 A、B 上的 tun0 能互通,双方 route 也配了,但是两个网段不能互通,说明数据包到对方 tun0 为止了,没被转发

检查 tinc.conf 那个内核转发配置项有没有打开

如果还是不行,就在 A、B 上再建条 ipip、gre 之类的 tunnel 通道,这样肯定能支持路由的。
lilogo
2020-02-12 00:01:28 +08:00
@weyou
@pubby 感谢二位提供的思路,被老婆拎回房睡觉了。。。

@weyou 不是页面创建的,直接编辑 /etc/config 下的文件创建的。
ericww
2020-02-12 00:09:03 +08:00
iptables -A input_rule -i tun0 -j ACCEPT
iptables -A output_rule -o tun0 -j ACCEPT
iptables -A forwarding_rule -i tun0 -j ACCEPT
iptables -A forwarding_rule -o tun0 -j ACCEPT
defunct9
2020-02-12 00:09:40 +08:00
开 ssh,让我上去看看
weyou
2020-02-12 00:11:57 +08:00
@lilogo 在 /etc/config/network 里添加的也是一样的,interface 页面会有个 tun0 接口
lilogo
2020-02-12 00:33:28 +08:00
@weyou 嗯刚刚分别在两个路由器上面试了下,新建防火墙区域,然后到防火墙那个页面编辑把 tun 的区域打开,最右侧 Masquerading 选项勾选,保存应用,然后相互 ping 对方内网其他机器,还是不行 。
由于是手机操作的,不方便上传图片,明天再操作截图下。
谢谢~

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

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

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

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

© 2021 V2EX