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

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

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

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

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

    我先按照这个思路,做一次 SNAT ,再 FORWARD 。
    parametrix
    parametrix
    Aug 22, 2022❤️1
    11
    你这个指令只是允许从 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
    bigbyto
    OP
    Aug 22, 2022
    12
    @parametrix 谢谢你的信息。

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

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

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

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

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

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

    我在用的类似

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

    Linux 应该是一样的
    facelezz
    facelezz
    Aug 23, 2022
    26
    如果只是单纯为了隔离的话 我上面那个方法不需要 openvpn ,而且你想要域名访问在 hosts 配常用的 IP 关系就可以
    linuxyz
    linuxyz
    Aug 23, 2022
    27
    @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
    bigbyto
    OP
    Aug 23, 2022
    28
    谢谢各位提供的信息,我结合你们提供的信息继续研究一下如何处理。
    qweaszxcdf
    qweaszxcdf
    Oct 10, 2022
    29
    @bigbyto OP 有搞定这个问题么
    bigbyto
    bigbyto
    OP
    Oct 10, 2022
    30
    @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   ·   Privacy   ·   Solana   ·   1601 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 65ms · UTC 17:35 · PVG 01:35 · LAX 09:35 · JFK 12:35
    ♥ Do have faith in what you're doing.