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

端口转发轮子

  •  
  •   azh7138m ·
    muzea · 2019-06-05 13:47:47 +08:00 · 3339 次点击
    这是一个创建于 2017 天前的主题,其中的信息可能已经有所发展或是发生改变。

    轮子地址

    简陋的文档

    之前会有端口转发的需求,iptables 没有 api 不太方便,于是重新包了一下 docker/go-connections ,就是现在这个轮子了。

    提供几个简单的 api 来控制映射到的端口,写了个简单的 web 来展示 api 怎么使用。

    portfwd.1.png

    33 条回复    2019-08-26 10:32:55 +08:00
    MeteorCat
        1
    MeteorCat  
       2019-06-05 15:53:40 +08:00 via Android
    哈哈哈,第一次见到开头就说低性能的 xxx,在看惯所有标题开头就是高性能的 xxx 的项目当中,感觉有点惊艳
    yejinmo
        2
    yejinmo  
       2019-06-05 15:57:42 +08:00
    haproxy ?
    azh7138m
        3
    azh7138m  
    OP
       2019-06-05 15:59:00 +08:00
    @MeteorCat 第一版是自己写的,并没有用 docker/go-connections 这个库,所以是低性能 :D
    azh7138m
        4
    azh7138m  
    OP
       2019-06-05 16:07:50 +08:00
    @yejinmo 也可以啊,但是它的 api 一次刷新全量的 config,不太好用,而且我还想转发 UDP 流量,HA 应该是做 TCP/HTTP LB 的,这个场景不适合
    airfling
        5
    airfling  
       2019-06-05 16:10:59 +08:00
    看你的标题,我差点以为你要被封
    sc104501
        6
    sc104501  
       2019-06-05 16:17:21 +08:00 via Android
    之前用的 rinetd,和这个有区别吗?
    azh7138m
        7
    azh7138m  
    OP
       2019-06-05 17:05:37 +08:00
    @sc104501 实现的功能一样(我这个只有转发没有 ACL ),这个轮子只是提供了一个 HTTP API 来操作映射的规则
    slwl123
        8
    slwl123  
       2019-06-29 19:01:19 +08:00
    希望能转发 UDP 支持 LZ
    azh7138m
        9
    azh7138m  
    OP
       2019-06-29 22:14:19 +08:00 via Android
    @slwl123 支持,默认就是转发 udp+tcp 的
    solaro
        10
    solaro  
       2019-08-13 07:33:31 +08:00
    支持端口段吗??
    solaro
        11
    solaro  
       2019-08-13 07:34:46 +08:00
    看起来并不支持端口段。。强烈关注楼主。
    azh7138m
        12
    azh7138m  
    OP
       2019-08-13 10:38:47 +08:00
    @solaro 本来只是我配合 nat 鸡用的,这个场景不存在端口段的情况,批量添加可以考虑批量调接口
    solaro
        13
    solaro  
       2019-08-14 10:05:13 +08:00
    @azh7138m 持续关注,大佬加功能吧,我用过 haproxy 不支持 udp,试过 socat 不支持端口段,最后方案 iptables。。只能用脚本,一脸苦
    azh7138m
        14
    azh7138m  
    OP
       2019-08-16 09:13:53 +08:00 via Android   ❤️ 1
    @solaro 现在支持端口段了
    local 传 3000/3999 这种,代表转发这 1k 个端口,其他没变化
    solaro
        15
    solaro  
       2019-08-18 10:27:03 +08:00
    @azh7138m 哈哈哈,我试试。大佬就是大佬。膜拜
    solaro
        16
    solaro  
       2019-08-18 16:01:00 +08:00
    @azh7138m 大佬你好,我自行编译后体验了一下:通过 powershell 在 win 下以超管权限启动了,使用 postman 请求 api,但是 api 无任何返回,postman 一直在请求中
    azh7138m
        17
    azh7138m  
    OP
       2019-08-18 16:09:04 +08:00
    @solaro
    https://i.loli.net/2019/08/18/SzOJ8Uw2MQabI9V.png

    我这里没有问题
    - 你提供 config 了吗
    - 我有提供 release,可以不用自己编译
    solaro
        18
    solaro  
       2019-08-18 16:17:09 +08:00
    @azh7138m 哈哈可以了,不知道为什么第一次启动的时候,windows 防火墙放行之后,必须得到 powershell 里敲一下 enter,否则 无论怎么请求,都不显示任何信息,请求被拒,( tcping 的时候端口是开放的,但是就是不接收请求)
    solaro
        19
    solaro  
       2019-08-18 16:54:05 +08:00
    @azh7138m 请问:我如何 将 A 主机的端口段转发到 B 主机的端口段,config 怎么写呢?
    例如:A 主机的 5000 到 10000 端口 全部转发到 B 的 5000 到 10000 端口,A 主机的 10000-20000 转发到 C 的 10000 到 20000 这样
    solaro
        20
    solaro  
       2019-08-18 16:57:16 +08:00
    @azh7138m 如果我 config 里这么写
    ```
    {
    "proxy": {
    "3000": "127.0.0.1:10086",
    "5000/10000": "192.168.2.205:5000/10000"
    },
    "APIPort": ":3001"
    }
    ```
    直接蹦掉了
    ```
    2019/08/18 16:56:10 proxy 3000 to 127.0.0.1:10086
    2019/08/18 16:56:10 lookup tcp/5000/10000: getaddrinfow: The specified class was not found.
    ```
    azh7138m
        21
    azh7138m  
    OP
       2019-08-18 16:59:24 +08:00 via Android
    @solaro
    只修改 local
    5000/10000 192.168.2.205:5000
    target 的端口只给一个起始就行
    solaro
        22
    solaro  
       2019-08-19 10:42:29 +08:00
    @azh7138m 改进性需求
    1.希望可以 自定义 config.json 路径,例如 --config=/tmp/config.json 或者 -config=/tmp/config.json
    2.希望有 --help 或者 -help
    3.如果不带参数启动,默认加载当前目录下的 config.json
    solaro
        23
    solaro  
       2019-08-19 10:46:10 +08:00
    @azh7138m 在 centos 7 64bit 下执行会提示
    ```
    Segmentation fault
    ```

    使用的是 freebsd 版本
    solaro
        24
    solaro  
       2019-08-19 10:51:56 +08:00
    @azh7138m

    我从你的 released 下了 amd_64 版本到 centos7.6 64bit 上测试,config.json 位于 portfwd 同目录下,配置如下:
    ```
    {
    "proxy": {
    "5000/10000": "47.74.XXX.XXX:5000"
    },
    "APIPort": ":3001"
    }

    ```

    结果:
    ```
    goroutine 5525 [IO wait]:
    internal/poll.runtime_pollWait(0x7f02a97a06a8, 0x72, 0x0)
    /home/travis/.gimme/versions/go1.11.13.linux.amd64/src/runtime/netpoll.go:173 +0x66
    internal/poll.(*pollDesc).wait(0xc000ed8798, 0x72, 0x0, 0x0, 0x0)
    /home/travis/.gimme/versions/go1.11.13.linux.amd64/src/internal/poll/fd_poll_runtime.go:85 +0x9a
    internal/poll.(*pollDesc).waitRead(0xc000ed8798, 0xc0015dff00, 0xffe3, 0xffe3)
    /home/travis/.gimme/versions/go1.11.13.linux.amd64/src/internal/poll/fd_poll_runtime.go:90 +0x3d
    internal/poll.(*FD).ReadFrom(0xc000ed8780, 0xc0015dff15, 0xffe3, 0xffe3, 0x0, 0x0, 0x0, 0x0, 0x0)
    /home/travis/.gimme/versions/go1.11.13.linux.amd64/src/internal/poll/fd_unix.go:219 +0x168
    net.(*netFD).readFrom(0xc000ed8780, 0xc0015dff15, 0xffe3, 0xffe3, 0x0, 0x0, 0x0, 0x0, 0x0)
    /home/travis/.gimme/versions/go1.11.13.linux.amd64/src/net/fd_unix.go:208 +0x5b
    net.(*UDPConn).readFrom(0xc00000c908, 0xc0015dff15, 0xffe3, 0xffe3, 0x0, 0x0, 0x0, 0x0)
    /home/travis/.gimme/versions/go1.11.13.linux.amd64/src/net/udpsock_posix.go:47 +0x6a
    net.(*UDPConn).ReadFromUDP(0xc00000c908, 0xc0015dff15, 0xffe3, 0xffe3, 0x0, 0x0, 0x0, 0x0)
    /home/travis/.gimme/versions/go1.11.13.linux.amd64/src/net/udpsock.go:109 +0x6d
    github.com/docker/go-connections/proxy.(*UDPProxy).Run(0xc00105ba40)
    /home/travis/gopath/src/github.com/docker/go-connections/proxy/udp_proxy.go:116 +0x1e1
    main.prepareUDPHandler(0x1e4f, 0xc000ed4840)
    /home/travis/gopath/src/github.com/muzea/portfwd/portfw.go:100 +0x1e2
    created by main.addProxyItem
    /home/travis/gopath/src/github.com/muzea/portfwd/portfw.go:61 +0x28e

    ```
    azh7138m
        25
    azh7138m  
    OP
       2019-08-19 12:16:22 +08:00 via Android
    @solaro 大哥你用 linux 的版本啊,freebsd 和 linux 不是一个东西
    solaro
        26
    solaro  
       2019-08-19 23:05:35 +08:00
    @azh7138m 哈哈,尴尬,后面用了 amd_64 的 ,报了上面那个错误,而且我自己编译出来的 amd-64 的包都是 0k 不知道为什么。会不会是你的那个编译 sh 没有设置好
    azh7138m
        27
    azh7138m  
    OP
       2019-08-20 01:04:15 +08:00
    @solaro 64 位 CentOS 应该使用 linux-amd64 freebsd 和 linux 是两个东西
    azh7138m
        28
    azh7138m  
    OP
       2019-08-20 01:07:04 +08:00
    @solaro 看到是 Linux AMD64 了,我周末找个 CnetOS 看一下吧
    azh7138m
        29
    azh7138m  
    OP
       2019-08-20 01:56:35 +08:00
    @solaro
    https://i.loli.net/2019/08/20/BCbTUZ9NKtdsyM1.png
    这里已经没问题了

    build 要求你本地有安装 go,且可以正常联网
    solaro
        30
    solaro  
       2019-08-22 22:47:44 +08:00
    @azh7138m 持续关注了项目距哈哈,我用了最新版的 0.0.5,在 centos7 下可以用了,单个端口可以,端口段不能用。不知道为什么。

    单个端口可以通:
    ```
    {
    "proxy": {
    "5000": "47.74.XXX.XXX:5000"
    },
    "APIPort": ":3001"
    }

    ```

    端口段不行,也没有任何日志,不知道为啥:
    ```
    {
    "proxy": {
    "5000/10000": "47.74.XXX.XXX:5000"
    },
    "APIPort": ":3001"
    }

    ```
    solaro
        31
    solaro  
       2019-08-22 22:49:29 +08:00
    能否把端口段改为这样的格式吗?可读性能高,便于理解

    ```
    {
    "proxy": {
    "5000/10000": "47.74.XXX.XXX:5000/10000"
    },
    "APIPort": ":3001"
    }

    ```
    azh7138m
        32
    azh7138m  
    OP
       2019-08-25 01:29:08 +08:00
    @solaro 我没注意到后面的 proxy run 会阻塞,只会绑定第一个端口,现在已经好了; target 给出结束的端口没意义,反而还要校验一次长度是否一致
    solaro
        33
    solaro  
       2019-08-26 10:32:55 +08:00
    @azh7138m 哥哥,经过一系列的测试,目前仅剩一个:udp 不通。其他都完美
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   908 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 20:04 · PVG 04:04 · LAX 12:04 · JFK 15:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.