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

2018-01-17 17:01:39 +08:00
 zjsxwc

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

6999 次点击
所在节点    程序员
18 条回复
wellsc
2018-01-17 17:26:49 +08:00
NGINX
ThirdFlame
2018-01-17 17:28:11 +08:00
端口映射?
janxin
2018-01-17 17:28:18 +08:00
clino
2018-01-17 17:30:51 +08:00
除了端口映射, socks 代理是不是也是做到这种效果?
FreeEx
2018-01-17 17:49:27 +08:00
iptables nat
ysc3839
2018-01-17 18:19:05 +08:00
@clino 是。但是程序先得告诉服务器要连接的地址,不能做到楼主这种效果。
h4lbhg1G
2018-01-17 18:21:30 +08:00
@FreeEx nat 是不是只能转内网 IP,公网 IP->公网 IP 有效么?
pimin
2018-01-17 18:23:52 +08:00
端口转发应该是效率最高的
wangking
2018-01-17 18:24:53 +08:00
ssh 和 iptables 都是有转发功能
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
2018-01-17 18:31:52 +08:00
@h4lbhg1G 有啊.....
likuku
2018-01-17 18:33:29 +08:00
haproxy 的 tcp 连接模式
conn4575
2018-01-17 19:36:57 +08:00
haproxy+1
zjsxwc
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
2018-01-17 20:33:40 +08:00
在本机上执行
iptables -t nat -I OUTPUT -p tcp -d 地址 A --dport 端口 -j DNAT --to 地址 B
xiaoz
2018-01-17 20:55:13 +08:00
wwqgtxx
2018-01-17 21:33:44 +08:00
如果要看 userspace 的实现,下面的写的也不错
https://github.com/wangyu-/tinyPortMapper
如果要效率高,还是用 iptables 的 nat 转发
eaglexiang
2018-01-18 03:31:47 +08:00
@clino socks5 能实现你要的效果,但数据报需要按照 socks5 的协议封装。
见: https://www.eaglexiang.org/socks5-chinese

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

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

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

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

© 2021 V2EX