最近需要用到 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 这块不是很熟悉,希望懂得朋友帮帮忙,或者给一些思路我去查文档,非常感谢。
1
lizenghui 2022-08-22 17:29:19 +08:00
我怎么感觉应该在路由表上搞啊。
|
2
yingqiuQAQ 2022-08-22 17:32:01 +08:00
我猜你是想要用 dnat 功能? 在 PREROUTING 链设置试下?
|
3
bigbyto OP @lizenghui 应该不是路由表。easyconnect 一旦连接成功服务端会推一个路由过来更新本地路由,比如 192.168.30.3 路由到 tun1 。但我在 openvpn client 那边连接后,无法 ping 通 192.168.30.3
|
4
bigbyto OP @yingqiuQAQ 我想实现的功能是本机直连 openvpn ,但能访问到 easyconnect 那边的内网环境,这功能应该不是 dnat 吧?
|
5
linuxyz 2022-08-22 17:42:14 +08:00
信息太少,凭感觉:
1 ,需要 SNAT 来隐藏来自 OpenVPN 的源 IP, 否则 EasyConnect 那边无路由 2 ,需要 OpenVPN 接入端加 route, 这样才能让,IP 通过 OpenVPN 2, 需要服务端加路由, 不过这个大概率 EasyConnect 和 OpenVPN 在连接建立后都会自动加上 |
6
bigbyto OP @linuxyz 感谢!
我这边的 OpenVPN 接入端设置了全局,这个问题不大; 服务端的路由如你所说,OpenVPN 和 EasyConnect 这两个在建立连接是就已经更新了本地路由表。 关于你提到的第一点不太理解,为什么要隐藏 OpenVPN 的源 IP EasyConnect 才能正常路由? |
7
joshu 2022-08-22 18:11:20 +08:00
@bigbyto 因为 easyconnect 对端的所有机器都没有到 openvpn 地址段的路由,它们不知道应该怎么把包回给你
或者 easyconnect 那边做了防火墙,可能会把你这个包直接在对端入口丢掉 |
8
rev1si0n 2022-08-22 18:19:10 +08:00
客户端路由 easyconnect 的网段到客户端的 ovpn tun 接口,如果只是需要 ping 通 tun1 的话,应该不需要别的配置了,如果是要 tun1 全段 ping ,服务器上应该也要路由一下,应该不用 iptables
|
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 。 |
12
bigbyto OP @parametrix 谢谢你的信息。
我的需求就是想在服务器装 openvpn 和 easyconnnect ,但我本地是通过 openvpn 连接到服务器,也能跟 easyconnect 的网段进行通信。 |
13
zhangsanfeng2012 2022-08-22 20:25:06 +08:00 via Android
iptables -t nat -I POSTROUTING -o tun1 -j MASQUERADE
|
14
goodbest 2022-08-22 20:26:10 +08:00 via iPhone
目测伪需求?
有人研出了在容器里跑的 easyconnect ,可能更符合你的需求 |
15
bigbyto OP @goodbest easyconnect 的情况要比想象的麻烦许多,单纯用来访问 git 之类的 socks5 是足够了。但对于 JDBC 或者不走系统代理的程序而言,无法配置。 还有就是它自带了个 DNS 解析,域名必须通过它才能解析,对于一些不走代理的,直接通过系统 DNS 无法获得正确的解析结果。
|
16
bigbyto OP @zhangsanfeng2012 谢谢,这条我有试过,ping 不通,有时间用 tcpdump 看看有没有到 tun1...
|
17
yanyumihuang 2022-08-22 20:51:26 +08:00 via Android
用 clash 的 tun 模式,DNS 你抓包不就能抓出来 IP 和端口号了。然后用 docker 开一个 socks5 ,用在 clash 里配好 DNS 和 socks5 不就完结了,搞什么 tun 到 tun 。
|
18
parametrix 2022-08-22 21:08:00 +08:00
|
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 为内网网段就直接转发到其它主机处理了。 |
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 方向,应该会直观很多 |
21
realpg 2022-08-22 23:32:54 +08:00
先深入学习一下路由的知识
如果不涉及本机是 nat 服务器, iproute2 就完事了 搞啥性能低下的 iptables |
22
julyclyde 2022-08-23 11:37:25 +08:00
首先,iptables 不负责转发
|
23
chenjiangui998 2022-08-23 15:58:57 +08:00
我是用虚拟机跑 vpn + clash, 然后在端口转发 clash 给宿主机
|
24
0bing 2022-08-23 16:05:24 +08:00
iptables 性能低下???这是喷处理器还是喷内核
|
25
facelezz 2022-08-23 17:05:37 +08:00
楼主是想要把 openvpn 的虚拟网卡的流量全都从 easyconnect 的网卡出去吧。
我在用的类似 分享下目前在用的办法,有需要的可以参考: 宿主机装个 windows 虚拟机,然后在虚拟机内 把 easyconnect 的虚拟网卡网络共享( windows 的 ICS 功能)到 Host-only 的网卡,在宿主机上 router 配置 网段到 Host-only 网卡就行了,我目前就这样在用(隔离公司的 easyconnect ) Linux 应该是一样的 |
26
facelezz 2022-08-23 17:08:35 +08:00
如果只是单纯为了隔离的话 我上面那个方法不需要 openvpn ,而且你想要域名访问在 hosts 配常用的 IP 关系就可以
|
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 地址 |
28
bigbyto OP 谢谢各位提供的信息,我结合你们提供的信息继续研究一下如何处理。
|
29
qweaszxcdf 2022-10-10 05:56:29 +08:00
@bigbyto OP 有搞定这个问题么
|
30
bigbyto OP @qweaszxcdf 很早就搞定啦,有计划写文章彻底介绍网络数据流量和 iptables 的工作工程,不过事情比较多,一直在拖延😂。
有几个点你可以参考一下: 1. openvpn 可能会增加自己的 iptables 规则,只有自己的 ip 段才会做 SNAT ,这个你可以检查你的 nat 表规则 2. 做 DNS 转发时需要启用 loopback 的转发 3. 做 SNAT ,就如同上面朋友所说的,SNAT 可以用 masquerade ,或者直接 snat 到 easyconnect 网卡那个 ip 地址 调试的时候用 tcpdump 看一下 ip 的报文流向可以比较清晰的看到问题所在。 |