在执行转发操作之前,确定需要转发的端口和目标主机:首先,确定需要转发的端口和目标主机。例如,如果需要将端口80上的请求转发到192.168.0.100的80端口,则需要配置转发规则。常用的转发方法有如下6中

  • iptables转发 --CentOS 7.0 以下使用
  • firewall转发 --CentOS 7.0以上使用
  • rinetd转发   --需安装
  • ncat转发     --yum install nmap-ncat -y
  • socat转发    --yum install -y socat
  • nginx转发    --需安装

以下详细介绍前两中转发(防火墙转发)的实现方法,其它的几种转发会后续继续介绍。

一、iptables转发 --CentOS 7.0 以下使用

  1. 系统开启路由转发
echo 1 > /proc/sys/net/ipv4/ip_forward
  1. 规则设置
# iptables -t nat -A PREROUTING -p tcp –dport 2201 -j DNAT –to-destination 10.6.1.114:22
# iptables -t nat -A POSTROUTING -p tcp -s 10.6.1.114 –sport 22 -j SNAT –to-source 42.162.6.44:2201

3.保存iptables

#service iptables save

4.重启iptables

#service iptables restart

iptables的4个表分别是:

filter(过滤):数据包过滤/拦截,可以包含INPUT、FORWARD、OUTPUT这3个内置chain。

nat(地址转换):IP地址或端口号转换,可以包含PREROUTING、OUTPUT、POSTROUTING 3个内置chain,nat table在会话建立时会记录转换的对应关系,同一会话的回包和后续报文会自动地址转换,这是因为nat使用了ip_conntrack模块。

mangle(包管理):用来修改IP报文,可以包含PREROUTING、OUTPUT、INPUT、FORWARD、POSTROUTING 5个内置chain。

raw:此表的优先级高于ip_conntrack模块和其它的table,主要用于将有会话状态的连接(比如tcp)的数据包排除在会话外。可以包含POSTROUTING、OUTPUT两个内置chain。

二、firewall转发 --CentOS 7.0以上使用

Firewalld是Linux系统上的一种动态防火墙管理工具,Firewalld的主要功能是管理网络连接和防止未经授权的访问。它可以对入站和出站流量进行管理,可以控制端口、服务和网络协议的访问权限,也支持NAT(网络地址转换)和端口转发等高级功能。

1、firewalld的基本使用

启动:systemctl start firewalld
查看状态:systemctl status firewa11d
停止:systemctl disable firewalld
禁用:systemctl stop firewalld
重启: systemctl restart firewa11d
开机自启动:systemctl enable firewalld

2、配置firewalld-cmd

运行firewall-cmd --list-all查看基础配置信息:

[root@localhost ~]# firewall-md --list-all
 public
 target : default
 icmp-block-inversion: no
 interfaces:
 sources:
 services: ssh dhcpv6-client
 ports : 3128/tcp 5432/tcpprotocols:
 masquerade: no
 forward-ports :
 source-ports :
 icmp-blocks :
 rich rules:
 public (default,active):表示 public区域是默认区域(当接口启动时会自动黑认〉,并且它是活动的。
 interfaces : ens33列出了这个区域上关联的接口。
 sources :列出了这个区域的源。现在这里什么都没有,但是,如果这里有内容,它们应该是这样的格式xxx.xXX.XX×.xXx/xx。
 services: dhcpv6-client ssh 列出了允许通过这个防火墙的服务。可以通过运行firewall-cmd --get-services得到一个防火墙预定义服务的详细列表。
 ports:列出了一个允许通过这个防火墙的目标端口。它是用于你需要去允许一个没有在 firewalld 中定义的服务的情况下。
 masquerade: no表示这个区域是否允许 IP伪装。如果允许,它将允许工P转发,它可以让你的计算机作为一个路由器。
 forward-ports:列出转发的端口。
 icmp-blocks:阻塞的icmp流量的黑名单。
 rich rules:在一个区域中优先处理的高级配置。
 default:是目标区域,它决定了与该区域匹配而没有由上面设置中显式处理的包的动作。

运行以下命令理解firewall规则用法:

查看所有打开的端口: firewall-cmd --zone=public --list-port
 更新防火墙规则: firewall-cmd --reload
 列出所有区域: firewall-cmd --get-zones
 查看区域信息:firewall-cmd --get-active-zones
 设定默认区域,立即生效:firewall-cmd --set-default-zone=public
 查看指定接口所属区域: firewall-cmd --get-zone-of-interface=ens33
 查看所有规则: firewall-cmd --list-all
 通过以下两种手段可以进行永久修改:
 firewall-cmd --permanent <some modification>
 firewall-cmd --reload

3、常见使用场景

拒绝所有包:firewall-cmd --panic-on
 取消拒绝状态:firewall-cmd --panic-off
 查看是否拒绝: firewall-cmd --query-panic
 
 暂时开放ftp服务:firewall-cmd --add-service=ftp
 永久开放ftp 服务:firewall-cmd --add-service=ftp --permanent
 查询服务的启用状态:firewall-cmd --query-service ftp
 开放mysq1端口:firewall-cmd --add-service=mysq1
 阻止http端口:firewall-cmd --remove-service=http
 查看开放的服务:firewall-cmd --list-services
 查看对应规则库文件: cd /usr/lib/firewalld/services
 
 开放通过tcp访问3306: firewall-cmd --add-port=3306/tcp
 阻止通过tcp访问3306: firewall-cmd --remove-port=80tcp
 永久开放80端口:firewall-cmd --zone=public --add-port=80/tcp --permanent
 查看80端口: firewall-cmd --zone=public --query-port=80/tcp
 查看所有开放端口: firewall-cmd --zone=public --list-ports
 删除80端口: firewall-cmd --zone=public --remove-port=80/tcp --permanent
 开放postgresq1服务: firewall-cmd --add-service=postgresq1 --permanent
 
 允许http服务通过1分钟: firewall-cmd --zone=public --add-service=http --timeout=1m,这个 timeout选项是一个以秒(s)、分(m)或小时(h)为单位的时间值。
 
 重载防火墙: firewall-cmd --reload
 检查防火墙状态: firewall-cmd --state
 让设定生效:systemct1 restart firewa1ld
 检查设定是否生效: iptables -L -n l grep 21或 firewall-cmd --list-a11

4、端口转发

端口转发可以将指定地址访问指定的端口时,将流星转发至指定地址的指定端口。转发的目的如果不指定ip的话就默认为本机,如果指定了ip却没指定端口,则默认使用来源端口。 如果配置好端口转发之后不能用,可以检查下面两个问题:

比如我将80端口转发至8080端口,首先检查本地的80端口和目标的8080端口是否开放监听了

其次检查是否允许伪装IP,没允许的话要开启伪装lP

开启伪装IP:

firewall-cmd --add-masquerade --permanent
#将8888端口的流里转发至80
 firewall-cmd --add-forward-port=port=8888:proto=tcp:toport=80
 firewall-cmd --remove-forward-port=port=8888:proto=tcp:toport=80
 
 #开启伪装IP
 firewall-cmd --query-masquerade  #检查是否允许伪装IP
 firewall-cmd --add-masquerade  #允许防火墙伪装IP
 firewall-cmd --remove-masquerade  #禁止防火墙伪装IP
 
 #将8888端口的流量转发至101.37.65.91的80端口
 firewall-cmd --add-forward-port=port=8888: proto=tcp:toaddr=101.37.65.91:toport=80