端口映射和转发在实际应用中非常常见,比如一个局域网只有一台服务器可以被互联网访问到,那么如果想通过互联网访问局域网中其他的服务,最常用的方式就是在这一台机器上开放端口,然后转发至局域网中其他主机的端口,实现内网服务的访问,而在互联网中就好像直接使用这个服务一样没什么变化,端口转发的大致流程如下图所示:
上面这个是一个简单的示例,其中ip都是随便写的,过程很简单就是代理服务器对应的公网ip为:212.121.87.168,也就是访问公网ip就可以直接访问到37.58.1.2,同样访问18080端口就相当于内网的8080端口,这个ip和端口映射的过程是由路由器来实现的,另外在server1服务器上有一个redis服务,端口为6379,我们现在就是要实现将代理服务器的8080端口转发至server1的6379端口,直接通过访问代理服务器来实现server1 redis服务的访问. 正常情况下这类的转发过程很多工具都可以实现,比如nginx,haproxy以及linux自带的iptables或者firewalld服务都可以通过配置来实现,本文主要叙述一款rinetd的工具来实现端口转发,安装和配置都比较简单,用起来也比较好用,具体安装配置如下:
rinetd官方下载地址为:https://boutell.com/rinetd/ 进入后直接找到WHERE TO GET下载linux版本:,下载成功后接下来我们需要在代理服务器上进行安装,从而实现将端口转发至server1,分别执行下面命令安装:
tar -xvzf rinetd.tar.gz
cd rinetd/
执行编译: make
然后如果现在直接执行安装会出现/usr/man找不到的错误,因为年代比较久远的原因,默认rinetd会将帮助写入/usr/man下,而linux可能不存在/usr/man这个目录,所以会写入失败报错,现在只需要手动执行: mkdir /usr/man
然后安装: make install 即可成功,执行 rinetd -v 可以查看版本号,最新的是0.62
rinetd配置文件默认不存在需要自己手动创建,执行: vim /etc/rinetd.conf ,然后添加如下内容:
0.0.0.0 37.58.1.21
配置非常简单,第一个是rinetd绑定本地代理服务器的地址,0.0.0.0是绑定所有的网卡地址,当然也可以直接绑定ip地址即37.58.1.2;后面8080是rinetd监听的转发端口;第三个是转发到目标服务器的ip,这里是server1的地址即37.58.1.21,最后6379是转发到目标服务器的端口,这里服务为redis,这条配置生效后,会将本地8080端口收到的所有数据原封不动的发送至目标服务器的指定端口,另外需要注意目标服务器的实际ip和端口号必须被正确绑定才可以,其中ip一定不要绑定127.0.0.1而是实际ip,否则会报错. 配置完毕后就可以执行下面命令启动rinetd服务了
rinetd -c /etc/rinetd.conf
其中-c参数指定配置文件的路径,如果不加默认就是/etc/rinetd.conf,启动后查看进程正常存在并且端口正常绑定即可测试使用,这时候在内网直接连接37.58.1.2 8080或者在外网直接连接212.121.87.168 18080,应该都可以正常访问到server1上的6379了.