V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lilogo
V2EX  ›  宽带症候群

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

  •  
  •   lilogo · 2020-02-11 14:32:07 +08:00 · 8136 次点击
    这是一个创建于 1507 天前的主题,其中的信息可能已经有所发展或是发生改变。

    各位,基于 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 节点网络内的主机。 不知道是哪里出了问题。。。

    117 条回复    2022-02-24 15:08:09 +08:00
    1  2  
    jasonyang9
        1
    jasonyang9  
       2020-02-11 14:39:14 +08:00
    听上去是 因为没有从 B 到 A 的路由 导致 ping 的 echo-reply 数据包无法回到 A 网络
    lilogo
        2
    lilogo  
    OP
       2020-02-11 15:18:51 +08:00
    @jasonyang9 应该不是这个原因,理论上 B 收到的包应该是来自 172.16.14.1 的,而不是 192.168.1.1 的,而 172 网段的是 VPN 网段,本身即可正常通信。
    lilogo
        3
    lilogo  
    OP
       2020-02-11 15:34:57 +08:00
    在 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
    ```
    izoabr
        4
    izoabr  
       2020-02-11 15:42:46 +08:00
    你去 B 上加上那条路由试试不就知道了。
    还有要把包转发打开哦。
    lilogo
        5
    lilogo  
    OP
       2020-02-11 15:42:59 +08:00
    补充下所有主机都是可 ping 的,而且直接在 A、B 节点上 ping 172.16.14.0/24 网段内机器都是可以 ping 通的。
    另外 tcpdump 抓虚拟网卡的命令是 tcpdump -i tun0
    lilogo
        6
    lilogo  
    OP
       2020-02-11 15:50:30 +08:00
    @izoabr
    @jasonyang9 在 B 上加上了到 A 的路由依然不行:

    ```
    ip route add 192.168.1.0/24 via 172.16.14.1
    ```
    izoabr
        7
    izoabr  
       2020-02-11 15:53:13 +08:00
    A 和 B 的路由表和策略表放出来看看

    ip ro sh
    ip ru sh
    lilogo
        8
    lilogo  
    OP
       2020-02-11 16:05:05 +08:00
    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
    lilogo
        9
    lilogo  
    OP
       2020-02-11 16:10:17 +08:00
    抱歉上一条有一行错了,参考这个:
    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
    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 的结果
    lilogo
        11
    lilogo  
    OP
       2020-02-11 17:30:12 +08:00
    @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:~#
    ```
    sujin190
        12
    sujin190  
       2020-02-11 17:55:03 +08:00
    sysctl 的 ip_forward 打开了没啊?
    hawhaw
        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 网段数据包的转发
    lilogo
        14
    lilogo  
    OP
       2020-02-11 19:07:23 +08:00 via Android
    @sujin190 打开转发是第一步,肯定开了
    izoabr
        15
    izoabr  
       2020-02-11 19:45:22 +08:00
    @lilogo #11 从 10.200.30.55 ping 和 trace 172.16.14.1
    lilogo
        16
    lilogo  
    OP
       2020-02-11 19:48:34 +08:00
    @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
    ```
    lilogo
        17
    lilogo  
    OP
       2020-02-11 19:51:53 +08:00
    @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 设备有关系?
    lilogo
        18
    lilogo  
    OP
       2020-02-11 19:58:53 +08:00
    @hawhaw @izoabr 是不是除了路由的部分还需要配置 iptables 的 MASQUERADE ?
    weyou
        19
    weyou  
       2020-02-11 20:32:26 +08:00 via Android
    iptables -t nat -A POSTROUTING -o br-lan -j MASQUERADE 这条 rule 的目的是什么,感觉不需要啊
    lilogo
        20
    lilogo  
    OP
       2020-02-11 20:49:33 +08:00
    @weyou 我加的是这个,出口设备 tun0:
    ```
    iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
    ```
    即使换成 br-lan 也不行
    weyou
        21
    weyou  
       2020-02-11 21:38:11 +08:00 via Android
    @lilogo 这条也不需要啊,访问对方局域网直接走路由就行了,不一定要做 NAT。
    lilogo
        22
    lilogo  
    OP
       2020-02-11 21:42:30 +08:00 via Android
    @weyou 两个网络是在不同的局域网的,分属不同的公网也不需要 nat 吗?
    pubby
        23
    pubby  
       2020-02-11 21:50:32 +08:00 via Android
    vpn 接口上不需要 nat
    a,b 都加对方网段的 route 就行了
    a、b 既然都是路由器,ip forward 应该已经打开了
    pubby
        24
    pubby  
       2020-02-11 21:52:42 +08:00 via Android
    这两天折腾双方都是 nat 下的 l2tp/ipsec 服务快疯了
    weyou
        25
    weyou  
       2020-02-11 21:58:31 +08:00 via Android
    @lilogo 不需要,只要 hosts 文件里路由设置正确,还有各自添加好对方网络的路由即可。

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

    这三步就应该 OK 了啊。。。
    izoabr
        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 过滤掉了而已。
    lilogo
        28
    lilogo  
    OP
       2020-02-11 22:03:53 +08:00
    @weyou tinc 网络都已经好了。hosts 文件里路由?是指 tinc 的路由吗?我没有在 hosts 文件里面设置路由,就是 tinc-up 后台 tinc-down 文件里面设置了 ip,路由的话是我命令行手工添加的。
    izoabr
        29
    izoabr  
       2020-02-11 22:04:52 +08:00
    另外在 B 上执行 ip ro get 10.200.30.55 from 192.168.1.1 这个,可以看到路由策略是否正确。
    lilogo
        30
    lilogo  
    OP
       2020-02-11 22:08:42 +08:00
    @izoabr 应该不会过滤 icmp 吧,我单纯的 ping vpn 网段和内网的网段的话都是可以响应的
    weyou
        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 的信息
    lilogo
        32
    lilogo  
    OP
       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
        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 即可
    weyou
        34
    weyou  
       2020-02-11 22:26:46 +08:00 via Android
    @lilogo 当封包转给 tun0,tinc 会根据 host 文件里声明的 subnet 来决定将这个封包转给哪一个 tinc 节点
    izoabr
        35
    izoabr  
       2020-02-11 22:31:22 +08:00
    @lilogo #32 对端的 VPN IP,可以顺便加一个 dev tun0
    pubby
        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 的设备)
    izoabr
        37
    izoabr  
       2020-02-11 22:35:17 +08:00
    @pubby #36 赞同。
    我以上的回答和协助都是基于策略路由+GRE Tunnel 的经验
    sujin190
        38
    sujin190  
       2020-02-11 22:38:19 +08:00
    我看你上面 @lilogo #11 说 A 上 traceroute B 10.200.30.55 都通了啊,怎么又 ping 不通了,这怎么可能。。
    lilogo
        39
    lilogo  
    OP
       2020-02-11 22:44:31 +08:00
    @sujin190 #11 并没有通啊
    izoabr
        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.
    izoabr
        41
    izoabr  
       2020-02-11 22:45:32 +08:00
    ifconfig -a 看看
    别是 tun0 的 MTU 有问题吧
    izoabr
        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 是个啥?
    lilogo
        43
    lilogo  
    OP
       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
        44
    izoabr  
       2020-02-11 23:00:04 +08:00
    你就别 MASQUERADE 了,这种已知的固定 IP 直接做 SNAT 呗,两头都做一下,伪装成 172.16.14.1 和 14.2 去通讯就好了。
    PREROUTING 上加策略哦
    lilogo
        45
    lilogo  
    OP
       2020-02-11 23:07:17 +08:00
    @izoabr ztmjffzrix 这个上 zerotier 建的虚拟设备,我编辑的时候编辑错了,忽略几块,参考 #43 #31 A、B 两节点已经可以通讯了。
    hawhaw
        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
    hawhaw
        47
    hawhaw  
       2020-02-11 23:19:59 +08:00 via Android
    @lilogo 还有,这种情况我通常都是建议直接路由过去,所以:snat , masq 都不用做。一个配置起来简单,再一个,通讯双方能明确知道对端的真实 ip
    weyou
        48
    weyou  
       2020-02-11 23:20:15 +08:00 via Android
    @lilogo 不需要 MASQUERADE 啊。按照#31 正常就应该能访问 B 后面的机器了。B 端有没有加上 A 的路由啊,看看 ip route 的结果呢
    weyou
        49
    weyou  
       2020-02-11 23:30:49 +08:00 via Android
    @lilogo 看起来你是 openwrt 啊,需要配置下 openwrt 的防火墙
    hawhaw
        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:)
    lilogo
        51
    lilogo  
    OP
       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
        52
    lilogo  
    OP
       2020-02-11 23:35:54 +08:00
    @weyou openwrt 的防火墙要配置什么呢?
    lilogo
        53
    lilogo  
    OP
       2020-02-11 23:38:12 +08:00
    @hawhaw 感觉越来越高明的样子,不是学网络的,看不懂哈。。。如果大佬有时间能否多讲解一二呢。
    weyou
        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 相互转发。不然确实是访问不到子网的
    pubby
        55
    pubby  
       2020-02-11 23:54:06 +08:00
    @lilogo
    你 A、B 上的 tun0 能互通,双方 route 也配了,但是两个网段不能互通,说明数据包到对方 tun0 为止了,没被转发

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

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

    @weyou 不是页面创建的,直接编辑 /etc/config 下的文件创建的。
    ericww
        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
    defunct9
        58
    defunct9  
       2020-02-12 00:09:40 +08:00
    开 ssh,让我上去看看
    weyou
        59
    weyou  
       2020-02-12 00:11:57 +08:00 via Android
    @lilogo 在 /etc/config/network 里添加的也是一样的,interface 页面会有个 tun0 接口
    lilogo
        60
    lilogo  
    OP
       2020-02-12 00:33:28 +08:00 via Android
    @weyou 嗯刚刚分别在两个路由器上面试了下,新建防火墙区域,然后到防火墙那个页面编辑把 tun 的区域打开,最右侧 Masquerading 选项勾选,保存应用,然后相互 ping 对方内网其他机器,还是不行 。
    由于是手机操作的,不方便上传图片,明天再操作截图下。
    谢谢~
    izoabr
        61
    izoabr  
       2020-02-12 00:34:59 +08:00
    @defunct9 #58 哈哈,我也有这种想法,給我急的,结果 LZ 还被媳妇薅走了
    izoabr
        62
    izoabr  
       2020-02-12 00:38:31 +08:00
    我还特别 FQ 上来才能看 v2,不知道贵州怎么回事,连 v2 都墙
    lilogo
        63
    lilogo  
    OP
       2020-02-12 00:44:18 +08:00 via Android
    @izoabr 大佬要是有时间,我再下去拿个笔记本去,毕竟大佬的时间难得,哈哈
    lilogo
        64
    lilogo  
    OP
       2020-02-12 00:49:32 +08:00 via Android
    电脑已准备好,可以干了
    izoabr
        65
    izoabr  
       2020-02-12 01:26:27 +08:00
    @lilogo #64 别闹了,陪媳妇去吧,,明天的哦。
    我发现我手机不连 WIFI 可以上 v2
    weyou
        66
    weyou  
       2020-02-12 09:39:41 +08:00 via Android
    @lilogo 防火墙区域那里不需要勾选右边的 Masquerading 啊,为什么一直对 Masquerading 念念不忘?
    lilogo
        67
    lilogo  
    OP
       2020-02-12 09:49:50 +08:00 via Android
    @izoabr 参考这里
    lilogo
        68
    lilogo  
    OP
       2020-02-12 09:52:15 +08:00 via Android
    @izoabr 上一条自动发出去了,参考这里 https://blog.51cto.com/h2ofly/1544860,如果单独看涉及到的 iptables 规则的话,是否可以直接用?好像只有一条 POST 和一条 POST 加 FORWARD。
    dreamage
        69
    dreamage  
       2020-02-12 09:54:03 +08:00
    NAT 要在 A 做
    pubby
        70
    pubby  
       2020-02-12 10:09:34 +08:00 via Android
    @lilogo #68 不需要 nat,你两边有路由表,数据包能正确往返的
    lilogo
        71
    lilogo  
    OP
       2020-02-12 10:21:59 +08:00
    @pubby 两边添加路由后,A、B 两台主机( openwrt 路由器)可以相互访问对方 LAN 了,但是访问不到对方 LAN 局域网内的其他机器。
    lilogo
        72
    lilogo  
    OP
       2020-02-12 10:23:45 +08:00
    @weyou 现在两台 openwrt 路由器的防火墙 zone 已经把 Masquerading 去掉了,依然不行。
    另外新增的 tun zone 区域配置 入站、出站、转发都是 ACCEPT。
    pubby
        73
    pubby  
       2020-02-12 10:30:50 +08:00 via Android
    @lilogo #71 那就在对方路由器 lan 出口上抓包看看
    lilogo
        74
    lilogo  
    OP
       2020-02-12 10:35:51 +08:00
    @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
    ```

    以上这样是否可以?
    weyou
        75
    weyou  
       2020-02-12 10:50:14 +08:00 via Android
    @lilogo 贴出 B 上的路由,firewall zone 的配置
    weyou
        76
    weyou  
       2020-02-12 10:52:36 +08:00 via Android
    @lilogo 不需要 NAT,不需要 NAT,不需要 NAT,重要的事情说三遍。
    pubby
        77
    pubby  
       2020-02-12 10:54:28 +08:00 via Android
    @lilogo #74 如果内网机器的默认网关就是 a,b,那你做这些 nat 干啥呢?

    特殊情况才需要 nat,目的是让你处于对方路由范围内
    lilogo
        78
    lilogo  
    OP
       2020-02-12 10:55:06 +08:00
    @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 报文。
    pubby
        79
    pubby  
       2020-02-12 11:01:46 +08:00 via Android
    @lilogo #78 tinc.conf 的那个 Forwarding 怎么配置的?
    lilogo
        80
    lilogo  
    OP
       2020-02-12 11:02:54 +08:00
    @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)
    weyou
        81
    weyou  
       2020-02-12 11:13:06 +08:00
    @lilogo zone 配置不对, 蓝色的 tun(最底部的)应该和绿色的 lan 相互转发, 你现在是 reject
    weyou
        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 选上, 看你的情形是不需要.
    lilogo
        83
    lilogo  
    OP
       2020-02-12 11:18:02 +08:00
    @pubby #36 #79 A、B 两个节点的 tinc.conf 都添加的:
    ```
    DirectOnly = no
    Forwarding = kernel
    ```
    weyou
        84
    weyou  
       2020-02-12 11:20:50 +08:00
    @lilogo DirectOnly = no
    Forwarding = kernel
    不需要配置在 tinc.conf 里, 默认就好了
    weyou
        85
    weyou  
       2020-02-12 11:25:05 +08:00
    Forwarding 用默认 internal, 文档里都不建议修改这个值. 你修改它作甚.
    lilogo
        86
    lilogo  
    OP
       2020-02-12 11:27:54 +08:00
    @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 网段默认网关,只是我临时弄的一台设备,想通过它来转发的,应该不影响的把?
    lilogo
        87
    lilogo  
    OP
       2020-02-12 11:29:27 +08:00
    @weyou
    @pubby #36 #79 #84 确实,我发现加上这两个配置的话好像会有一点点小问题。。。
    问题等网络打通了我再来仔细排查看看。
    weyou
        88
    weyou  
       2020-02-12 11:32:17 +08:00
    @lilogo 你先确认这台设备能够回 ping, 可以的话在这台设备上抓包
    weyou
        89
    weyou  
       2020-02-12 11:35:10 +08:00
    @lilogo 不是默认网关? 那当然是有关系的, B 同网段的设备收到 ping 后没有返程路由啊, 全都送到它自己的默认网关去了
    lilogo
        90
    lilogo  
    OP
       2020-02-12 11:35:54 +08:00
    @weyou 可以回 ping 的,A、B 节点现在都可以相互 ping 通对方的 LAN,但是 A ping B 路由后面的其他机器的话,只有 request 没有 reply。
    weyou
        91
    weyou  
       2020-02-12 11:36:22 +08:00
    你这种情况就要加 NAT 了. 但也是在 LAN 接口加, 不要加在 tinc 接口上
    weyou
        92
    weyou  
       2020-02-12 11:40:06 +08:00
    @lilogo 是啊, 因为 B 后面的机器默认网关不是 B 节点, 收到 ping 包后, 因为没有到 192.168.1.x 的路由, 会送到他们自己的默认网关去. 这时候你要在 B 设备上的 lan 接口做 NAT, 让所有 B 后面的机器以为包是 B 设备访问的, 包就可以送回 B 设备
    weyou
        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
    weyou
        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
    lilogo
        95
    lilogo  
    OP
       2020-02-12 11:45:41 +08:00
    @weyou 是的,所以这就是刚开始一直在 Masquerading 的原因了,唉。。。
    我刚刚找了一台机器 C,把网关改成 B 节点,再通过 A 节点去 ping C 节点的话,可以 ping 通了。

    那么针对不是默认网关的问题,NAT 如何配置了解没?#74 这种可以没?
    weyou
        96
    weyou  
       2020-02-12 11:47:00 +08:00
    @lilogo 你如果一开始将网络拓扑说清楚, 就不会有这么多事了. tinc 的配置其实很简单.
    lilogo
        97
    lilogo  
    OP
       2020-02-12 11:47:38 +08:00
    @weyou #94 这个也是在 B 节点上加没?
    weyou
        98
    weyou  
       2020-02-12 11:48:24 +08:00
    @lilogo 对的
    lilogo
        99
    lilogo  
    OP
       2020-02-12 11:49:39 +08:00
    @weyou 是的,这也是帮别人调试问题的难点所在,有一些基础信息不对称导致徒有屠龙技巧,奈何施展不上。呵呵~
    pubby
        100
    pubby  
       2020-02-12 11:52:50 +08:00
    -_- 不是默认网关。。。。

    @weyou
    @lilogo
    #93
    在 B 节点加上这条试试: 
    iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o br-lan -j MASQUERADE

    再加一条(因为你在 A 上 ping )
    iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -o br-lan -j MASQUERADE
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3356 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 00:42 · PVG 08:42 · LAX 17:42 · JFK 20:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.