
你是否遇到过这样的场景,服务器不能上网,但是又需要安装某个软件,面对如蛛网般杂乱的 rpm 包依赖关系,放弃或许是最好的选择,这样你就不必再为无法完成工作而痛苦又懊恼。
但是今天,你有了一个更好的选择。
4DNAT 取名源自 4 和 DNAT 。这个工具工作在 OSI 模型的第四层传输层,同时 4 和 for 谐音,意为专门为目标地址转换而服务的工具。4DNAT 使用 go 语言开发,具有天然的跨平台性,并且完全使用 go 标准库开发,没有任何的第三方依赖,编译之后只有一个二进制可执行文件。它有 4 种工作模式:
接受两个参数,监听端口和目标地址,在监听端口接收到请求后会主动连接目标地址,示例:
./4dnat -forward 2222 192.168.1.100:22 接受两个参数,监听端口 1 和监听端口 2,并交换两个端口接收到的数据,示例:
./4dnat -listen 10000 10001 接受两个参数,目标地址 1 和目标地址 2,启动后会主动连接这两个目标地址,并交换两个端口接收到的数据,示例:
./4dnat -agent 127.0.0.1:10000 127.0.0.1:22 接受两个参数或四个参数,代理类型、监听端口、证书路径和私钥路径,示例:
./4dnat -proxy http 1080 ./4dnat -proxy https 1080 server.crt server.key 期望可以在用户电脑上直接访问目标服务器上的 3306 端口,跳板机器是一台 Windows 机器,没办法做 ssh 端口转发。 
单向虚线箭头表示可以单向访问,反之不行。
使用 4DNAT 在跳板机器上执行如下命令做端口转发
# 本地监听 3307 端口,接收到请求后主动连接 10.1.0.40 的 3306 端口 ./4dnat -forward 3307 10.1.0.40:3306 在用户电脑上访问172.16.0.30:3307即等同于访问10.1.0.40:3306,于是就可以在用户电脑愉快的访问目标机器上的服务啦。
期望目标目标机器可以上网,如使用 yum 安装软件。 
./4dnat -proxy http 1080 ./4dnat -listen 10000 10001 ./4dnat -listen 20000 20001 ./4dnat -agent 127.0.0.1:1080 172.16.0.30:10000 ./4dnat -agent 127.0.0.1:10001 10.1.0.40:20000 cat <<EOF >> /etc/profile http_proxy=http://127.0.0.1:20001 https_proxy=http://127.0.0.1:20001 export http_proxy https_proxy EOF source /etc/profile curl https://typesafe.cn 最后奉上项目地址 https://github.com/dushixiang/4dnat
本文首发我的微信公众号:我在对面的角落

