V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
onewesong
V2EX  ›  程序员

撸了一个轻量的跨协议栈端口转发工具

  •  
  •   onewesong · 277 天前 · 1018 次点击
    这是一个创建于 277 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

    公司有很多新上的只有 IPv6 公网的节点

    老的系统很多很杂要支持 IPv6 设备改造周期很长

    解决方案

    其实可以加一个组件来做 ipv4 到 ipv6 的网络转发,这样旧的系统就不用改造,还是访问设备的 ipv4 虚拟地址就可以了

    这里用 golang 写了个轻量跨协议端口转发工具,再配合 iptables NAT 转换就可以实现透明代理

    项目已开源: goforward

    有需要的可以自取

    简单列下使用姿势

    • forward local ipv4 to remote ipv4
    goforward -f 127.0.0.1:1111->1.1.1.1:443
    
    • forward local ipv4 to remote ipv6
    goforward -f 127.0.0.1:12345->[2400:3200::1]:443
    
    • forward multiple mixes
    goforward -f 127.0.0.1:12345->[2400:3200::1]:443,127.0.0.1:12346->[2400:3200:baba::1]:443
    
    4 条回复    2023-07-27 15:15:34 +08:00
    FreeEx
        1
    FreeEx  
       277 天前
    兄弟你这个写的太复杂了,如果只要端口转发功能,100 行代码就实现了。
    看看我这个 https://github.com/dushixiang/4dnat
    onewesong
        2
    onewesong  
    OP
       276 天前
    确实,前面有写了个 demo 实现端口转发不到 100 行就搞定了
    之所以项目结构变成这样是为了方便后期扩展

    而且为了避免要增加新的转发要重启程序,增加了 RESTFUL 接口支持对连接信息进行增删改查,所以还是用 MVC 的分层结构好一些

    另外我觉得评价软件设计复不复杂应该要看两方面
    一、使用方式是否复杂
    二、扩展是否复杂

    目前看这个软件这两点还是可以的
    ruanimal
        3
    ruanimal  
       276 天前
    这种情况 linux lvs 不能用吗
    huahsiung
        4
    huahsiung  
       276 天前
    曾经以为改动 v4->v6 很难。后来发现只要有源码,改动几处就行了

    ```C

    struct sockaddr_in addr -> struct sockaddr_in6 addr6

    inet_pton(AF_INET -> inet_pton(AF_INET6

    addr.sin_family = AF_INET -> addr6.sin6_family = AF_INET6

    0.0.0.0 -> ::

    ```

    基本就是把 AF_INET 改成 AF_INET6
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3112 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 13:43 · PVG 21:43 · LAX 06:43 · JFK 09:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.