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

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

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

    各位,基于 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  
    pubby
        101
    pubby  
       2020-02-12 11:57:09 +08:00
    @lilogo

    tinc.conf 中
    Forwarding = kernel 应该是要加的

    不加这个,收到的包直接被当成 tinc 虚拟组网来转发的,不会放回本地设备

    https://github.com/gsliepen/tinc/blob/master/src/route.c#L1110

    ```c
    void route(node_t *source, vpn_packet_t *packet) {
    if(forwarding_mode == FMODE_KERNEL && source != myself) {
    send_packet(myself, packet);
    return;
    }

    ```
    0gys
        102
    0gys  
       2020-02-12 11:58:35 +08:00 via iPhone
    这种 vpn 我做过。但我只需要一条 vpn 连线即可。为什么你要做两条连线? vpn 连线后有个本地地址和远程地址,最好把这两个地址固定起来。然后以指定路由的形式两边添加好路由表,双方即可互访。
    lilogo
        103
    lilogo  
    OP
       2020-02-12 12:02:24 +08:00
    @weyou
    @pubby #93 #94 #100 按照这样的配置已经可以从 A 上 ping 通 B 路由器后面的其他主机了。
    现在就是从 A 节点后面的机器 ping B 和 B 后面的机器还是 ping 不通,针对 A 局域网而言,A 上默认网关了,是否还需要在 A 上加上 NAT 呢?已经在 A 上配置过 tun zone 的 forward 了。
    lilogo
        104
    lilogo  
    OP
       2020-02-12 12:05:07 +08:00
    @0gys 对网络这块不是很熟,当初配置 tinc 就是想打通多个 LAN 内主机的访问问题,后来才遇到要访问对端局域网内没有安装 tinc 节点的主机问题。
    lilogo
        105
    lilogo  
    OP
       2020-02-12 12:10:20 +08:00
    @pubby Forwarding = kernel 我没有单独试过,是和那个 DirectOnly = no 一起加的,现在是 A、B 两个节点都注释了,但是可以正常 ping 通的
    @weyou 而且我在 B 节点把 B 到 A 的路由删掉了,A 节点 ping B 以及 B 局域网的其他主机仍然可以 ping 通,应该是后来加的两条 iptables 规则的作用?
    pubby
        106
    pubby  
       2020-02-12 12:10:50 +08:00
    @lilogo A 上先不要 nat,依次抓包看情况,看数据包传递到哪一步
    a lan 抓包
    a vpn tun0 抓包
    b vpn tun0 抓包
    b lan 抓包
    0gys
        107
    0gys  
       2020-02-12 12:14:46 +08:00 via iPhone
    @lilogo 其实你不用安装 tinc 你直接在路由器上设置即可。只要两端路由器建立连线。设置好路由即可互访。你这样增加了复杂度
    0gys
        108
    0gys  
       2020-02-12 12:17:13 +08:00 via iPhone
    可以的话你加我 qq351119794 我是做这个的
    lilogo
        109
    lilogo  
    OP
       2020-02-12 12:18:31 +08:00 via Android
    两地的网络,没有物理连线,而且一端没有操作公网路由
    @0gys
    weyou
        110
    weyou  
       2020-02-12 12:31:35 +08:00
    @lilogo 那条到 192.168.1.x 的路由还是要的, 之所以你删掉还是可以通, 是因为你是从 tinc 的 ip 地址 ping 出去的. 如果你从 A 后面的机器来 ping B 后面的机器, 这条路由就起作用了. 你现在 ping 不通, 贴上 A 上面的路由表看看. A 的 firewall zone 要和 B 同样的设置.
    dreamage
        111
    dreamage  
       2020-02-12 12:31:54 +08:00
    没用过 tinc,但是以网络角度来说需要做以下配置

    A 端:
    加路由 10.200.30.0/24 到 172.16.14.2
    做 NAT tun 接口 转换 192.168.1.1/24 为 172.16.14.1
    iptables tun 接口 入向放行 172.16.14.2 到 172.16.14.1

    B 端:
    B 设备 iptables tun 接口 入向放行 172.16.14.1 到 10.200.30.0/24
    B 网关 做 172.16.14.1/32 路由 到 10.200.30.1
    lilogo
        112
    lilogo  
    OP
       2020-02-12 12:46:09 +08:00
    @weyou #110 确实,在 A 上配置和 B 一样的 tun zone 规则并应用,然后在 B 上加上回到 A 的路由,此时从 A 网络内的其他主机再 ping B 网络内的所有机器都可以 ping 通了,感谢!
    另外,这里是否因为 A 上网关所以不需要配置 NAT,如果像 B 一样不上默认网关应该就需要配置 NAT 了把?
    weyou
        113
    weyou  
       2020-02-12 12:51:06 +08:00
    @lilogo 对的, 如果 A 是默认网关, 自然不需要 NAT, A 后面的机器返回的包都会被 A 接收然后再路由.
    izoabr
        114
    izoabr  
       2020-02-12 13:07:59 +08:00   ❤️ 1
    你这个不是默认网关也不早说,折腾一大溜。

    那这样的话问题就简单了。
    1、A 上做路由,去往 10.200.30.0/24 的 via 172.16.14.2 dev tun0
    B 上做路由,去往 192.168.1.0/24 的 via 172.16.14.1 dev tun0
    2、B 上做 NAT,来自 192.168.1.0/24,去往 10.200.30.0/24 的,SNAT 为 10.200.30.1
    3、防火墙策略先清掉,并设置默认 ACCEPT 再做这些,以防有干扰。
    augustpluscn
        115
    augustpluscn  
       2020-02-12 14:54:24 +08:00 via Android
    Zerotier 不香吗。。。
    lilogo
        116
    lilogo  
    OP
       2020-02-12 14:56:35 +08:00 via Android
    @augustpluscn zerotier 只能解决连接性的问题,速度不太理想,即使自建 mon 的话还是受限服务端带宽
    275761919
        117
    275761919  
       2022-02-24 15:08:09 +08:00
    找到一个简单的方法没,zerotier 这个功能操作起来就很方便,但在我这个打洞成功率不高,只能用 tinc
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3312 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 11:49 · PVG 19:49 · LAX 04:49 · JFK 07:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.