1 westoy 2020-11-22 15:09:58 +08:00 然后因为违反公司或者合作方的保密条例, 被 fire 了....... |
2 wtks1 2020-11-22 15:13:18 +08:00 via Android 如果是专门用跳板机 /堡垒机做的限制,搞这个就是在作死啊... |
3 opengps 2020-11-22 15:18:32 +08:00 使用场景里,有哪些典型?实在想象不出太正规的用法来 |
4 dushixiang OP @westoy 哈哈,保密要求比较严格的公司,提供给用户可操作的机器也是不能上网的 |
5 dushixiang OP @wtks1 主要是针对不具备上网条件的服务器,例如还没有弄专线,但是得着手安装应用了 |
6 dushixiang OP @opengps 黑客经常会用这种手段渗透内网机器,不过只是一种工具,针对需要的场景还是挺好用的。 例如需要在 Windows 上配置端口转发,或者 Linux 上不会写 DNAT 规则。 例如某些不具备上网条件的服务器,还没有来得及弄专线,但是得着手安装应用了。 |
7 dushixiang OP 主要是为了突出功能才设计了第二种场景哈,不合规的操作还是不要做。 |
8 Tumblr 2020-11-22 15:47:39 +08:00 这是教人作恶啊。。。如 @westoy #1 所说,这是触碰红线的操作。 在公司给你隔离网络的时候,必然会提供内部的 repository 。即使没有内部的 repo,也应该是通过正常渠道来申请上网权限而不是用楼主所谓的「这个工具」。 |
9 jianzhao123 2020-11-22 16:27:03 +08:00 via Android 工具是来用的,楼主只是开发了个工具,跟人拿去怎么用没关系吧……反正我挺支持 lz 。 |
10 tikazyq 2020-11-22 16:30:38 +08:00 为啥不用 squid |
11 boris93 2020-11-22 16:39:10 +08:00 via Android 给不允许上公网的机器打洞? 头几天小米那事还没学习够? |
12 boris93 2020-11-22 16:40:34 +08:00 via Android @jianzhao123 #9 话是没错,自己的某台电脑因故不能连公网,自己又可以承担打洞带来的后果,那当然没问题 但是楼主这个场景明显是以违反公司安全制度为前提,那就不行 |
13 Tumblr 2020-11-22 17:01:57 +08:00 @jianzhao123 #9 如果只是推广个工具,丢个链接,那我同样也支持。 但是楼主拿一个明显触碰红线的场景来作为示例,就好像卖菜刀明明是可以拿切菜来示范的,却拿杀人当示例,这就不合适了。 |
14 optional 2020-11-22 17:18:32 +08:00 via iPhone 都没受过合规培训的学生们吧? 在正规的公司工作,合规是第一位的。 |
15 akira 2020-11-22 18:06:18 +08:00 东西挺好的,就是这个例子不大合适,换一个吧 |
16 user20190708 2020-11-22 18:17:38 +08:00 via Android 离线安装 1. 插 DVD 碟可以使用 yum 方式离线安装大部分常用软件; 2. 在另一台能联网的 相同操作系统 相同版本的机器上 yum --downloadonly 下载安装包,拷贝到目标机器执行安装。 |
17 DoctorCat 2020-11-22 18:55:06 +08:00 跳板机也限制外网访问呀,你这代理在生产域外那就失去作用了 |
18 dushixiang OP |
19 muzuiget 2020-11-22 20:30:32 +08:00 没看到有啥优势,纯端口转发,Windows 可以用自带 netsh,Linux/MacOS 可以用 socat,甚至 ssh 都行。 |
20 ljlljl0 2020-11-22 21:13:25 +08:00 例子:笔记本电脑可以上网,服务器不可以上网。 目的,服务器与笔记本业务口连接,借助电脑上网功能进行升级或者提供给外部用户临时的 ip 访问功能。 楼主,这个能实现不,不借助中间跳板。 |
21 lishen226 2020-11-22 21:25:48 +08:00 不是有好多打洞工具吗,这个轮子的优势在哪里? |
22 letitbesqzr 2020-11-22 21:30:57 +08:00 我经常遇到的情况:服务器 npm 或者 yum 一些三方源,需要“代理”才能够稳定连上... 感觉最简单的还是把本地的“飞机”端口,直接用 ssh 映射到远程服务器上... xshell 等工具都能够很方便图形化的配置 |
23 dushixiang OP @ljlljl0 上网的可以参考我设计的第二个场景,请按照公司的规章制度使用。 提供给外部用户临时的 ip 访问功能 1. 本地使用 listen 模式监听两个端口 2. 本地使用 agent 模式 第一个参数为第一步监听的任意一个端口,第二个参数为服务器的 IP 和端口 3. 访问第一步本地监听的另一个地址+端口即可 |
24 dushixiang OP @ljlljl0 上网的可以参考我设计的第二个场景,请按照公司的规章制度使用。 提供给外部用户临时的 ip 访问功能我上面写错了,不能删除。 用转发模式就行 ./4dnat -forward 8080 server:80 |
25 dushixiang OP @muzuiget 不光是端口转发,对于那些隐藏在 nat 背后的机器,想要相互通信,仅仅是依靠端口转发就做不到了。 |
26 dushixiang OP @lishen226 代码比较少,如果去掉 http 代理的功能不到 150 行吧 |
28 dushixiang OP @ljlljl0 可以的 如果服务器能访问你的笔记本,直接在笔记本上代理。 如果服务器不能访问你的笔记本,首先在服务器上以 listen 模式监听两个端口,笔记本上启动代理,笔记本上以 agent 模式连接本地代理地址和服务器监听的任意一个地址,配置服务器代理为第一步监听的另一个端口 |
29 efaun 2020-11-23 00:15:45 +08:00 @jianzhao123 #9 快播也是这样想的 ![]() |
30 AGEGG 2020-11-23 09:25:12 +08:00 我记得 centos 的话可以下载 centos 的全量软件包,然后配置 yum 源到本地实现。 不过很多内部不允许上网的公司常用软件内部有经过检验和打包好有文档的软件包 |
31 Bootis 2020-11-23 10:48:40 +08:00 可以,傻瓜式很好用,赞了 |
32 doveyoung 2020-11-23 11:29:41 +08:00 啊这…… 不知道从哪儿说起 |
33 cpstar 2020-11-23 18:04:02 +08:00 四层转发而已么?没有什么协议包装之类的? 其实有点像在跳板机上开 tunnel,只不过恰好跳板机没有 ssh 场景一其实就是往里进,ssh tunnel 的事情,既然跳板机能安装 4dnat 了,那搞个 sshd 好像问题不大 场景二算是往外出,可以说与场景一一样开 tunnel,方向恰好相反,tunnel 到用户电脑的 http proxy 上 |
34 dushixiang OP @cpstar 中间有的机器可能是 windows,而且 ssh 的 tun 没有重连。我写的这个操作比较傻瓜,命令简单,代码也少,分享一下 |
35 qfdk PRO 算了算了还是别用了 免得审查的时候出问题. 过来人的警告 |