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

2022-08-22 17:25:17 +08:00
 bigbyto

最近需要用到 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 这块不是很熟悉,希望懂得朋友帮帮忙,或者给一些思路我去查文档,非常感谢。

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

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

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

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

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

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

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

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

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

如果不想手写 iptables 这么麻烦,甚至还可以安装个 OpenWRT 用来运行 easyconnect ,然后用 OpenWRT 自带的图形界面去配置 NAT 方向,应该会直观很多

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/874612

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX