V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
FreeEx
V2EX  ›  分享创造

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

  •  
  •   FreeEx ·
    dushixiang · 2020-11-22 15:08:14 +08:00 · 5502 次点击
    这是一个创建于 1464 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前言

    你是否遇到过这样的场景,服务器不能上网,但是又需要安装某个软件,面对如蛛网般杂乱的 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

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

    image

    第 1 条附言  ·  2020-11-22 19:42:28 +08:00
    主要是为了突出功能才设计了第二种场景哈,设计不是很好,大家不合规的操作还是不要做。
    35 条回复    2020-11-24 20:48:14 +08:00
    westoy
        1
    westoy  
       2020-11-22 15:09:58 +08:00   ❤️ 3
    然后因为违反公司或者合作方的保密条例, 被 fire 了.......
    wtks1
        2
    wtks1  
       2020-11-22 15:13:18 +08:00 via Android   ❤️ 1
    如果是专门用跳板机 /堡垒机做的限制,搞这个就是在作死啊...
    opengps
        3
    opengps  
       2020-11-22 15:18:32 +08:00
    使用场景里,有哪些典型?实在想象不出太正规的用法来
    FreeEx
        4
    FreeEx  
    OP
       2020-11-22 15:24:50 +08:00
    @westoy 哈哈,保密要求比较严格的公司,提供给用户可操作的机器也是不能上网的
    FreeEx
        5
    FreeEx  
    OP
       2020-11-22 15:27:06 +08:00
    @wtks1 主要是针对不具备上网条件的服务器,例如还没有弄专线,但是得着手安装应用了
    FreeEx
        6
    FreeEx  
    OP
       2020-11-22 15:30:19 +08:00
    @opengps 黑客经常会用这种手段渗透内网机器,不过只是一种工具,针对需要的场景还是挺好用的。
    例如需要在 Windows 上配置端口转发,或者 Linux 上不会写 DNAT 规则。
    例如某些不具备上网条件的服务器,还没有来得及弄专线,但是得着手安装应用了。
    FreeEx
        7
    FreeEx  
    OP
       2020-11-22 15:32:09 +08:00
    主要是为了突出功能才设计了第二种场景哈,不合规的操作还是不要做。
    Tumblr
        8
    Tumblr  
       2020-11-22 15:47:39 +08:00   ❤️ 1
    这是教人作恶啊。。。如 @westoy #1 所说,这是触碰红线的操作。
    在公司给你隔离网络的时候,必然会提供内部的 repository 。即使没有内部的 repo,也应该是通过正常渠道来申请上网权限而不是用楼主所谓的「这个工具」。
    jianzhao123
        9
    jianzhao123  
       2020-11-22 16:27:03 +08:00 via Android   ❤️ 2
    工具是来用的,楼主只是开发了个工具,跟人拿去怎么用没关系吧……反正我挺支持 lz 。
    tikazyq
        10
    tikazyq  
       2020-11-22 16:30:38 +08:00
    为啥不用 squid
    boris93
        11
    boris93  
       2020-11-22 16:39:10 +08:00 via Android
    给不允许上公网的机器打洞?
    头几天小米那事还没学习够?
    boris93
        12
    boris93  
       2020-11-22 16:40:34 +08:00 via Android
    @jianzhao123 #9 话是没错,自己的某台电脑因故不能连公网,自己又可以承担打洞带来的后果,那当然没问题
    但是楼主这个场景明显是以违反公司安全制度为前提,那就不行
    Tumblr
        13
    Tumblr  
       2020-11-22 17:01:57 +08:00
    @jianzhao123 #9 如果只是推广个工具,丢个链接,那我同样也支持。
    但是楼主拿一个明显触碰红线的场景来作为示例,就好像卖菜刀明明是可以拿切菜来示范的,却拿杀人当示例,这就不合适了。
    optional
        14
    optional  
       2020-11-22 17:18:32 +08:00 via iPhone
    都没受过合规培训的学生们吧? 在正规的公司工作,合规是第一位的。
    akira
        15
    akira  
       2020-11-22 18:06:18 +08:00
    东西挺好的,就是这个例子不大合适,换一个吧
    user20190708
        16
    user20190708  
       2020-11-22 18:17:38 +08:00 via Android   ❤️ 1
    离线安装
    1. 插 DVD 碟可以使用 yum 方式离线安装大部分常用软件;
    2. 在另一台能联网的 相同操作系统 相同版本的机器上 yum --downloadonly 下载安装包,拷贝到目标机器执行安装。
    DoctorCat
        17
    DoctorCat  
       2020-11-22 18:55:06 +08:00
    跳板机也限制外网访问呀,你这代理在生产域外那就失去作用了
    FreeEx
        18
    FreeEx  
    OP
       2020-11-22 19:41:09 +08:00
    @Tumblr
    @akira

    说的很有道理,我想个更好的场景替代一下吧。
    muzuiget
        19
    muzuiget  
       2020-11-22 20:30:32 +08:00
    没看到有啥优势,纯端口转发,Windows 可以用自带 netsh,Linux/MacOS 可以用 socat,甚至 ssh 都行。
    ljlljl0
        20
    ljlljl0  
       2020-11-22 21:13:25 +08:00
    例子:笔记本电脑可以上网,服务器不可以上网。
    目的,服务器与笔记本业务口连接,借助电脑上网功能进行升级或者提供给外部用户临时的 ip 访问功能。
    楼主,这个能实现不,不借助中间跳板。
    lishen226
        21
    lishen226  
       2020-11-22 21:25:48 +08:00
    不是有好多打洞工具吗,这个轮子的优势在哪里?
    letitbesqzr
        22
    letitbesqzr  
       2020-11-22 21:30:57 +08:00
    我经常遇到的情况:服务器 npm 或者 yum 一些三方源,需要“代理”才能够稳定连上...

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