之前在连接其他人kafka集群的时候,连接9092端口成功,但是生产数据一直报了一个IP无法进行连接错误。原因是对方在配置文件server.properties
里面的填写的是局域网的IP,而通过端口映射出来的IP不同,集群在生产消息是通过配置文件将数据生产到对应broker
上。在对方不修改配置文件的情况下,只能想办法实现端口转发。类似的问题还有端口反向代理后,对方服务执行了重定向导致后面访问的是局域网IP,这些可以通过端口转发请求解决。此转发方案仅适用于TCP端口,无法以这种方式转发UDP端口。
从Windows XP开始,Microsoft Windows具有内置功能来设置网络端口转发。因此,到本地端口的任何传入TCP连接(IPv4或IPv6)都可以重定向到另一个本地端口,甚至重定向到远程计算机上的端口。并且系统不必具有侦听此端口的服务。
在Linux中,使用iptables
非常简单地配置端口重定向。在Windows Server系统上,路由和远程访问服务(RRAS)用于组织端口转发。但是,有一种更简单的方法来配置端口转发,该方法在任何版本的Windows中都可以正常工作。
可以使用命令Netsh
的Portproxy
模式配置Windows中的端口转发。该命令的语法如下:
netsh interface portproxy add v4tov4 listenaddress=localaddress listenport=localport connectaddress=destaddress connectport=destport
listenaddress
–是等待连接的本地IP地址。
listenport
–本地侦听TCP端口(正在等待连接)。
connectaddress
–是将传入连接重定向到的本地或远程IP地址(或DNS名称)。
connectport
–是一个TCP端口,来自侦听端口的连接被转发到该TCP端口。
为保证端口转发有效,需要开启IP Helper
服务,同时网络接口上需要启用IPv6
支持。
按下Win+R
调出运行窗口,在弹出的窗口中输入services.msc
:
在弹出的服务窗口中找到IP Helper
这个服务,确保它是开启的。
在为其创建端口转发规则的网络接口上启用IPv6支持。
这里测试将本机11080端口转发到本机1080端口,执行的命令如下:
netsh interface portproxy add v4tov4 listenaddress=192.168.10.100 listenport=11080 connectaddress=127.0.0.1 connectport=1080
这里要注意的是,不能使用127.0.0.1
作为连接地址,但可以填写外部的IP地址(例如局域网IP),所以上述命令监听地址是192.168.10.100
。
注意:需要确保防火墙添加了对应的入站规则,开放对应的端口。
执行如下命令查看端口转发是否成功,通过查看11080端口是否有在监听进行判断:
netstat -ano | findstr :11080
TCP 192.168.10.100:11080 0.0.0.0:0 LISTENING 4160
也可以通过socket连接工具,创建TCP客户端连接测试,如果能连接,说明端口转发是成功有效的,如下所示:
创建Windows端口转发规则的数量没有限制,所有netsh接口portproxy规则都是持久性规则,并存储在系统中,即使系统重启也不影响,但如果被转发的端口关闭了,则会失效需要重新创建规则。
删除端口转发规则的命令如下:
netsh interface portproxy delete v4tov4 listenaddress=192.168.10.100 listenport=11080
清楚所有当前端口转发规则的命令如下:
netsh interface portproxy reset
显示系统中的转发规则列表的命令如下:
netsh interface portproxy show all
如果要将传入的TCP连接转发到另一台计算机,则命令如下所示:
netsh interface portproxy add v4tov4 listenport=3389 listenaddress=0.0.0.0 connectport=3389 connectaddress=192.168.10.101
此规则会将所有传入的RDP请求(到端口3389)从此计算机重定向到IP地址为192.168.10.101的远程计算机。
要解决上述kafka遇到问题或者重定向问题,需要先额外在网络接口上添加一个和要转发地址一样的IP,这样才可以成功创建端口转发规则,实现正常访问。
此外,在某些情况下,在Windows Server 2012 R2中,端口转发规则仅在重新启动系统之前有效,并在重新启动后将其重置。在这种情况下,需要检查网络接口上是否存在定期断开连接,以及操作系统启动时IP地址是否更改(最好使用静态IP)。解决方法是,我必须在Windows调度程序添加netsh接口portproxy规则脚本,以便系统启动时运行。
在Windows Server 2003 / XP中,还必须在注册表项HKLM \ SYSTEM \ ControlSet001 \ Services \ Tcpip \ Parameters 中将IPEnableRouter参数设置为1。
参考来源:Windows OSHub