背景
最近搭建的一个centos7的开发环境只能通过vpn才能访问,为了降低vpn证书发放数,方便管理,决定通过端口转发方式来实现。首先找一台有外部访问权限的机器,在上面安装vpn客户端,这里使用pritunl-client来实现,通过它来访问开发环境;接着再通过端口转发的方式来将开发环境的服务暴露出来。下面将详细说明。
过程
端口转发有很多方式,笔者以前用过haproxy, nginx。但这些方式适用http服务,如要转发mysql、rabbmitMQ服务等,可能就会有断连或不够稳定,需重启haproxy。这次决定换个方式。
隧道模式
刚开始我们采用ssh tunnel模式,也就是常说的隧道模式。映射有远端和本地模式两种,实际就是参数位置不用而已。我们采用本地方式,即通过-L来做映射。为了观察进程方便,还利用screen来保留ssh工作进程。 下面是具体步骤:
# 安装screen
yum install screen -y
# 接着配置隧道, 先建一个窗口,叫db
screen -S db
# 然后配置隧道
# -N 表示不打开远程shell; —L表示本地侧,可以有多个;0.0.0.0表示接入地址没限制;冒号后是要转发的服务地址和端口; root@db-135是代理的服务器,这里用了ssh config来进行了配置
ssh -N -L 0.0.0.0:36000:10.7.0.135:3316 -L 0.0.0.0:36001:10.7.0.135:5672 -L 0.0.0.0:36002:10.7.0.135:15672 -L 0.0.0.0:36003:10.7.0.135:16379 root@db-135
# 然后按ctrl+a+d 退出当前的窗口
# 通过如下指令查看端口是否绑定
lsof -i:36000
# 通过如下指令查看各窗口
screen -ls
# 通过如下指令进入指定窗口
screen -r [窗口名]
用了一段时间后,发现ssh隧道模式也不够稳定,所以我们又决定采用iptables方式
iptables
先通过如下指令检查iptables
systemctl status iptables
如没有服务,就需通过如下指令来安装iptables
yum install iptables-services -y
安装完后,就可用iptables命令来配置端口转发了。为了管理方便,将指令配置到/etc/sysconfig/iptables文件里。下面是摘录
# PREROUTING来用设置本地端口和转发服务的端口之间的映射,-p -m用来指定转发协议,-dport配置转发端口,-j表示接收,--to-destination是转发的服务和端口
# PREROUTING 需配多个,在文件里每个要转发的服务端口都有一行记录
-A PREROUTING -p tcp -m tcp --dport 36000 -j DNAT --to-destination 10.7.0.135:3316
#POSTROUTING是回路配置,这是必须的,否则就无法交互。 -d 设置转发的地址段,-m 表示多端口,通过冒号设定端口范围,--to-source后的ip是vpn client的虚ip, 可通过ip addr 或 ifconfig查到
#POSTROUTING 通过地址段和端口段,在文件里可配一条
-A POSTROUTING -d 10.7.0.0/24 -p tcp -m multiport --dport 3316:65535 -j SNAT --to-source 192.168.243.3
配置完,保存退出,通过如下指令重启即生效
systemctl restart iptables
经过验证,iptables比ssh的隧道更稳定
小结
相比haproxy, iptables通过7层协议的链路层来实现,更稳定可靠。Haproxy用到了协议的应用层。这就是为什么docker也用iptables做转发的原因。