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

如何转发 tcp 请求到另一个 ip 地址?

  •  
  •   zjsxwc ·
    zjsxwc · 2018-01-17 17:01:39 +08:00 · 6993 次点击
    这是一个创建于 2497 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如在我程序看来是对 ip 地址 A 创建了个 tcp 连接,但实际上是对 ip 地址 B 创建了个 tcp 连接,这应该怎么实现? Linux C 有例子吗?

    第 1 条附言  ·  2018-01-17 19:24:59 +08:00
    有学习的代码了: https://github.com/rssnsj/portfwd
    18 条回复    2018-01-18 03:31:47 +08:00
    wellsc
        1
    wellsc  
       2018-01-17 17:26:49 +08:00
    NGINX
    ThirdFlame
        2
    ThirdFlame  
       2018-01-17 17:28:11 +08:00
    端口映射?
    janxin
        3
    janxin  
       2018-01-17 17:28:18 +08:00
    clino
        4
    clino  
       2018-01-17 17:30:51 +08:00
    除了端口映射, socks 代理是不是也是做到这种效果?
    FreeEx
        5
    FreeEx  
       2018-01-17 17:49:27 +08:00
    iptables nat
    ysc3839
        6
    ysc3839  
       2018-01-17 18:19:05 +08:00 via Android
    @clino 是。但是程序先得告诉服务器要连接的地址,不能做到楼主这种效果。
    h4lbhg1G
        7
    h4lbhg1G  
       2018-01-17 18:21:30 +08:00
    @FreeEx nat 是不是只能转内网 IP,公网 IP->公网 IP 有效么?
    pimin
        8
    pimin  
       2018-01-17 18:23:52 +08:00 via Android
    端口转发应该是效率最高的
    wangking
        9
    wangking  
       2018-01-17 18:24:53 +08:00
    ssh 和 iptables 都是有转发功能
    lianxiaoyi
        10
    lianxiaoyi  
       2018-01-17 18:27:21 +08:00
    apt-get install rinetd
    vim /etc/rinetd.conf
    0.0.0.0 3706 xxx.xxx.xxx.xxx 3306
    :wq
    rinetd /etc/rinetd.conf
    azh7138m
        11
    azh7138m  
       2018-01-17 18:31:52 +08:00
    @h4lbhg1G 有啊.....
    likuku
        12
    likuku  
       2018-01-17 18:33:29 +08:00
    haproxy 的 tcp 连接模式
    conn4575
        13
    conn4575  
       2018-01-17 19:36:57 +08:00 via Android
    haproxy+1
    zjsxwc
        14
    zjsxwc  
    OP
       2018-01-17 19:42:02 +08:00
    看了代码原来就是借助 epoll 代理转发,不断的 recv 与 send 数据:

    https://github.com/rssnsj/portfwd/blob/master/src/tcpfwd.c#L433

    https://github.com/rssnsj/portfwd/blob/master/src/tcpfwd.c#L444
    LGA1150
        15
    LGA1150  
       2018-01-17 20:33:40 +08:00
    在本机上执行
    iptables -t nat -I OUTPUT -p tcp -d 地址 A --dport 端口 -j DNAT --to 地址 B
    xiaoz
        16
    xiaoz  
       2018-01-17 20:55:13 +08:00
    wwqgtxx
        17
    wwqgtxx  
       2018-01-17 21:33:44 +08:00 via iPhone   ❤️ 1
    如果要看 userspace 的实现,下面的写的也不错
    https://github.com/wangyu-/tinyPortMapper
    如果要效率高,还是用 iptables 的 nat 转发
    eaglexiang
        18
    eaglexiang  
       2018-01-18 03:31:47 +08:00   ❤️ 1
    @clino socks5 能实现你要的效果,但数据报需要按照 socks5 的协议封装。
    见: https://www.eaglexiang.org/socks5-chinese
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3580 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 11:05 · PVG 19:05 · LAX 03:05 · JFK 06:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.