端口转发:Rinetd简化虚拟化网络配置(另附:Windows系统端口转发)
目录开场白Rinetd简介快速使用转发规则访问控制日志管理开场白虚拟化平台(libvirt+qemu-kvm、vmware、Hyper-V、VirtualBox等)将虚机接入网络的方式基本上就三种:Bridge、NAT、Host-Only。而默认的Virtual Network是NAT模式。就目前的云平台而言,默认也是private network,然后通过绑定floating IP对外提供服务。
目录
开场白
虚拟化平台(libvirt+qemu-kvm、vmware、Hyper-V、VirtualBox等)将虚机接入网络的方式基本上就三种:Bridge、NAT、Host-Only。而默认的Virtual Network是NAT模式。
就目前的云平台而言,默认也是private network,然后通过绑定floating IP对外提供服务。
不管是Linux Bridge、openvswitch方式实现桥接,其配置都比默认网络增加了不少。而我们可以通过Rinetd工具实现网络转发,在默认Virtual Network的情况下,依然可以对外提服务访问。比如:将22、3389、8080等端口转发出去。
注意:经在生产环境上使用,高并发场景下rinetd性能差(rinetd 没有使用epoll,而是用了select),低并发场景或者测试环境下可以使用。优点:简单易用。
Rinetd简介
Rinetd 是一个 TCP 连接重定向工具,将TCP连接从一个IP:Port重定向到另一个(UDP应该不行[未验证])。rinetd是一个单进程服务,它可以处理到地址/端口对的任意数量的连接。这些address/port pairs通过/etc/rinetd.conf文件指定。由于rinetd使用非阻塞I/O作为单个进程运行,因此它能够重定向大量连接,而不会对计算机造成严重影响。
NOTE:Rinetd 不能用于重定向 FTP 服务,因为 FTP 服务使用了多个 socket 进行通讯。
快速使用
wget http://www.rinetd.com/download/rinetd.tar.gz
2020年写这篇文章的时候还可以下载,现在应该是下载不了了,我上传到了百度网盘:
链接:https://pan.baidu.com/s/1NPi_nKF42UMWVecfHOGVTA
提取码:3mxn
tar xvf rinetd.tar.gz
cd rinetd
make && make install
# 我通过qemu-kvm+libvirtd创建的win2016虚机,将其3389转发出去,一遍远程维护;如此就不用对虚机进行桥接网络的配置。
echo "0.0.0.0 3389 192.168.122.253 3389" > /etc/rinetd.conf
# 不指定-c 选项配置文件的情况下,Rinetd 使用默认的配置文件 /etc/rinetd.conf。
rinetd 或 rinetd -c /etc/rinetd.conf
# 停止rinetd
pkill rinetd
转发规则
Rinetd 的大部分配置都是配置转发规则,规则如下:
bindaddress bindport connectaddress connectport
绑定地址 绑定端口 转发地址 转发端口绑定地址:将绑定端口绑定到本机的哪个IP地址上,0.0.0.0:绑定到所有接口。
绑定端口:任意,保证本地端口不冲突即可。
转发地址:真实服务所在IP地址,比如:NAT方式创建虚机自动分配的地址:192.168.122.253
转发端口:真实服务的端口,比如:虚机上SSH服务暴露的端口22/tcp。
访问控制
Rinetd 使用 allow pattern 和 deny pattern 两个关键字进行访问权限的控制。如:
allow|deny pattern
例如:
allow 192.168.115.*
deny 192.168.115.1pattern 的内容:
1、必须是一个 IP 地址,不能是主机名或者域名。
2、可以使用 ? 匹配 0 - 9 的任意一个字符,
3、使用 * 匹配 0 -9 的任意个的字符。规则类型:
全局规则:在转发规则之前配置的权限规则会作为一个全局生效的规则生效;特定规则:在转发规则之后配置的权限规则仅适用于本条转发规则。
匹配优先级:
校验的过程是先校验是否能够通过全局规则,再校验特定的规则。
注册systemd服务
# cat /usr/lib/systemd/system/rinetd.service
[Unit]
Description=Rinet server daemon
After=network.target
[Service]
Type=forking
ExecStart=/usr/sbin/rinetd
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/usr/bin/pkill rinetd
[Install]
WantedBy=multi-user.target
systemctl start rinetd ---启动rinetd服务
systemctl restart rinetd ---重启rinetd服务
systemctl stop rinetd ---停止rinetd服务
systemctl enable rinetd ---设置rinetd开机自启动
systemctl reload rinetd ---修改/etc/rinetd.conf之后,重新加载配置
日志管理
Rinetd 可以产生使用制表符分隔的日志或者 Web 服务器下的通用日志格式。默认情况下,Rinetd 不产生日志,如果需要获取日志,需要添加配置:
logfile log-file-location
例如:
logfile /var/log/rinetd.log日志格式如下:
01/Dec/2020:17:40:34 192.168.115.223 0.0.0.0 3389 192.168.122.253 3389 1299 1839 done-remote-closed
01/Dec/2020:17:42:42 192.168.115.223 0.0.0.0 3389 192.168.122.253 3389 41402 275600 done-remote-closed
Windows上进行端口转发
如上所述,测试环境下,使用rinetd既方便又轻量,可谓佳品。但是Windows上怎么做端口转发呢?可以使用Windows自带的netsh工具进行端口转发,也很易用!
NOTE:1、必须使用管理员权限,否则执行命令将无效;2、只对TCP端口进行转发,对于UDP端口将不起作用;
管理员权限启动powershell,执行netsh进入交互视图:
#查看当前的端口转发策略
netsh>interface portproxy show all#使用10.10.26.98上的22端口转发172.16.11.193:22002端口
netsh>interface portproxy add v4tov4 listenaddress=10.10.26.98 listenport=22 connectaddress=172.16.11.193 connectport=22002# 使用本地22端口转发 192.168.10.249:22
netsh interface portproxy set v4tov4 listenaddress=127.0.0.1 listenport=22 connectaddress=192.168.10.249 connectport=22
验证:(只能本地请求22端口)
netstat -ano |findstr 22
TCP 127.0.0.1:22 0.0.0.0:0 LISTENING 4656
如上,只能本机访问,如若其他地址访问,则
netsh interface portproxy set v4tov4 listenaddress=10.10.26.98 listenport=22 connectaddress=192.168.10.249 connectport=22
或
netsh interface portproxy set v4tov4 listenport=22 connectaddress=192.168.10.249 connectport=22# listenaddress地址可以任意配置,但是没有路由表项支持,肯定是不可达的。所以必须配置为Windows本机上的IP地址。
# 如若想实现Windows本机对外访问 A:PortA,重定向到 B:PortB,也是可以实现的:
netsh interface portproxy set v4tov4 listenaddress=A listenport=PortA connectaddress=B connectport=PortB
devmgmt.msc ==>操作 ==>添加过时硬件 ==>安装我手动从列表选择的硬件 ==>网络适配器 ==>厂商:Microsoft,KM-Test环回适配器 ;然后在该适配器上配置IP地址为:A#删除上述设置的端口转发策略
netsh>interface portproxy delete v4tov4 listenaddress=10.10.26.98 listenport=22
或
netsh interface portproxy delete v4tov4 listenaddress=127.0.0.1 listenport=22#删除所有端口转发策略
netsh>interface portproxy reset
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)