服务器不允许上网并且需要跳板机才能访问?学会使用这个工具,轻松让服务器使用 yum。

2020-11-22 15:08:14 +08:00
 FreeEx

前言

你是否遇到过这样的场景,服务器不能上网,但是又需要安装某个软件,面对如蛛网般杂乱的 rpm 包依赖关系,放弃或许是最好的选择,这样你就不必再为无法完成工作而痛苦又懊恼。

但是今天,你有了一个更好的选择。

4DNAT

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

http/https 代理模式

接受两个参数或四个参数,代理类型、监听端口、证书路径和私钥路径,示例:

http 代理

./4dnat -proxy http 1080

https 代理

./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 安装软件。

  1. 用户电脑上开启一个 http 代理
./4dnat -proxy http 1080
  1. 跳板机器上使用监听模式监听两个端口,用于交换数据
./4dnat -listen 10000 10001
  1. 目标机器上使用监听模式监听两个端口,用于交换数据
./4dnat -listen 20000 20001
  1. 用户电脑上使用代理人模式主动连接两个目标地址,用于交换数据
./4dnat -agent 127.0.0.1:1080 172.16.0.30:10000
  1. 跳板机器上使用代理人模式主动连接两个目标地址,用于交换数据
./4dnat -agent 127.0.0.1:10001 10.1.0.40:20000
  1. 目标机器上修改代理
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
  1. 目标机器上测试访问互联网
curl https://typesafe.cn

最后奉上项目地址 https://github.com/dushixiang/4dnat

本文首发我的微信公众号:我在对面的角落

5492 次点击
所在节点    分享创造
35 条回复
lishen226
2020-11-22 21:25:48 +08:00
不是有好多打洞工具吗,这个轮子的优势在哪里?
letitbesqzr
2020-11-22 21:30:57 +08:00
我经常遇到的情况:服务器 npm 或者 yum 一些三方源,需要“代理”才能够稳定连上...

感觉最简单的还是把本地的“飞机”端口,直接用 ssh 映射到远程服务器上... xshell 等工具都能够很方便图形化的配置
FreeEx
2020-11-22 21:34:52 +08:00
@ljlljl0 上网的可以参考我设计的第二个场景,请按照公司的规章制度使用。
提供给外部用户临时的 ip 访问功能
1. 本地使用 listen 模式监听两个端口
2. 本地使用 agent 模式 第一个参数为第一步监听的任意一个端口,第二个参数为服务器的 IP 和端口
3. 访问第一步本地监听的另一个地址+端口即可
FreeEx
2020-11-22 21:39:12 +08:00
@ljlljl0 上网的可以参考我设计的第二个场景,请按照公司的规章制度使用。
提供给外部用户临时的 ip 访问功能我上面写错了,不能删除。
用转发模式就行 ./4dnat -forward 8080 server:80
FreeEx
2020-11-22 21:44:37 +08:00
@muzuiget 不光是端口转发,对于那些隐藏在 nat 背后的机器,想要相互通信,仅仅是依靠端口转发就做不到了。
FreeEx
2020-11-22 21:45:33 +08:00
@lishen226 代码比较少,如果去掉 http 代理的功能不到 150 行吧
ljlljl0
2020-11-22 21:51:35 +08:00
@FreeEx 我是个人用,你那个不还得加个中间服务器嘛。。。。我只需要笔记本和服务器就上网那种能实现不
FreeEx
2020-11-22 23:02:13 +08:00
@ljlljl0 可以的
如果服务器能访问你的笔记本,直接在笔记本上代理。
如果服务器不能访问你的笔记本,首先在服务器上以 listen 模式监听两个端口,笔记本上启动代理,笔记本上以 agent 模式连接本地代理地址和服务器监听的任意一个地址,配置服务器代理为第一步监听的另一个端口
efaun
2020-11-23 00:15:45 +08:00
@jianzhao123 #9 快播也是这样想的
AGEGG
2020-11-23 09:25:12 +08:00
我记得 centos 的话可以下载 centos 的全量软件包,然后配置 yum 源到本地实现。
不过很多内部不允许上网的公司常用软件内部有经过检验和打包好有文档的软件包
Bootis
2020-11-23 10:48:40 +08:00
可以,傻瓜式很好用,赞了
doveyoung
2020-11-23 11:29:41 +08:00
啊这……
不知道从哪儿说起
cpstar
2020-11-23 18:04:02 +08:00
四层转发而已么?没有什么协议包装之类的?
其实有点像在跳板机上开 tunnel,只不过恰好跳板机没有 ssh
场景一其实就是往里进,ssh tunnel 的事情,既然跳板机能安装 4dnat 了,那搞个 sshd 好像问题不大
场景二算是往外出,可以说与场景一一样开 tunnel,方向恰好相反,tunnel 到用户电脑的 http proxy 上
FreeEx
2020-11-23 19:07:46 +08:00
@cpstar 中间有的机器可能是 windows,而且 ssh 的 tun 没有重连。我写的这个操作比较傻瓜,命令简单,代码也少,分享一下
qfdk
2020-11-24 20:48:14 +08:00
算了算了还是别用了 免得审查的时候出问题. 过来人的警告

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

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

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

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

© 2021 V2EX