编者按:当学习教学需要,将线上教学平台迁移到移动云上时,无法通过NAT 端口转发。下面笔者将介绍如何在云主机上实现端口转发的具体操作。
A 学校计划将单位的在线教学平台搬迁到移动云。在搬迁以前,A 学校用来30台虚拟服务器搭建的在线教学平台,这些服务器借助平台的负载均衡和单位的防火墙,使整个平台只需要一个出口,其它虚拟服务器提供的服务要么通过负载均衡进行端口转发,要么通过防火墙的NAT 进行端口转发。
搬迁到移动云后,A 学校租用了30 台云主机,这些云主机构成一个私有网络。租用了一个Internet 地址作为平台的出口地址,A 学校把这个地址分配给了负责负载均衡的云主机上,其它云主机只要是采用HTTP 或HTTPS协议,都可以通过这台负载均衡进行端口转发,对外提供服务。
不过,还有很多服务没有采用HTTP 或HTTPS 协议,无法通过负载均衡进行端口转发。例如,教学资源上传,教学资源下载和教学资源转换等服务,原来是通过单位防火墙的NAT 功能进行的端口转发,迁移到移动云以后,移动云平台没有提供NAT 功能,无法通过NAT 端口转发。云主机怎样才能实现端口转发呢?
NAT的英文全称是“Network Address Translat ion”(网络地址转换),其主要作用就是将私有地址转换为合法的IP 地址(Internet地址),让位于私有网络的终端设备可以访问外部网络。比较典型的应用就是家用宽带路由器,实际就是集NAT、交换机和DHCP 服务器于一体的网络设备。尽管NAT让位于私有网络的终端设备可以访问外部网络,实现共享上网,但对于位于外部网络的终端设备而言,访问不到私有网络内的终端设备。如果在私有网络中的某台设备上架设了服务,如Web服务或FTP 服务,想让位于外部网络的计算机访问这些服务,可以在NAT 上做端口转发。
NAT 不但可以实现网络地址转换,还可以实现端口转发或端口映射,当外部网络设备访问NAT的某个端口时,NAT 将数据包转发给内网对应的服务器,使外网设备实现了内网访问。
在使用NAT的私有网络中,常规的做法是让NAT 设备充当私有网络的默认网关,如家庭网络,宽带路由器的地址就是家庭网络的默认网 关。在Windows Server上配置路由和远程访问NAT服务器时,NAT 服务器地址也是私有网络的网关。
A 学校将在线教学平台搬迁到云上以后,A 学校租用的只是云主机,只能使用云平台提供商分配的网络和IP 地址。A 学校无法调整30台云主机的网络架构,不能将分配Internet 地址的云主机上部署NAT 服务器,并将其作为其它云主机的默认网关。
不能调整云主机网络架构,无法用NAT 做端口转发,那能不能仿照硬件防火墙上那样做端口转发呢?笔者检查了A 学校位于出口的那台云主机,这台云主机使用的使用Centos 7.2 操作系统,启用的是iptables 防火墙,能否用iptables 转发端口,需要进一步了解iptables的功能和基本用法。
iptables 严格说来不是真正的防火墙,而是一款工具。真正的防火墙是netfilter,它 是Linux的子系统之一,提供防火墙、网络地址转换、数据包记录、流量统计等一系列功 能。iptables 只是控制netfilter 一款工具。netfilter 和iptables 合起来构成一个功能强大的防火墙。
netfilter 主要提供了filter(过 滤)表、NAT(网络地址转换)表和mangle(修改数据包标志位)表等三张表,每张表由若干链组成,链主要用来容纳防火墙规则,默认有INPUT(入站处理)、OUTPUT(出站处理)、FORWARD(转发处理)、POSTROUTING(路由转发前的处理)和PREROUTING(路由转发后的处理)等5 种数据包处理的规则链。
1.数据包到达防火墙以后,先进入mangle 表的PREROUTING 链,此时若有规则设置,防火墙按规则设定更改数据包的TOS 等信息。
2.数据包进入NAT 表的PREROUTING 链,此时若有如有规则设置,则按规则进行目的地址转换。
3.数据包经过路由后,由路由判定该数据包是由本机处理还是转发给其它计算机或其它网络。
4.如果目的地为本机,数据包则会进入mangle 表的INPUT 链,经过处理,再进入filter 表的INPUT 链,经过相应的过滤,最后进入木机的处理进程。
5.如果是转发,则先后按照以下顺序进行处理:
(1)进入mangle 表的FORWARD 链,根据规则设置修改相应的参数。
(2)进入filter 表的FORWARD 链,根据规则设置进行过滤。
(3)进入filter 表的OUTPUT 链,根据规则设置进行过滤。
(3)进入mangle 表的POSTROUTING 链,根据规则设置修改相应的参数。
(4) 进入NAT 表的POSTROUTING 链,根据规则设置进行网络地址转换,修改数据包的源地址。
(5)最后将数据包转发给目的计算机或外部网络。
通过以上分析,无论防火墙netfilter/iptables 是否位于网关,数据包只要到达 netfilter/iptables,netfilter/iptables 都可以按照设定的规则来进行端口转发。
图1 测试环境
由于A 学校的的在线教学平台是生产环境,不能在上面直接尝试,于是笔者搭建了如图1 所示测试环境。
其中,网络192.168.143.0/24 代表云主机的私有网络,网 络172.16.5.0/24 代表外部网络。服务器A 和服务器B 代表两台云主机,服务器C 代表外部网络的计算机。服务器B 上有两块网卡,一块连接私有网络,一块连接外部网络。网络192.168.143.0/24 和网络172.16.5.0/24 之间没有路由,相互之间不能通信。在服务器A 上部署FTP 服务,在用iptables 进行端口转发前,服务器C 不能访问服务器A 上的FTP 服务。在服务器B 上配置端口转发后,如果服务器C 能访问服务器A 上的FTP 服务,说明可以用iptables 进行端口转发。
下面是基于上述测试环境,用iptables 实现端口转发的具体过程:
CentOS 7 默认的防火墙不是iptables,而是firewa lld。如果不是新系统,可以使用命令“service iptables status”检查当前系统是否已安装iptables。
如果是新部署的Centos 7 或没有安装iptables,可以用命令“yum install iptables-services” 在 线安装iptables。在线安装iptables 时,需要连接互联网。
也可以使用命令“yum install-y iptablesservices”安装iptables,两个命令的区别就是前者需要确认,后者安装时自动确认,不需要人为干预。
iptables-services 是iptables的一个服务,在线安装iptables-services 包时,若系统没有安装iptables包,会自动安装iptables。如果用命令“yum install iptables”安装iptables,还需要进一步安装iptablesservices。
因iptables 与系统自带的防火墙守护进程firewall d 有冲突。可以用命令“sys temctl stop firewalld”停用firewalld 服务。
为避免开机自动启动firewalld 服 务,影 响iptables的启动,可以用命令“systemctl mask firewalld”或“systemctl disable firewalld”禁 用firewalld服务。
这一步很重要,很多网管员或架构工程师在配置端口转发不成功的主要原因忽略了启用Linux的数据转发功能。
默认情况下,Linux 是没有启用数据转发功能的。可以使用命令sysctl 启用数据转发功能。sysctl 是一条设置或重新设置联网功能的命令,如IP 转发、IP 碎片去除以及源路由检查等。
用命令“vi/etc/sysctl.conf”编辑系统内核参数文 件“sysctl.conf”,将 其中的参数“net.ipv4.ip_forward=0”更改为“net.ipv4.ip_forward=1”。如 果“sysctl.conf”文件中没有此条参数,可以手动添加进去。
修 改“sysctl.conf”文件,启用数据转发功能后,用命令“sysctl-p”使修改的配置参数生效。
(1)用命令iptables 配置filter 表的FORWARD 链,允许转发对应的数据包。
转发源数据的命令如下:
iptables-A FORWARD-s 192.168.143.27/32-i ens224-p tcp-m tcp--sport 61021-j ACCEPT
这条命令表示允许转发来自服务器B的数据包,其中服务器B的IP 地址是“192.168.143.27”,对应网络接口是“ens224”,转发的源端口是“61021”。
转发目的数据的命令如下:
iptables-A FORWARD-d 192.168.143.27/32-o ens224-p tcp-m tcp--dport 61021-j ACCEPT
这条命令表示允许转发到服务器B的数据,其中服务器B的IP 地址是“192.168.143.27”,对应网络接口是“ens224”,转发的目的端口是“61021”。
(2)用命令iptables 配置NAT 表的PREROUTING 链,将访问服务器B的端口转发给服务器A 对应的端口。
iptables-t nat-A PREROUTING-p tcp-m tcp--dport 61021-j DNAT--to-destination 192.168.143.28:61021
(3)用命令iptables 配置nat 表的POSTROUTING 链,将访问服务器B的端口转发给服务器A 对应的端口。
-A POSTROUTING-d 192.168.143.28/32-p tcp-m tcp--dport 61021-j SNAT--to-source 192.168.143.27
添加完防火墙规则后,用命令“service iptables save”保存防火墙规则。
如果需要转发的端口数量比较多,可以使用“vi/etc/sysconfig/iptables”编辑iptables 防火墙规则文件。
例如,在本例中,为服务器A的FTP 服务配置的端口 是“61021-61026”,整 个iptables 防火墙规则配置文件如图2 所示。
配置好防火墙规则以后,可以使用命令“systemctl start iptables.service”启 动iptables 服 务,或 用命 令“systemctl restart iptables.service”重启ipt ables 服务。
默认情况下,操作系统重新启动后,不会启动iptables服务,也就不能实现端口转发。可以使用命令“systemctl enable iptables.service”将iptables 服务配置为开机启动。
图2 防火墙配置具体内容
配置好端口转发后,在服务器C 上用命令“telnet 172.16.5.143 61021”尝试能否打开端口,经测试,可以打开端口,说明端口转发配置成功。
在文件资源管理器的地址栏输入FTP 地址“ftp://172.16.5.145:61021”,提示输入用户名和密码,输入FTP的用户名和密码,可以打开FTP 共享目录。
笔者在实验环境完成iptables 端口转发测试后,在A 学校出口那台云主机上启用数据转发功能(命令“sysctl-p”),按照A 学校在线教学平台需求配置iptables 规则。完成端口转发配置后,经测试,位于云主机的在线教学平台终于可以提供在线教学服务了。