V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
bigbyto
V2EX  ›  程序员

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

  •  
  •   bigbyto ·
    xingty · 2022-08-22 17:25:17 +08:00 · 3915 次点击
    这是一个创建于 605 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    我先按照这个思路,做一次 SNAT ,再 FORWARD 。
    parametrix
        11
    parametrix  
       2022-08-22 20:12:48 +08:00   ❤️ 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
       2022-08-22 20:20:00 +08:00
    @parametrix 谢谢你的信息。

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

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

    iptables -A FORWARD -i tun1 -o tun0 -j ACCEPT
    kikitte
        19
    kikitte  
       2022-08-22 22:52:43 +08:00
    我觉得可以这样,
    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  
       2022-08-22 23:29:06 +08:00
    这个需求,本质上不就相当于双网卡服务器 /工控机做 Linux 软路由嘛。

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

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

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

    我在用的类似

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

    Linux 应该是一样的
    facelezz
        26
    facelezz  
       2022-08-23 17:08:35 +08:00
    如果只是单纯为了隔离的话 我上面那个方法不需要 openvpn ,而且你想要域名访问在 hosts 配常用的 IP 关系就可以
    linuxyz
        27
    linuxyz  
       2022-08-23 18:54:09 +08:00
    @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
       2022-08-23 19:54:05 +08:00
    谢谢各位提供的信息,我结合你们提供的信息继续研究一下如何处理。
    qweaszxcdf
        29
    qweaszxcdf  
       2022-10-10 05:56:29 +08:00
    @bigbyto OP 有搞定这个问题么
    bigbyto
        30
    bigbyto  
    OP
       2022-10-10 10:26:01 +08:00
    @qweaszxcdf 很早就搞定啦,有计划写文章彻底介绍网络数据流量和 iptables 的工作工程,不过事情比较多,一直在拖延😂。
    有几个点你可以参考一下:
    1. openvpn 可能会增加自己的 iptables 规则,只有自己的 ip 段才会做 SNAT ,这个你可以检查你的 nat 表规则
    2. 做 DNS 转发时需要启用 loopback 的转发
    3. 做 SNAT ,就如同上面朋友所说的,SNAT 可以用 masquerade ,或者直接 snat 到 easyconnect 网卡那个 ip 地址

    调试的时候用 tcpdump 看一下 ip 的报文流向可以比较清晰的看到问题所在。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5239 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 09:17 · PVG 17:17 · LAX 02:17 · JFK 05:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.