各位,基于 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 节点网络内的主机。 不知道是哪里出了问题。。。
1
jasonyang9 2020-02-11 14:39:14 +08:00
听上去是 因为没有从 B 到 A 的路由 导致 ping 的 echo-reply 数据包无法回到 A 网络
|
2
lilogo OP @jasonyang9 应该不是这个原因,理论上 B 收到的包应该是来自 172.16.14.1 的,而不是 192.168.1.1 的,而 172 网段的是 VPN 网段,本身即可正常通信。
|
3
lilogo OP 在 A 节点机器 ping B 节点时,在 A 节点上使用 `tcpdump tun0` 抓包如下:
``` 15:28:25.364435 IP 172.16.14.1 > 10.200.30.55: ICMP echo request, id 63083, seq 19, length 64 15:28:25.364779 IP 10.200.30.55 > 172.16.14.1: ICMP net 10.200.30.55 unreachable - unknown, length 92 15:28:26.364657 IP 172.16.14.1 > 10.200.30.55: ICMP echo request, id 63083, seq 20, length 64 15:28:26.365404 IP 10.200.30.55 > 172.16.14.1: ICMP net 10.200.30.55 unreachable - unknown, length 92 15:28:27.364882 IP 172.16.14.1 > 10.200.30.55: ICMP echo request, id 63083, seq 21, length 64 15:28:27.365638 IP 10.200.30.55 > 172.16.14.1: ICMP net 10.200.30.55 unreachable - unknown, length 92 15:28:28.365165 IP 172.16.14.1 > 10.200.30.55: ICMP echo request, id 63083, seq 22, length 64 15:28:28.365573 IP 10.200.30.55 > 172.16.14.1: ICMP net 10.200.30.55 unreachable - unknown, length 92 ``` |
4
izoabr 2020-02-11 15:42:46 +08:00
你去 B 上加上那条路由试试不就知道了。
还有要把包转发打开哦。 |
5
lilogo OP 补充下所有主机都是可 ping 的,而且直接在 A、B 节点上 ping 172.16.14.0/24 网段内机器都是可以 ping 通的。
另外 tcpdump 抓虚拟网卡的命令是 tcpdump -i tun0 |
6
lilogo OP |
7
izoabr 2020-02-11 15:53:13 +08:00
A 和 B 的路由表和策略表放出来看看
ip ro sh ip ru sh |
8
lilogo OP A 节点的:
``` root@OpenWrt:~# ip route show default via 53.3.94.1 dev pppoe-wan proto static 10.200.30.0/24 via 172.16.14.122 dev tun0 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 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 192.168.133.0/24 dev tun1 proto kernel scope link src 192.168.133.1 root@OpenWrt:~# ip ru sh 0: from all lookup local 1001: from all iif pppoe-wan lookup main 2001: from all fwmark 0x100/0x3f00 lookup 1 2061: from all fwmark 0x3d00/0x3f00 blackhole 2062: from all fwmark 0x3e00/0x3f00 unreachable 32766: from all lookup main 32767: from all lookup default root@OpenWrt:~# ``` B 节点的: ``` root@OpenWrt:~# ip route show default via 10.200.30.250 dev br-lan src 10.200.30.1 10.200.30.0/24 dev br-lan scope link src 10.200.30.1 192.168.1.0/24 via 172.16.14.1 dev tun0 172.16.14.0/24 dev tun0 scope link src 172.16.14.2 root@OpenWrt:~# ip ru sh 0: from all lookup local 32766: from all lookup main 32767: from all lookup default root@OpenWrt:~# ``` @izoabr |
9
lilogo OP 抱歉上一条有一行错了,参考这个:
A 节点的: ``` root@OpenWrt:~# ip route show default via 53.3.94.1 dev pppoe-wan proto static 10.200.30.0/24 via 172.16.14.2 dev tun0 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 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 192.168.133.0/24 dev tun1 proto kernel scope link src 192.168.133.1 root@OpenWrt:~# ip ru sh 0: from all lookup local 1001: from all iif pppoe-wan lookup main 2001: from all fwmark 0x100/0x3f00 lookup 1 2061: from all fwmark 0x3d00/0x3f00 blackhole 2062: from all fwmark 0x3e00/0x3f00 unreachable 32766: from all lookup main 32767: from all lookup default root@OpenWrt:~# ``` B 节点的: ``` root@OpenWrt:~# ip route show default via 10.200.30.250 dev br-lan src 10.200.30.1 10.200.30.0/24 dev br-lan scope link src 10.200.30.1 192.168.1.0/24 via 172.16.14.1 dev tun0 172.16.14.0/24 dev tun0 scope link src 172.16.14.2 root@OpenWrt:~# ip ru sh 0: from all lookup local 32766: from all lookup main 32767: from all lookup default root@OpenWrt:~# ``` @izoabr |
10
izoabr 2020-02-11 16:47:10 +08:00
你用 traceroute 探一遍路看看。
1、从 10.200.30.55 ping 172.16.14.1 2、然后反过来,从 172.16.14.1 ping 10.200.30.55 3、看一下上面两个的 traceroute 的结果 |
11
lilogo OP @izoabr
从 B 上 traceroute A 的情况: ``` root@OpenWrt:~# traceroute 172.16.14.1 traceroute to 172.16.14.1 (172.16.14.1), 30 hops max, 46 byte packets 1 172.16.14.1 (172.16.14.1) 5.077 ms 5.189 ms 4.681 ms root@OpenWrt:~# traceroute 192.168.1.1 traceroute to 192.168.1.1 (192.168.1.1), 30 hops max, 46 byte packets 1 192.168.1.1 (192.168.1.1) 0.003 ms !U 0.002 ms !U 0.002 ms !U root@OpenWrt:~# ``` 从 A 上 traceroute B 的情况: ``` root@OpenWrt:~# traceroute 172.16.14.2 traceroute to 172.16.14.2 (172.16.14.2), 30 hops max, 38 byte packets 1 172.16.14.2 (172.16.14.2) 6.088 ms 4.304 ms 4.858 ms root@OpenWrt:~# traceroute 10.200.30.55 traceroute to 10.200.30.55 (10.200.30.55), 30 hops max, 38 byte packets 1 10.200.30.55 (10.200.30.55) 1.315 ms !U 0.031 ms !U 0.030 ms !U root@OpenWrt:~# ``` |
12
sujin190 2020-02-11 17:55:03 +08:00
sysctl 的 ip_forward 打开了没啊?
|
13
hawhaw 2020-02-11 18:05:27 +08:00 via Android
1,A 和 B 打开 ip 转发;
2,A 及 A 后端的网络里都要将 B 后端的网络的网段路由指向 A ; 3,B 及 B 后端的网络里要将 A 所在网段地址的路由指向我 B ; 4,关闭 A 和 B 上的防火墙; 此时我,双向就应该已经通了。 5,再打开 B 上防火墙,封掉从 B 网段到 A 网段数据包的转发 |
16
lilogo OP @hawhaw 按照你的步骤 1-4,在执行完第 4 步时依然 ping 不通,步骤如下:
A 节点: ``` root@OpenWrt:~# ip route show default via 53.3.94.1 dev pppoe-wan proto static 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:~# ip route add 10.200.30.0/24 via 172.16.14.1 root@OpenWrt:~# cat /proc/sys/net/ipv4/ip_forward 1 root@OpenWrt:~# /etc/init.d/firewall stop Warning: Section @zone[1] (wan) cannot resolve device of network 'wan6' * Flushing IPv4 filter table * Flushing IPv4 nat table * Flushing IPv4 mangle table * Flushing IPv4 raw table * Flushing IPv6 filter table * Flushing IPv6 nat table * Flushing IPv6 mangle table * Flushing conntrack table ... root@OpenWrt:~# ``` B 节点: ``` root@OpenWrt:~# ip route add 192.168.1.0/24 via 172.16.14.2 root@OpenWrt:~# /etc/init.d/firewall stop Warning: Unable to locate ipset utility, disabling ipset support Warning: Section @zone[1] (wan) cannot resolve device of network 'wan' Warning: Section @zone[1] (wan) cannot resolve device of network 'wan6' Warning: Section @zone[1] (wan) has no device, network, subnet or extra options * Flushing IPv4 filter table * Flushing IPv4 nat table * Flushing IPv4 mangle table * Flushing IPv6 filter table * Flushing IPv6 mangle table * Flushing conntrack table ... root@OpenWrt:~# cat /proc/sys/net/ipv4/ip_forward 1 root@OpenWrt:~# root@OpenWrt:~# ping 192.168.1.1 PING 192.168.1.1 (192.168.1.1): 56 data bytes ^C --- 192.168.1.1 ping statistics --- 15 packets transmitted, 0 packets received, 100% packet loss root@OpenWrt:~# ``` B 节点 ping A 节点抓包: ``` 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 11:35:14.283993 IP6 fe80::31ad:504:165b:1666.63363 > ff02::c.1900: UDP, length 146 11:35:16.238521 IP 172.16.14.2 > 192.168.1.1: ICMP echo request, id 26670, seq 0, length 64 11:35:16.238591 IP 192.168.1.1 > 172.16.14.2: ICMP net 192.168.1.1 unreachable - unknown, length 92 11:35:17.238794 IP 172.16.14.2 > 192.168.1.1: ICMP echo request, id 26670, seq 1, length 64 11:35:17.238847 IP 192.168.1.1 > 172.16.14.2: ICMP net 192.168.1.1 unreachable - unknown, length 92 11:35:17.285547 IP6 fe80::31ad:504:165b:1666.63363 > ff02::c.1900: UDP, length 146 11:35:18.238836 IP 172.16.14.2 > 192.168.1.1: ICMP echo request, id 26670, seq 2, length 64 11:35:18.238885 IP 192.168.1.1 > 172.16.14.2: ICMP net 192.168.1.1 unreachable - unknown, length 92 11:35:19.238940 IP 172.16.14.2 > 192.168.1.1: ICMP echo request, id 26670, seq 3, length 64 11:35:19.238995 IP 192.168.1.1 > 172.16.14.2: ICMP net 192.168.1.1 unreachable - unknown, length 92 11:35:20.238975 IP 172.16.14.2 > 192.168.1.1: ICMP echo request, id 26670, seq 4, length 64 ``` |
17
lilogo OP @izoabr 从 10.200.30.55 上面 ping 和 traceroute 如下:
``` root@OpenWrt:~# traceroute 172.16.14.1 traceroute to 172.16.14.1 (172.16.14.1), 30 hops max, 46 byte packets 1 172.16.14.1 (172.16.14.1) 5.377 ms 5.160 ms 4.769 ms root@OpenWrt:~# root@OpenWrt:~# ping 172.16.14.1 PING 172.16.14.1 (172.16.14.1): 56 data bytes 64 bytes from 172.16.14.1: seq=0 ttl=64 time=5.329 ms 64 bytes from 172.16.14.1: seq=1 ttl=64 time=5.603 ms ^C --- 172.16.14.1 ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max = 5.329/5.466/5.603 ms root@OpenWrt:~# ``` 另外,是否和 17216.14.0/24 这个是 VPN 网段即 tun 设备有关系? |
19
weyou 2020-02-11 20:32:26 +08:00 via Android
iptables -t nat -A POSTROUTING -o br-lan -j MASQUERADE 这条 rule 的目的是什么,感觉不需要啊
|
20
lilogo OP |
23
pubby 2020-02-11 21:50:32 +08:00 via Android
vpn 接口上不需要 nat
a,b 都加对方网段的 route 就行了 a、b 既然都是路由器,ip forward 应该已经打开了 |
24
pubby 2020-02-11 21:52:42 +08:00 via Android
这两天折腾双方都是 nat 下的 l2tp/ipsec 服务快疯了
|
25
weyou 2020-02-11 21:58:31 +08:00 via Android
@lilogo 不需要,只要 hosts 文件里路由设置正确,还有各自添加好对方网络的路由即可。
当然 tinc 要连接上对端,还要至少有一方在 wan 端将 tinc 的监听端口暴露出去(这一点相信你已经做好了,因为你已经能 ping 通对方的 tinc 地址了) |
26
lilogo OP @pubby 是的,两台都是 openwrt。既然 vpn 接口不需要加 nat 的话,那么理论上来说 #13 楼的应该有效了,但似乎不行。而且不需要 nat 的话,那么最简单的方案就是:关闭 iptables、指定经过 tun0 设备的到对方网段的 route、开启 ip forward。
这三步就应该 OK 了啊。。。 |
27
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 过滤掉了而已。 |
28
lilogo OP @weyou tinc 网络都已经好了。hosts 文件里路由?是指 tinc 的路由吗?我没有在 hosts 文件里面设置路由,就是 tinc-up 后台 tinc-down 文件里面设置了 ip,路由的话是我命令行手工添加的。
|
29
izoabr 2020-02-11 22:04:52 +08:00
另外在 B 上执行 ip ro get 10.200.30.55 from 192.168.1.1 这个,可以看到路由策略是否正确。
|
31
weyou 2020-02-11 22:13:43 +08:00 via Android
@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 的信息 |
32
lilogo OP @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:~# ``` |
33
weyou 2020-02-11 22:24:04 +08:00 via Android
@lilogo 不需要指定下一条 ip,指定 dev tun0 就好了,如果你是在 tinc-up 里,直接 ip route add 10.200.30.0/24 dev $INTERFACE 即可
|
34
weyou 2020-02-11 22:26:46 +08:00 via Android
@lilogo 当封包转给 tun0,tinc 会根据 host 文件里声明的 subnet 来决定将这个封包转给哪一个 tinc 节点
|
36
pubby 2020-02-11 22:31:54 +08:00
@lilogo 没用过 tinc,不过看了 tinc.conf 的配置参数
下面这两个是不是要检查一下,影响路由数据包的转发 DirectOnly = no Forwarding = kernel (默认是 internal,也就是只能转发到其他 tinc 的接口上,而 192.168.1.1 不是 tinc 的设备) |
38
sujin190 2020-02-11 22:38:19 +08:00
我看你上面 @lilogo #11 说 A 上 traceroute B 10.200.30.55 都通了啊,怎么又 ping 不通了,这怎么可能。。
|
40
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. |
41
izoabr 2020-02-11 22:45:32 +08:00
ifconfig -a 看看
别是 tun0 的 MTU 有问题吧 |
42
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 是个啥? |
43
lilogo OP @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:~# ``` |
44
izoabr 2020-02-11 23:00:04 +08:00
你就别 MASQUERADE 了,这种已知的固定 IP 直接做 SNAT 呗,两头都做一下,伪装成 172.16.14.1 和 14.2 去通讯就好了。
PREROUTING 上加策略哦 |
45
lilogo OP @izoabr ztmjffzrix 这个上 zerotier 建的虚拟设备,我编辑的时候编辑错了,忽略几块,参考 #43 #31 A、B 两节点已经可以通讯了。
|
46
hawhaw 2020-02-11 23:17:26 +08:00 via Android
@lilogo 我的错误。在 A 和 B 上的路由指的是下一条(也就是对端 VPN 的地址)的地址,A 上应该指到 172.16.14.2 ; B 上应该指到 172.16.14.1
|
47
hawhaw 2020-02-11 23:19:59 +08:00 via Android
@lilogo 还有,这种情况我通常都是建议直接路由过去,所以:snat , masq 都不用做。一个配置起来简单,再一个,通讯双方能明确知道对端的真实 ip
|
48
weyou 2020-02-11 23:20:15 +08:00 via Android
@lilogo 不需要 MASQUERADE 啊。按照#31 正常就应该能访问 B 后面的机器了。B 端有没有加上 A 的路由啊,看看 ip route 的结果呢
|
50
hawhaw 2020-02-11 23:31:58 +08:00 via Android
@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:)
|
51
lilogo OP @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:~# ``` |
54
weyou 2020-02-11 23:43:36 +08:00 via Android
@lilogo 你的 tun0 接口是在 interface 页面创建的不?
在 Network > Interfaces > NETNAME ( tun0 接口) > Firewall Settings 设置中 ,创建新的防火墙区域 tinc。然后在 Network > Firewall > General Settings > Zones 设置中,编辑防火墙区域 tinc,使其能和防火墙区域 lan 相互转发。不然确实是访问不到子网的 |
55
pubby 2020-02-11 23:54:06 +08:00
@lilogo
你 A、B 上的 tun0 能互通,双方 route 也配了,但是两个网段不能互通,说明数据包到对方 tun0 为止了,没被转发 检查 tinc.conf 那个内核转发配置项有没有打开 如果还是不行,就在 A、B 上再建条 ipip、gre 之类的 tunnel 通道,这样肯定能支持路由的。 |
56
lilogo OP |
57
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 |
58
defunct9 2020-02-12 00:09:40 +08:00
开 ssh,让我上去看看
|
59
weyou 2020-02-12 00:11:57 +08:00 via Android
@lilogo 在 /etc/config/network 里添加的也是一样的,interface 页面会有个 tun0 接口
|
60
lilogo OP @weyou 嗯刚刚分别在两个路由器上面试了下,新建防火墙区域,然后到防火墙那个页面编辑把 tun 的区域打开,最右侧 Masquerading 选项勾选,保存应用,然后相互 ping 对方内网其他机器,还是不行 。
由于是手机操作的,不方便上传图片,明天再操作截图下。 谢谢~ |
62
izoabr 2020-02-12 00:38:31 +08:00
我还特别 FQ 上来才能看 v2,不知道贵州怎么回事,连 v2 都墙
|
64
lilogo OP 电脑已准备好,可以干了
|
66
weyou 2020-02-12 09:39:41 +08:00 via Android
@lilogo 防火墙区域那里不需要勾选右边的 Masquerading 啊,为什么一直对 Masquerading 念念不忘?
|
68
lilogo OP @izoabr 上一条自动发出去了,参考这里 https://blog.51cto.com/h2ofly/1544860,如果单独看涉及到的 iptables 规则的话,是否可以直接用?好像只有一条 POST 和一条 POST 加 FORWARD。
|
69
dreamage 2020-02-12 09:54:03 +08:00
NAT 要在 A 做
|
71
lilogo OP @pubby 两边添加路由后,A、B 两台主机( openwrt 路由器)可以相互访问对方 LAN 了,但是访问不到对方 LAN 局域网内的其他机器。
|
72
lilogo OP @weyou 现在两台 openwrt 路由器的防火墙 zone 已经把 Masquerading 去掉了,依然不行。
另外新增的 tun zone 区域配置 入站、出站、转发都是 ACCEPT。 |
74
lilogo OP @izoabr
A 上配置 iptables 规则: ``` iptables -t nat -A POSTROUTING -d 10.200.30.0/24 -j SNAT --to 172.16.14.2 ``` B 的 LAN IP 是 10.200.30.1 并配置 iptables 规则: ``` iptables -t nat -A POSTROUTING -s 172.16.14.2 -d 10.200.30.0/24 -j SNAT --to 10.200.30.1 ``` 以上这样是否可以? |
77
pubby 2020-02-12 10:54:28 +08:00 via Android
|
78
lilogo OP @pubby #73 在 B 节点上抓包如下:
``` root@OpenWrt:~# tcpdump -i tun0 icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes 02:42:10.615104 IP 172.16.14.1 > 10.200.30.67: ICMP echo request, id 26680, seq 304, length 64 02:42:10.615126 IP 172.16.14.2 > 172.16.14.1: ICMP 10.200.30.67 protocol 1 port 23369 unreachable, length 92 02:42:11.615535 IP 172.16.14.1 > 10.200.30.67: ICMP echo request, id 26680, seq 305, length 64 02:42:11.615563 IP 172.16.14.2 > 172.16.14.1: ICMP 10.200.30.67 protocol 1 port 15621 unreachable, length 92 02:42:12.615905 IP 172.16.14.1 > 10.200.30.67: ICMP echo request, id 26680, seq 306, length 64 02:42:12.615926 IP 172.16.14.2 > 172.16.14.1: ICMP 10.200.30.67 protocol 1 port 3009 unreachable, length 92 ``` 看起来上 B 节点( 10.200.30.1 )没有将包转发到 10.200.30.67 上去,而且抓 br-lan 设备的话也看不到 icmp 报文。 |
80
lilogo OP @weyou #75 #76
以下上 B 上的路由: ``` root@OpenWrt:~# ip route show default via 10.200.30.250 dev br-lan src 10.200.30.1 10.200.30.0/24 dev br-lan scope link src 10.200.30.1 192.168.1.0/24 dev tun0 scope link 172.16.14.0/24 dev tun0 scope link src 172.16.14.2 root@OpenWrt:~# ``` 以下分别上 tun 接口的防火墙配置和相应的 zone 配置: ![B-Interface-Tun.png]( https://i.loli.net/2020/02/12/plbLjDQCemMzPO1.png) ![B-Firewall-Zone.png]( https://i.loli.net/2020/02/12/nuRvDtrZUYbHAMi.png) |
82
weyou 2020-02-12 11:17:11 +08:00
@lilogo 点旁边的编辑 Inter-Zone Forwarding ->Allow forward to destination zones 以及 Allow forward from source zones 里要把 lan 给选上.
这里如果需要通过 vpn 访问对端的外网, 也需要将 wan 选上, 看你的情形是不需要. |
83
lilogo OP |
84
weyou 2020-02-12 11:20:50 +08:00
|
85
weyou 2020-02-12 11:25:05 +08:00
Forwarding 用默认 internal, 文档里都不建议修改这个值. 你修改它作甚.
|
86
lilogo OP @weyou #82 按你此步的方式,在 B 节点上编辑了 zone,此时可以在 B 节点的 br-lan 接口上看到 icmp 报文了,但是根据报文来看,应该上内网的主机( 10.200.30.67 )没给 B 节点( 10.200.30.1 )回报文:
``` root@OpenWrt:~# tcpdump -i br-lan icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on br-lan, link-type EN10MB (Ethernet), capture size 262144 bytes 03:24:17.434315 IP 172.16.15.1 > 10.200.30.67: ICMP echo request, id 54798, seq 50, length 64 03:24:18.434687 IP 172.16.15.1 > 10.200.30.67: ICMP echo request, id 54798, seq 51, length 64 03:24:19.434465 IP 172.16.15.1 > 10.200.30.67: ICMP echo request, id 54798, seq 52, length 64 03:24:20.434806 IP 172.16.15.1 > 10.200.30.67: ICMP echo request, id 54798, seq 53, length 64 ``` 忘记说了,B 节点并不是 B 网段默认网关,只是我临时弄的一台设备,想通过它来转发的,应该不影响的把? |
87
lilogo OP |
89
weyou 2020-02-12 11:35:10 +08:00
@lilogo 不是默认网关? 那当然是有关系的, B 同网段的设备收到 ping 后没有返程路由啊, 全都送到它自己的默认网关去了
|
90
lilogo OP @weyou 可以回 ping 的,A、B 节点现在都可以相互 ping 通对方的 LAN,但是 A ping B 路由后面的其他机器的话,只有 request 没有 reply。
|
91
weyou 2020-02-12 11:36:22 +08:00
你这种情况就要加 NAT 了. 但也是在 LAN 接口加, 不要加在 tinc 接口上
|
92
weyou 2020-02-12 11:40:06 +08:00
@lilogo 是啊, 因为 B 后面的机器默认网关不是 B 节点, 收到 ping 包后, 因为没有到 192.168.1.x 的路由, 会送到他们自己的默认网关去. 这时候你要在 B 设备上的 lan 接口做 NAT, 让所有 B 后面的机器以为包是 B 设备访问的, 包就可以送回 B 设备
|
93
weyou 2020-02-12 11:43:41 +08:00
在 B 节点加上这条试试: iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o br-lan -j MASQUERADE
|
94
weyou 2020-02-12 11:45:40 +08:00
需要 tinc 本身能访问, 还要对 tinc 的网段做 NAT: iptables -t nat -A POSTROUTING -s 172.16.14.0/24 -o br-lan -j MASQUERADE
|
95
lilogo OP @weyou 是的,所以这就是刚开始一直在 Masquerading 的原因了,唉。。。
我刚刚找了一台机器 C,把网关改成 B 节点,再通过 A 节点去 ping C 节点的话,可以 ping 通了。 那么针对不是默认网关的问题,NAT 如何配置了解没?#74 这种可以没? |
100
pubby 2020-02-12 11:52:50 +08:00
|