请教 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 节点网络内的主机。 不知道是哪里出了问题。。。

8476 次点击
所在节点    宽带症候群
117 条回复
weyou
2020-02-11 21:38:11 +08:00
@lilogo 这条也不需要啊,访问对方局域网直接走路由就行了,不一定要做 NAT。
lilogo
2020-02-11 21:42:30 +08:00
@weyou 两个网络是在不同的局域网的,分属不同的公网也不需要 nat 吗?
pubby
2020-02-11 21:50:32 +08:00
vpn 接口上不需要 nat
a,b 都加对方网段的 route 就行了
a、b 既然都是路由器,ip forward 应该已经打开了
pubby
2020-02-11 21:52:42 +08:00
这两天折腾双方都是 nat 下的 l2tp/ipsec 服务快疯了
weyou
2020-02-11 21:58:31 +08:00
@lilogo 不需要,只要 hosts 文件里路由设置正确,还有各自添加好对方网络的路由即可。

当然 tinc 要连接上对端,还要至少有一方在 wan 端将 tinc 的监听端口暴露出去(这一点相信你已经做好了,因为你已经能 ping 通对方的 tinc 地址了)
lilogo
2020-02-11 22:00:35 +08:00
@pubby 是的,两台都是 openwrt。既然 vpn 接口不需要加 nat 的话,那么理论上来说 #13 楼的应该有效了,但似乎不行。而且不需要 nat 的话,那么最简单的方案就是:关闭 iptables、指定经过 tun0 设备的到对方网段的 route、开启 ip forward。

这三步就应该 OK 了啊。。。
izoabr
2020-02-11 22:02:50 +08:00
@lilogo #18 不用呀,因为这是 FORWARD 链的事呀。
iptables 的策略链是这样的顺序(不是給本机的部分),进入 INPUT->PREROUTING 路由前->路由处理并转发->POSTROUTING 路由后然后就是 OUTPUT 了

你这情况仅仅是路由转发而已,不需要 MASQUERADE 呀。
或者说,完全不需要 netfilter(iptables)参与就能搞定的。

我看您的主机名是 openwrt,是不是 openwrt 有什么特殊的东西呀?
你登录一下 web 界面看看,是不是还有其它路由协议生效着,好像我记得它确实支持其它路由工具的。
另外网卡有一些 ICMP 的开关,sysctl -a |grep icmp
看下是不是网络层面就把 icmp 协议給过滤掉了,我遇到过中间设备直接 ignore 掉了 ICMP 协议,然后上下游都懵逼,但是不影响其它 tcp 和 udp 协议通讯。
所以你也别光用能不能 ping 通作为测试结论,你可以试试那边开个 web 服务之类的,比如在 10.200.30.55 随便开个 web 服务,默认安装的 apache 和 nginx 直接启动服务都可以,然后从 Route A 去 telnet 10.200.30.55 80,然后 GET /试试,没准其它应用协议是通的,只是 icmp 过滤掉了而已。
lilogo
2020-02-11 22:03:53 +08:00
@weyou tinc 网络都已经好了。hosts 文件里路由?是指 tinc 的路由吗?我没有在 hosts 文件里面设置路由,就是 tinc-up 后台 tinc-down 文件里面设置了 ip,路由的话是我命令行手工添加的。
izoabr
2020-02-11 22:04:52 +08:00
另外在 B 上执行 ip ro get 10.200.30.55 from 192.168.1.1 这个,可以看到路由策略是否正确。
lilogo
2020-02-11 22:08:42 +08:00
@izoabr 应该不会过滤 icmp 吧,我单纯的 ping vpn 网段和内网的网段的话都是可以响应的
weyou
2020-02-11 22:13:43 +08:00
@lilogo hosts 文件里要通过 Subnet 来表明对方节点支持的网络,tinc 才会将封包转过去。比如你的 A 里面要有 B 的 host 文件,这个文件里至少要有两个 Subnet,以一个是 tinc 节点本身的
Subnet = 172.16.14.2/32
还有一个 Subnet 表明要访问的 B 的子网
Subnet = 10.200.30.0/24
反之,B 里面的 A host 文件也要有 A 的信息
lilogo
2020-02-11 22:19:52 +08:00
@izoabr
@weyou 问下经过 tun0 设备到对端局域网的路由应该是指定对端的 vpn ip 还是本节点的 vpn ip ?
如下是 A 节点,VPN 分配的 IP 地址是 172.16.14.1:
```
root@OpenWrt:~# ip addr show | grep '172.16.14.'
inet 172.16.14.1/24 scope global tun0
root@OpenWrt:~#
```

那么配置的路由应该是下面的哪一个呢?(我都试过了两个都不行。。)
```
root@OpenWrt:~# # via 本节点 IP
root@OpenWrt:~# ip route add 192.168.1.0/24 via 172.16.14.1
root@OpenWrt:~# # via 对方 IP
root@OpenWrt:~# ip route add 192.168.1.0/24 via 172.16.14.2
root@OpenWrt:~#
```
weyou
2020-02-11 22:24:04 +08:00
@lilogo 不需要指定下一条 ip,指定 dev tun0 就好了,如果你是在 tinc-up 里,直接 ip route add 10.200.30.0/24 dev $INTERFACE 即可
weyou
2020-02-11 22:26:46 +08:00
@lilogo 当封包转给 tun0,tinc 会根据 host 文件里声明的 subnet 来决定将这个封包转给哪一个 tinc 节点
izoabr
2020-02-11 22:31:22 +08:00
@lilogo #32 对端的 VPN IP,可以顺便加一个 dev tun0
pubby
2020-02-11 22:31:54 +08:00
@lilogo 没用过 tinc,不过看了 tinc.conf 的配置参数

下面这两个是不是要检查一下,影响路由数据包的转发
DirectOnly = no
Forwarding = kernel (默认是 internal,也就是只能转发到其他 tinc 的接口上,而 192.168.1.1 不是 tinc 的设备)
izoabr
2020-02-11 22:35:17 +08:00
@pubby #36 赞同。
我以上的回答和协助都是基于策略路由+GRE Tunnel 的经验
sujin190
2020-02-11 22:38:19 +08:00
我看你上面 @lilogo #11 说 A 上 traceroute B 10.200.30.55 都通了啊,怎么又 ping 不通了,这怎么可能。。
lilogo
2020-02-11 22:44:31 +08:00
@sujin190 #11 并没有通啊
izoabr
2020-02-11 22:44:50 +08:00
Other possible annotations after the time are !H, !N, or !P (host, network or protocol unreachable), !S (source route failed), (fragmenta-
tion needed - the RFC1191 Path MTU Discovery value is displayed), !U or !W (destination network/host unknown), !I (source host is iso-
lated), !A (communication with destination network administratively prohibited), !Z (communication with destination host administratively
prohibited), !Q (for this ToS the destination network is unreachable), !T (for this ToS the destination host is unreachable), !X (communi-
cation administratively prohibited), !V (host precedence violation), !C (precedence cutoff in effect), or !<num> (ICMP unreachable code
<num>). These are defined by RFC1812 (which supersedes RFC1716). If almost all the probes result in some kind of unreachable, traceroute
will give up and exit.

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

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

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

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

© 2021 V2EX