• 请不要在回答技术问题时复制粘贴 AI 生成的内容
bigbyto
V2EX  ›  程序员

iptables 能否转发一个 tun 的流量到另一个 tun

  •  
  •   bigbyto ·
    xingty · Aug 22, 2022 · 5075 views
    This topic created in 1385 days ago, the information mentioned may be changed or developed.

    最近需要用到 easyconnect 这个 vpn ,因为是深信服的,因此想在一个独立的环境对它隔离,但又想实现全局的功能,因此想用 openvpn 实现转发。

    我看了 easyconnect 也是使用 tun 模式的,加上 openvpn 目前有 2 个 tun 。理论上使用 iptables 应该是可以转发 openvpn 的流量,我尝试过下面的指令,并不能起作用。

    openvpn: tun0
    easyconnect: tun1

    iptables -A FORWARD -i tun0 -o tun1 -j ACCEPT
    

    iptables 的文档还是比较多的,看的比较头大,对 iptables 这块不是很熟悉,希望懂得朋友帮帮忙,或者给一些思路我去查文档,非常感谢。

    30 replies    2022-10-10 10:26:01 +08:00
    lizenghui
        1
    lizenghui  
       Aug 22, 2022
    我怎么感觉应该在路由表上搞啊。
    yingqiuQAQ
        2
    yingqiuQAQ  
       Aug 22, 2022
    我猜你是想要用 dnat 功能? 在 PREROUTING 链设置试下?
    bigbyto
        3
    bigbyto  
    OP
       Aug 22, 2022
    @lizenghui 应该不是路由表。easyconnect 一旦连接成功服务端会推一个路由过来更新本地路由,比如 192.168.30.3 路由到 tun1 。但我在 openvpn client 那边连接后,无法 ping 通 192.168.30.3
    bigbyto
        4
    bigbyto  
    OP
       Aug 22, 2022
    @yingqiuQAQ 我想实现的功能是本机直连 openvpn ,但能访问到 easyconnect 那边的内网环境,这功能应该不是 dnat 吧?
    linuxyz
        5
    linuxyz  
       Aug 22, 2022
    信息太少,凭感觉:
    1 ,需要 SNAT 来隐藏来自 OpenVPN 的源 IP, 否则 EasyConnect 那边无路由
    2 ,需要 OpenVPN 接入端加 route, 这样才能让,IP 通过 OpenVPN
    2, 需要服务端加路由, 不过这个大概率 EasyConnect 和 OpenVPN 在连接建立后都会自动加上
    bigbyto
        6
    bigbyto  
    OP
       Aug 22, 2022
    @linuxyz 感谢!

    我这边的 OpenVPN 接入端设置了全局,这个问题不大; 服务端的路由如你所说,OpenVPN 和 EasyConnect 这两个在建立连接是就已经更新了本地路由表。

    关于你提到的第一点不太理解,为什么要隐藏 OpenVPN 的源 IP EasyConnect 才能正常路由?
    joshu
        7
    joshu  
       Aug 22, 2022
    @bigbyto 因为 easyconnect 对端的所有机器都没有到 openvpn 地址段的路由,它们不知道应该怎么把包回给你
    或者 easyconnect 那边做了防火墙,可能会把你这个包直接在对端入口丢掉
    rev1si0n
        8
    rev1si0n  
       Aug 22, 2022
    客户端路由 easyconnect 的网段到客户端的 ovpn tun 接口,如果只是需要 ping 通 tun1 的话,应该不需要别的配置了,如果是要 tun1 全段 ping ,服务器上应该也要路由一下,应该不用 iptables
    rev1si0n
        9
    rev1si0n  
       Aug 22, 2022
    @rev1si0n 哦看错了,忽略回答
    bigbyto
        10
    bigbyto  
    OP
       Aug 22, 2022
    @joshu 理解了,谢谢。

    我先按照这个思路,做一次 SNAT ,再 FORWARD 。
    parametrix
        11
    parametrix  
       Aug 22, 2022   ❤️ 1
    你这个指令只是允许从 tun0 到 tun1 的转发,本身并不是转发规则,转发要在 nat 表里写清楚。我没有看明白你的需求,你是希望所有到 tun0 的访问映射到 tun1 么?如果是这样那么:

    iptables -t nat -A PREROUTING -i tun0 -d yyy.yyy.yyy.yyy(tun0 ip) -j DNAT --to-destination xxx.xxx.xxx.xxx(tun1 ip)
    iptables -t nat -A POSTROUTING -o tun1 -j MASQUERADE

    如果是希望所有经过 tun0 的访问回程路由是 tun1 ,那么需要在 magle 表上给包 ---set-mark 然后新建路由表设置 tun1 为 default gateway 。
    bigbyto
        12
    bigbyto  
    OP
       Aug 22, 2022
    @parametrix 谢谢你的信息。

    我的需求就是想在服务器装 openvpn 和 easyconnnect ,但我本地是通过 openvpn 连接到服务器,也能跟 easyconnect 的网段进行通信。
    zhangsanfeng2012
        13
    zhangsanfeng2012  
       Aug 22, 2022 via Android
    iptables -t nat -I POSTROUTING -o tun1 -j MASQUERADE
    goodbest
        14
    goodbest  
       Aug 22, 2022 via iPhone
    目测伪需求?

    有人研出了在容器里跑的 easyconnect ,可能更符合你的需求
    bigbyto
        15
    bigbyto  
    OP
       Aug 22, 2022
    @goodbest easyconnect 的情况要比想象的麻烦许多,单纯用来访问 git 之类的 socks5 是足够了。但对于 JDBC 或者不走系统代理的程序而言,无法配置。 还有就是它自带了个 DNS 解析,域名必须通过它才能解析,对于一些不走代理的,直接通过系统 DNS 无法获得正确的解析结果。
    bigbyto
        16
    bigbyto  
    OP
       Aug 22, 2022
    @zhangsanfeng2012 谢谢,这条我有试过,ping 不通,有时间用 tcpdump 看看有没有到 tun1...
    yanyumihuang
        17
    yanyumihuang  
       Aug 22, 2022 via Android
    用 clash 的 tun 模式,DNS 你抓包不就能抓出来 IP 和端口号了。然后用 docker 开一个 socks5 ,用在 clash 里配好 DNS 和 socks5 不就完结了,搞什么 tun 到 tun 。
    parametrix
        18
    parametrix  
       Aug 22, 2022
    @bigbyto 那你可能还得加一条

    iptables -A FORWARD -i tun1 -o tun0 -j ACCEPT
    kikitte
        19
    kikitte  
       Aug 22, 2022
    我觉得可以这样,
    1. tun0 接口将要发送的 IP 数据报的源 IP 修改为 tun0 接口的 ip
    2. 添加路由表将指定网段的 IP 数据报由 tun1 接口处理
    代码为:
    1. iptables -t nat -I POSTROUTING -o tun0 -j MASQUERADE
    2. ip route add xxx.xxx.xxx.xxx/xx dev tun1
    设想一个数据包的流动大概为:tun0 接收到一个 IP 数据报,查路由表得到该数据报将由 tun1 接口处理,在 POSTROUTING 阶段将该数据报的源 IP 改为 tun0 接口的 ip 以便 tun1 接收到的数据能返回 tun0 ,tun1 接口识别得到目标 IP 为内网网段就直接转发到其它主机处理了。
    cnbatch
        20
    cnbatch  
       Aug 22, 2022
    这个需求,本质上不就相当于双网卡服务器 /工控机做 Linux 软路由嘛。

    对于 Linux 软路由而言,一般是 eth0 ↔ NAT ↔ eth1 ,其实就跟 tun0 ↔ NAT ↔ tun1 没什么本质区别。

    把双网卡软路由的 NAT 方式(资料一搜一大堆,抄下来改改就行)套用到这个 tun0 和 tun1 就可以了。

    如果不想手写 iptables 这么麻烦,甚至还可以安装个 OpenWRT 用来运行 easyconnect ,然后用 OpenWRT 自带的图形界面去配置 NAT 方向,应该会直观很多
    realpg
        21
    realpg  
    PRO
       Aug 22, 2022
    先深入学习一下路由的知识
    如果不涉及本机是 nat 服务器, iproute2 就完事了
    搞啥性能低下的 iptables
    julyclyde
        22
    julyclyde  
       Aug 23, 2022
    首先,iptables 不负责转发
    chenjiangui998
        23
    chenjiangui998  
       Aug 23, 2022
    我是用虚拟机跑 vpn + clash, 然后在端口转发 clash 给宿主机
    0bing
        24
    0bing  
       Aug 23, 2022
    iptables 性能低下???这是喷处理器还是喷内核
    facelezz
        25
    facelezz  
       Aug 23, 2022
    楼主是想要把 openvpn 的虚拟网卡的流量全都从 easyconnect 的网卡出去吧。

    我在用的类似

    分享下目前在用的办法,有需要的可以参考:
    宿主机装个 windows 虚拟机,然后在虚拟机内 把 easyconnect 的虚拟网卡网络共享( windows 的 ICS 功能)到 Host-only 的网卡,在宿主机上 router 配置 网段到 Host-only 网卡就行了,我目前就这样在用(隔离公司的 easyconnect )

    Linux 应该是一样的
    facelezz
        26
    facelezz  
       Aug 23, 2022
    如果只是单纯为了隔离的话 我上面那个方法不需要 openvpn ,而且你想要域名访问在 hosts 配常用的 IP 关系就可以
    linuxyz
        27
    linuxyz  
       Aug 23, 2022
    @joshu 正解

    假设:
    - EasyConnect 对端的 net: 10.0.0.0/8, I/F: tun1
    - OpenVPN 对端 net: 192.168.100.0/24, I/F: tun0

    转接的服务器上可以配:
    iptables -t nat -I POSTROUTING -o tun1 -j SNAT --to-source ${tun1_IP}

    这里用 MASQUERADE 替换 SNAT 效果是一样的, MASQ 可以自己获得需要转的 tun1 的 IP 地址
    bigbyto
        28
    bigbyto  
    OP
       Aug 23, 2022
    谢谢各位提供的信息,我结合你们提供的信息继续研究一下如何处理。
    qweaszxcdf
        29
    qweaszxcdf  
       Oct 10, 2022
    @bigbyto OP 有搞定这个问题么
    bigbyto
        30
    bigbyto  
    OP
       Oct 10, 2022
    @qweaszxcdf 很早就搞定啦,有计划写文章彻底介绍网络数据流量和 iptables 的工作工程,不过事情比较多,一直在拖延😂。
    有几个点你可以参考一下:
    1. openvpn 可能会增加自己的 iptables 规则,只有自己的 ip 段才会做 SNAT ,这个你可以检查你的 nat 表规则
    2. 做 DNS 转发时需要启用 loopback 的转发
    3. 做 SNAT ,就如同上面朋友所说的,SNAT 可以用 masquerade ,或者直接 snat 到 easyconnect 网卡那个 ip 地址

    调试的时候用 tcpdump 看一下 ip 的报文流向可以比较清晰的看到问题所在。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1611 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 62ms · UTC 16:16 · PVG 00:16 · LAX 09:16 · JFK 12:16
    ♥ Do have faith in what you're doing.