目录
一、概述
Linux的防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制。属于典型的包过滤防火墙。linux系统的防火墙体系基于内核编码实现,具有非常稳定的性能和极高的效率,因此获得广泛的应用。
netfilter 指的是linux内核中实现包过滤防火墙的内部结构,不以程序或文件的形式存在,属于“内核态”又称内核空间的防火墙功能体系
iptables:指的是用来管理linux防火墙的命令程序,通常位于/sbin/iptables目录下,属于“用户态”又称用户空间的防火墙管理体系
iptables的作用是为包过滤机制的实现提供规则,通过各种不同的规则,告诉netfilter对来自某些源,前往某些目的或具有某些协议特征的数据包应该如何处理,为了更加方便的组织和管理防火墙规则,iptables采用了表和链的分层结构
高并发的时候,iptables影响性能,一般使用硬件防火墙
二、结构
其中,每个规则表相当于内核空间的一个容器,根据规则集的不同用途划分为默认的四个表,在每个表容器内又包括不同的规则链,根据处理数据包的不同时机划分为五种链
1.iptables的四表五链结构
iptables的作用是为包过滤机制的实现提供规则,通过各种不同的规则,告诉netfilter对来自某些源,前往某些目的或具有某些协议特征的数据包应该如何处理,为了更加方便的组织和管理防火墙规则,iptables采用了表和链的分层结构
所以它会对请求的数据包的包头数据进行分析,根据我们预先设定的规则进行匹配来决定是否可以进入主机
其中,每个规则表相当于内核空间的一个容器,根据规则集的不同用途划分为默认的四个表,在每个表容器内又包括不同的规则链,根据处理数据包的不同时机划分为五种链
1.1四表
filter 根据具体的规则要求决定如何处理一个数据包(确定是否放行该数据包),filter 表对应的内核模块为 iptable_filter,表内包含三个链,即 INPUT、FORWARD、 OUTPUT。
nat 用来修改数据包的ip地址(源、目标),端口号等信息
mangle 用来修改数据包的服务类型、生命周期,或者设置mark标记实现流量整形等高级应用
raw 主要用来决定是否对数据包进行状态跟踪
1.2五链
INPUT 当收到访问防火墙本机地址的数据包时,应用此链中的规则
OUTPUT 当防火墙本机向外发送数据包时,应用此链中的规则
FORWARD 当接收到需要通过防火墙中转发送给其他地址的数据包时,应用此链中的规则
PREROUTING 在对数据包做路由选择之前,应用此链中的规则
POSTROUTING 在对数据包做路由选择之后,应用此链中的规则
1.3包过滤的匹配流程
规则表应用顺序:raw→mangle→nat→filter
规则链的应用顺序取决于数据的流向
入站数据流向:PREROUTING→路由选择→INPUT→应用程序
转发数据流向:PREROUTING→路由选择→FORWARD→POSTROUTING
出站数据流向:OUTPUT→路由选择→POSTROUTING
1.4规则链内部的处理规则
按第一条规则……第二条规则的顺序进行匹配处理,遵循“匹配即停止”的原则,
一旦找到一条匹配规则将不再检查后续的其他规则,如果一直找不到匹配的规则,就按默认规则处理。
默认规则用iptables -L查看,规则链后面出现(policy ACCEPT)即是默认放行
默认策略不参与链内规则的顺序编排
-F清空链时,默认策略不受影响
[root@localhost ~]# which iptables
/usr/sbin/iptables
注意:需要先关闭firewalld防火墙否则会跟iptables起冲突
需要先安装iptables-services软件(yum安装,默认系统自带iptables命令)
安装完需设定开机自启
三、基本语法
iptables 【-t 表名】 【管理选项】【链名】【匹配条件】 【-j 控制类型】
【-t 表名】如果不指定表名,默认是filter表
iptables后面必须先指定表名然后才是链名
1.管理选项
管理选项 用法示例
-A 在指定链末尾追加一条 iptables -A INPUT
-I 在指定链中插入一条新的,未指定序号默认作为第一条 iptables -I INPUT
-P 指定默认规则 iptables -P OUTPUT ACCEPT
-D 删除 iptables -t nat -D INPUT
-R 修改、替换某一条规则 iptables -t nat -R INPUT
-L 查看 iptables -t nat -L
-n 所有字段以数字形式显示(比如任意ip地址是0.0.0.0而不是anywhere,比如显示协议端口号而不是服务名) iptables -L -n,iptables -nL,iptables -vnL
-v 查看时显示更详细信息,常跟-L一起使用
--line-number 规则带编号 iptables -t nat -L -n --line-number /iptables -t nat -L --line-number
-F 清除链中所有规则 iptables -F
-X 清空自定义链的规则,不影响其他链 iptables -X
-Z 清空链的计数器(匹配到的数据包的大小和总和)iptables -Z
-S 查看链的所有规则或者某个链的规则/某个具体规则后面跟编号 iptables -t nat -S、iptables -t nat -S POSTROUTING 1
2.控制选项(需大写)
ACCEPT 允许数据包通过
REJECT 拒绝数据包通过,必要时会给数据包发送端一个响应信息
DROP 直接丢弃数据包,不给任何回应
LOG 在/var/log/messages文件中记录日志信息,然后将数据包给下一条规则,它本身不处理数据包
3.案例
查看filter表中的所有规则
iptables -L
查看链中的条目以数字形式
iptables -L -n --line-number
查看filter表中所有规则并显示详情
[root@localhost ~]# iptables -vnL
Chain INPUT (policy ACCEPT 16471 packets, 3082K bytes)
pkts bytes target prot opt in out source destination
4.iptables各字段解读
pkts:对应规则匹配到的报文的个数。
bytes:对应匹配到的报文包的大小总和。
target:规则对应的target,往往表示规则对应的"动作",即规则匹配成功后需要采取的措施。
prot:表示规则对应的协议,是否只针对某些协议应用此规则。
opt:表示规则对应的选项。
in:表示数据包由哪个接口(网卡)流入,我们可以设置通过哪块网卡流入的报文需要匹配当前规则。
out:表示数据包由哪个接口(网卡)流出,我们可以设置通过哪块网卡流出的报文需要匹配当前规则。
source:表示规则对应的源头地址,可以是一个IP,也可以是一个网段。
destination:表示规则对应的目标地址。可以是一个IP,也可以是一个网段。
packages:匹配到的包数量
bytes:匹配到的总字节数
4.1案例
[root@localhost ~]# iptables -t nat -S //查看nat表中所有链的所有规则
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A POSTROUTING -s 192.168.122.0/24 -d 224.0.0.0/24 -j RETURN
-A POSTROUTING -s 192.168.122.0/24 -d 255.255.255.255/32 -j RETURN
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p udp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE
[root@localhost ~]# iptables -t nat -S INPUT //查看nat表中INPUT链的所有规则
-P INPUT ACCEPT
[root@localhost ~]# iptables -t nat -S POSTROUTING 1 //查看nat表中POSTROUTING链的第一条规则
-A POSTROUTING -s 192.168.122.0/24 -d 224.0.0.0/24 -j RETURN
iptables -I INPUT -j DROP //如果给filter表增加一条INPUT链的DROP规则,这时xshell立即就会断掉,因为它立即生效
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- anywhere anywhere
4.2添加规则
iptables -I INPUT -j ACCEPT //给filter表添加再第一条规则,允许所有数据包访问本机,这时xshell就可以连接了,因为-I选项默认在开头插入规则
[root@localhost ~]# iptables -L --line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- anywhere anywhere
2 DROP all -- anywhere anywhere
4.3丢弃规则
[root@localhost ~]# iptables -P INPUT DROP //给filter表INPUT链设置默认规则为丢弃所有,注意INPUT DROP之间不用-j了
[root@localhost ~]# iptables -L
Chain INPUT (policy DROP) //这里policy就会变成DROP
target prot opt source destination
ACCEPT all -- anywhere anywhere
DROP all -- anywhere anywhere
[root@localhost ~]# iptables -D INPUT -j DROP //删除INPUT链的规则
[root@localhost ~]#
[root@localhost ~]# iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere
删除规则可以直接写编号比较方便也可直接指定删除的条目比较麻烦,不知道条目用--line-number看一下
[root@localhost ~]# iptables -D INPUT 2
4.4清空filter表中所有规则、计数器
iptables -F
iptables -X
iptables -Z
给filter表添加一条规则,允许来自192.168.245.1的数据包访问本机,-s表示指定源
[root@localhost ~]# iptables -A INPUT -s 192.168.245.1 -j ACCEPT
再追加一条规则,不允许192.168.245.211的数据包访问本机
[root@localhost ~]# iptables -A INPUT -s 192.168.245.211 -j DROP
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 192.168.245.1 anywhere
DROP all -- 192.168.245.211 anywhere
[root@server ~]# ping 192.168.245.100 //192.168.245.211主机无法ping通本主机了没有任何回显
PING 192.168.245.100 (192.168.245.100) 56(84) bytes of data.
[root@localhost ~]# iptables -D INPUT 2 //删除DROP这条规则
[root@localhost ~]# iptables -A INPUT -s 192.168.245.211 -j REJECT //重新写规则指定动作为REJECT
[root@localhost ~]#
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 192.168.245.1 anywhere
REJECT all -- 192.168.245.211 anywhere reject-with icmp-port-unreachable
[root@server ~]# ping 192.168.245.100 //再次ping本主机发现有回显了,显示不可达
PING 192.168.245.100 (192.168.245.100) 56(84) bytes of data.
From 192.168.245.100 icmp_seq=1 Destination Port Unreachable
From 192.168.245.100 icmp_seq=2 Destination Port Unreachable
From 192.168.245.100 icmp_seq=3 Destination Port Unreachable
[root@localhost ~]# iptables -R INPUT 2 -s 192.168.245.211 -j ACCEPT //修改规则为允许,此时192.168.245.211可以ping通本主机了,修改规则时需要指定链和编号
[root@localhost ~]# iptables -F INPUT //清空INPUT链所有规则
5.防火墙规则匹配
通用匹配(协议匹配、地址匹配、网络接口匹配)
协议匹配:iptables编写协议匹配的规则时用-p指定协议名,如tcp、udp、icmp和all
[root@localhost ~]# iptables -A INPUT -p icmp -j REJECT //不允许任何主机ping本主机
[root@localhost ~]# iptables -A OUTPUT -p icmp -j REJECT //不允许本主机ping任何其他主机
[root@localhost ~]# iptables -A INPUT ! -p icmp -j DROP //丢弃除icmp之外的其他连接,!表示取反
C:\Users\shengjie>ping 192.168.245.100 //真机ping虚拟机可以通,但xshell断连
正在 Ping 192.168.245.100 具有 32 字节的数据:
来自 192.168.245.100 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.245.100 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.245.100 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.245.100 的回复: 字节=32 时间<1ms TTL=64
[root@localhost ~]# iptables -I INPUT -p tcp -j ACCEPT //在开头添加一条规则指定放通tcp协议,这时xshell可以连了
地址匹配:iptables编写地址匹配的规则时用 -s:表示源地址,-d:表示目标地址
iptables -I INPUT -s 192.168.100.200 -p icmp -j REJECT 不允许192.168.100.200这个主机ping本主机
iptables -I INPUT -s 192.168.100.0/24 -j DROP 禁止192.168.100.0网段的所有主机的所有连接
[root@localhost ~]# iptables -A OUTPUT -d 192.168.245.211 -p icmp -j DROP //丢弃ping 192.168.245.211的数据包
[root@localhost ~]# ping 192.168.245.211
PING 192.168.245.211 (192.168.245.211) 56(84) bytes of data.
ping: sendmsg: 不允许的操作
[root@localhost ~]# ping 192.168.245.2 //其他地址可以ping通
PING 192.168.245.2 (192.168.245.2) 56(84) bytes of data.
64 bytes from 192.168.245.2: icmp_seq=1 ttl=128 time=0.089 ms
网络接口匹配:iptables编写地址匹配的规则时用 -i 进站接口名和 -o 出站接口名的形式
iptables -A INPUT -i ens33 -s 192.168.100.0/24 -j DROP 丢弃来自192.168.100.0网段并且从ens33接口进入的数据包
有可能不是主机型防火墙,网络型防火墙有两个网卡,既连公网又连私网的情况需要指定出入接口
[root@localhost ~]# iptables -A INPUT -i ens33 -j DROP //所有从ens33网卡进来的数据包都被丢弃,所以xshell会断连
隐含匹配(端口匹配、icmp类型匹配)
端口匹配:编写端口匹配规则时使用“--sport 源端口”或“--dport 目标端口”的形式,针对的协议为tcp或udp,单个端口号或者以冒号分隔的端口范围都是可以的,但是不连续的端口不可以用冒号表示
[root@localhost ~]# iptables -A INPUT -p tcp --dport 22 -s 192.168.245.211 -j DROP //不允许211主机ssh到本机,指定端口之前一定要指定协议
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- 192.168.245.211 anywhere tcp dpt:ssh
[root@localhost ~]# iptables -A INPUT -p tcp --dport 20:21 -s 192.168.245.211 -j DROP
[root@localhost ~]# iptables -A INPUT -p udp --dport 67:68 -s 192.168.245.211 -j DROP
[root@localhost ~]#
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- 192.168.245.211 anywhere tcp dpt:ssh
DROP tcp -- 192.168.245.211 anywhere tcp dpts:ftp-data:ftp
DROP udp -- 192.168.245.211 anywhere udp dpts:bootps:bootpc
[root@localhost ~]# iptables -vnL
Chain INPUT (policy ACCEPT 35 packets, 2252 bytes)
pkts bytes target prot opt in out source destination
7 420 DROP tcp -- * * 192.168.245.211 0.0.0.0/0 tcp dpt:22
0 0 DROP tcp -- * * 192.168.245.211 0.0.0.0/0 tcp dpts:20:21
0 0 DROP udp -- * * 192.168.245.211 0.0.0.0/0 udp dpts:67:68
icmp类型匹配:编写icmp类型匹配规则时使用“--icmp-type ICMP类型”的形式,针对的协议是icmp
icmp类型:
Echo-Request:代码为8
Echo-Reply:代码为0
例:允许本机ping别的主机但是不允许别的主机ping本机
iptables -A INPUT -p icmp --icmp-type 8 -j DROP //也可以直接写echo-request
显示匹配:这种匹配方式要求有额外的内核模块提供支持,必须手动以“-m 模块名称”的形式调用相应的模块
多端口匹配、ip范围匹配、mac地址匹配、状态匹配
多端口匹配:编写多端口匹配时使用“-m multiport --dports 端口列表” “-m multiport --sports 端口列表” 的形式
iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT 允许开放25,80,110,143端口,以便访问邮件和网站服务
iptables -I INPUT -p tcp --dport 20:21 -j ACCEPT 开放ftp访问,冒号表示端口的范围从20-21端口
iptables -A INPUT -p tcp -m multiport --dport 20,21 -j ACCEPT 开放ftp访问的另一种方法,写成多端口模式,端口之间用逗号分隔
*这里--dport和--dports都可以
[root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dport 80,22 -s 192.168.245.0/24 -j ACCEPT
ip范围匹配:编写ip地址范围匹配时使用“-m iprange --src-range IP范围” “-m iprange --dst-range IP范围” 的形式
iptables -A FORWARD -p tcp -m iprange --src-range 192.168.100.110-192.168.100.150 -j REJECT 不允许192.168.100.110-192.168.100.150范围的主机经过防火墙转发数据包
[root@localhost ~]# iptables -A INPUT -p icmp -m iprange --src-range 192.168.245.1-192.168.245.211 -j ACCEPT
mac地址匹配:编写mac地址匹配规则时使用“-m mac --mac-source MAC地址”
iptables -A INPUT -m mac --mac-source 00:0c:29:52:c0:ae -j DROP 不允许mac地址为00:0c:29:52:c0:ae的任何访问
iptables -R INPUT 1 -m mac --mac-source 00:0c:29:52:c0:ae -j REJECT 虽然拒绝访问但是会给一个主机无法到达的回应
状态匹配:编写iptables规则时使用“-m state --state 连接状态”的形式
常用的连接状态:
NEW:想要新建立联机的封包状态
ESTABLISHED:已经联机成功的联机状态
RELATED:表示这个封包是与我们主机发送出去的封包有关, 可能是响应封包或者是联机成功之后的传送封包!这个状态很常被设定,因为设定了他之后,只要未来由本机发送出去的封包,即使我们没有设定封包的 INPUT 规则,该有关的封包还是可以进入我们主机, 可以简化相当多的设定规则,比如FTP
INVALID:无效的封包,例如数据破损的封包状态
iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT 允许响应请求的连接放行
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
防火墙规则的保存
iptables-save //查看当前规则
默认存放路径:/etc/sysconfig/iptables
iptables-save > /etc/sysconfig/iptables //保存到默认配置文件下次重启不会丢失
[root@localhost ~]# systemctl stop iptables.service //停止iptables服务会清空所有规则
四、SNAT和DNAT
1.SNAT原理与应用
SNAT 应用环境:局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由)
SNAT原理:源地址转换,根据指定条件修改数据包的源IP地址,通常被叫做源映谢
SNAT转换前提条件:
1.局域网各主机已正确设置IP地址、子网掩码、默认网关地址
2.Linux网关开启IP路由转发
linxu想系统本身是没有转发功能 只有路由发送数据
临时打开:
echo 1 > /proc/sys/net/ipv4/ip_forward
或
sysctl -w net.ipv4.ip_forward=1
永久打开:
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 #将此行写入配置文件
sysctl -p #将取修改后的配置
注:还有一种方式静态路由,这个就比较麻烦
1.1SNAT转换
SNAT转换1:固定的公网IP地址:
#配置SNAT策略,实现snat功能,将所有192.168.100.0这个网段的ip的源ip改为10.0.0.1
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j SNAT --to 10.0.0.1
可换成单独IP 出站 外网网卡 外网IP
或
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j SNAT --to-source 10.0.0.1-10.0.0.10
内网IP 出站 外网网卡 外网IP或地址池
SNAT转换2:非固定的公网IP地址(共享动态IP地址):
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
小知识扩展:
一个IP地址做SNAT转换,一般可以让内网100到200 台主机实现上网。
2.DNAT原理与应用
DNAT应用环境:在Internet中发布位于局域网内的服务器
DNAT原理:目的地址转换,根据指定条件修改数据包的目的IP地址,保证了内网服务器的安全,通常被叫做目的映射。
DNAT转换前提条件
1.局域网的服务器能够访问Internet
2.网关的外网地址有正确的DNS解析记录
3. Linux网关开启IP路由转发
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
2.1DNAT转换
DNAT转换1:发布内网的Web服务
#把从ens37进来的要访问web服务的数据包目的地址转换为192.168.100.16
iptables -t nat -A PREROUTING -i ens37 -d 10.0.0.1 -p tcp --dport 80 -j DNAT --to 192.168.100.16
或 入站 公网IP 内网服务器IP
iptables -t nat -A PREROUTING -i ens37 -d 10.0.0.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.13
入站 公网IP 端口 内网服务器IP
注:默认时80
回包
iptables -t nat -A POSTROUTING -s 192.168.100.16 -o ens37 -j SNAT --to 10.0.0.1
内网IP 出站外网网卡 外网地址
可以现场做个域名解析
入站外网网卡外网IP
内网服务器IP
iptables -t nat -A PREROUTING -i ens37 -p tcp --dport 80 -j DNAT --to 192.168.100.13-192.168.100.20
地址段
DNAT转换2:发布时修改目标端口
#发布局域网内部的OpenSSH服务器,外网主机需使用250端口进行连接
iptables -t nat -A PREROUTING -i ens37 -d 10.0.0.1 -p tcp --dport 250 -j DNAT --to 192.168.100.13:22
入站外网网卡 外网IP 外网远程端口 内网IP和远程端口号
#在外网环境中使用SSH测试
ssh -p 250 root@10.0.0.1
yum -y install net-tools #若没有ifconfig 命令可提前使用yum 进行安装
ifconfig ens33
iptables -nvL -t nat 查看
注意:使用DNAT时,同时还有配合SNAT使用,才能实现响应数据包的正确返回
小知识扩展:
主机型防火墙主要使用INPUT、OUTPUT链,设置规则时一般要详细的指定到端口
网络型防火墙主要使用FORWARD链,设置规则时很少去指定到端口,一-般指定到IP地址或者到网段即可
防火墙规则的备份和还原
导出(备份)所有表的规则.
iptables-save > /opt/ipt.txt
导入(还原)规则
iptables-restore < /opt/ipt.txt
将iptables规则文件保存在/etc/sysconfig/iptables中,iptables服务启动时会自动还原规则
iptables-save > /etc/sysconfig/iptables
systemctl stop iptables #停止iptables服务会清空掉所有表的规则
systemctl start iptables #启动iptables服务会自动还原/etc/sysconfig/iptables中的规则
tcpdump tcp -i ens33 -t -s 0 -C 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap
(1)tcp: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型
(2)-i ens33 : 只抓经过接口ens33的包
(3)-t : 不显示时间戳
(4)-s 0: 抓取数据包时默认抓取长度为68字节。加上-s0后可以抓到完整的数据包
(5)-c 100 :只抓取100个数据包
(6)dst port ! 22 : 不抓取目标端口是22的数据包
(7)src net 192.168.1.0/24 : 数据包的源网络地址为192.168.1.0/24
(8)-w ./target.cap : 保存成cap文件,方便用ethereal(即wireshark)分析
五、部署
1.SNAT
准备三台机器
Centos7-9 防火墙
Ens33 192.168.100.100 内网pc网关
Ens36 10.0.0.5 外网服务器网关
Centos7-10 外网
Ens33 10.0.0.100
Win10 内网客户机
Ip 192.168.100.37
网关 192.168.100.100
防火墙
内网客户机
Ping通网关
编辑防火墙 /etc/sysctl.conf
net.ipv4.ip_forward = 1
检查
配置防火墙规则
首先清空
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens36 -j SNAT --to 10.0.0.5
ping通内网客户机
内网客户机
访问外网
2.Dnat
准备三台机器
外网pc 10.0.0.100
网关 10.0.0.5
防火墙
Centos 7-10
Ens36 外网网关 10.0.0.5
Ens33 内网网关 192.168.100.100
Centos7-9
Ens33 内网服务器 192.168.100.16
网关 192.168.100.100
防火墙清空规则
iptables -t nat -A PREROUTING -i ens36 -d 10.0.0.5 -p tcp --dport 80 -j DNAT --to 192.168.100.16
抓包
配置出站
iptables -t nat -A POSTROUTING -s 192.168.100.16 -o ens33 -j SNAT --to 10.0.0.5
DNAT转换2:发布时修改目标端口
发布局域网内部的OpenSSH服务器,外网主机需使用2222端口进行连接
iptables -t nat -A PREROUTING -i ens36 -d 10.0.0.5 -p tcp --dport 2222 -j DNAT --to 192.168.100.16:22