目录
引言
在网络世界中,IP地址就如同现实世界中的门牌号码,它为数据包指明了方向。然而,在某些情况下,出于安全、资源优化或网络拓扑的需要,我们必须对这些“门牌号码”进行变换。这就涉及到了网络地址转换(Network Address Translation, NAT)技术,而在Linux环境中,实现NAT功能的主要工具就是iptables。本文将深入探讨iptables中的两种核心NAT类型——源网络地址转换(Source Network Address Translation, SNAT)和目标网络地址转换(Destination Network Address Translation, DNAT)。
一、SNAT与DNAT简介
在Linux内核的Netfilter框架中,iptables的SNAT(源网络地址转换)和DNAT(目标网络地址转换)是两种不同的NAT类型,它们分别用于修改数据包中的源IP地址和目标IP地址。
(一)SNAT
1.SNAT的工作原理
在私有网络内部的主机试图访问外部网络时,由于它们使用的通常是未被全球路由表识别的私有IP地址,因此需要通过SNAT来伪装其源地址。SNAT发生在数据包离开本地网络边界,即将进入公网的过程中,通常是在POSTROUTING链上执行。
1.私网用户发送数据包经过网关服务器
2.网关服务器通过NAT转换,将私网IP地址转化为公网IP
3.由网关服务器将数据包发送给公网IP
4.公网地址接收到数据包后,将回包发送到网关服务器
5.网关服务器将公网IP转化为私网IP发送给客户端
2.SNAT的应用
节省公网IP资源:多个内网主机可以共享同一个公网IP地址上网。
隐藏内部网络结构:对外部网络而言,所有流量看起来都来自同一公网IP,从而增强了内网的安全性
(二)DNAT
1.DNAT的工作原理
DNAT则发生在数据包从公网向私有网络内部转发的过程中,主要作用是改变目标IP地址,使得外部请求能正确到达内部网络中提供服务的服务器。DNAT操作一般在PREROUTING链上执行。
1.1.外网服务器访问网关服务器的公网IP
1.2.网关服务将通过DNAT转换,将目的地址转换为私网地址
1.3.网关服务器发送数据包到私网地址,实现访问
2.DNAT的应用
服务发布:将公网IP映射到内网服务器,用于对外提供诸如网站、邮件等服务。
负载均衡:结合其他iptables规则和软件,可以实现简单的负载均衡,将不同类型的请求分配给不同的内部服务器处理。
二、实现NAT转换
(一)实现SNAT
网关服务器 | 192.168.83.40;12.0.0.254 |
私网客户端 | 192.168.83.30 |
公网服务端 | 12.0.0.1 |
私网客户端访问公网服务端,通过网关服务器将私网IP地址转换为公网IP,实现访问
1.配置网关服务器
添加网卡,配置网关
开启路由转发功能
临时打开
将/proc/sys/net/ipv4/ip_forward中的数字0改为1:echo 1 > /proc/sys/net/ipv4/ip_forward
或直接执行命令:sysctl -W net.ipv4.ip_forward=1
永久打开
在/etc/sysctl.conf文件中添加net.ipv4.ip_forward = 1
2.修改网关
私网客户端的网关设置为网关服务器的地址
修改完毕之后systemctl restart network 使配置生效
这个时候,ping网关服务器的两个地址都可以ping通
将公网服务器的网络模式也设置为仅主机
公网服务端的网关设置为网关服务器的地址
需要注意,在实际环境中是无法设置服务端的网关的,只能通过路由一次次转发,最后到达服务端
公网也可以ping两个地址
3.设置SNAT规则
配置网关服务器的SNAT规则
iptables -t nat -A POSTROUTING -s 192.168.83.0/24 -o ens36 -p tcp --dport 80 -j SNAT --to 12.0.0.254
-t nat:指定nat表
-A POSTROUTING:添加在POSTROUTING链
-s 192.168.83.0/24:所有来自192.168.83.0/24网段的数据包
-o ens36:从ens36网卡出去的数据
-p tcp --dport 80:匹配tcp协议80端口的数据
-j SNAT:执行SNAT动作,即改变数据包的源IP地址
--to 12.0.0.254:将满足上述条件的数据包的源IP地址更改为此特定IP地址(12.0.0.254)
#总结起来,这条规则的效果是:所有来自192.168.83.0/24子网、通过ens36接口发送到外部且目标端口为80的TCP数据包,在离开本地主机之前,其源IP地址都会被转换成12.0.0.254。这通常用于私有网络中的主机通过公网访问互联网时隐藏内部网络结构或共享公网IP地址的情况。
使用私网地址去访问公网的web服务
这个时候,在公网的web服务器的日志中,看到的访问地址,都是经过SNAT转换后的地址
(二)实现DNAT
网关服务器 | 192.168.83.40;12.0.0.254 |
私网客户端 | 192.168.83.30 |
公网服务端 | 12.0.0.1 |
公网服务端访问网关服务器,通过网关服务器将IP地址转换为私网IP,实现访问私网客户端
目前访问网关服务器,只能访问网关服务器的内容,通过访问12.0.0.254,访问到192.168.83.30
基本配置与SNAT不变,唯一需要的就是修改网关服务器的iptables规则
首先情况原先的规则,再建立新的规则
iptables -t nat -A PREROUTING -i ens36 -d 12.0.0.254 -p tcp --dport 80 -j DNAT --to 192.168.83.30
iptables -t nat:指定操作在NAT表上
-A PREROUTING:在PREROUTING链中追加一条新规则。数据包在进入本机并进行路由 决策之前,PREROUTING链上的规则会被执行
-i ens36:仅针对从名为ens36的网络接口进入的数据包应用此规则。
-d 12.0.0.254:匹配目标IP地址为12.0.0.254的数据包
-p tcp --dport 80:进一步限定仅当数据包是TCP协议且目标端口号为80时才进行转换
-j DNAT:执行DNAT动作,即改变数据包的目标IP地址
--to 192.168.83.30:将满足上述条件的数据包的目标IP地址更改为此特定IP地址(192.168.83.30)
#总结起来,这条规则的效果是:所有发往公网IP地址12.0.0.254且目标端口为80的TCP数据包,在到达本地主机并准备转发到内部网络之前,其目标IP地址都会被转换成192.168.83.30。这通常用于对外发布服务,使得外部用户可以通过公网IP访问位于私有网络内的服务器提供的服务。
这使,使用公网去访问网关服务器的公网IP就可以看到私网服务器的内容了
DNTA改变的是目的地址,所以访问的IP地址不会改变
三、Firewalld
Firewalld 服务是红帽 RHEL7 系统中默认的防火墙管理工具,特点是拥有运行时配置与永久配置选项且能够支持动态更新以及“zone”的区域功能概念,使用图形化工具 firewall-config 或文本管理工具firewall-cmd
(一)基本理论
1. 动态防火墙管理
Firewalld支持动态更改规则,这意味着无需重启服务或重载配置文件,即可即时生效新的防火墙策略。这对于需要频繁调整防火墙规则的环境来说极为便捷。
2. 区域概念
Firewalld引入了“区域”(Zone)的概念,每个区域具有不同的信任级别和预设规则。常见的区域有:
trusted:所有连接都被允许。
public:只允许基本的网络连接。
internal:适用于内部网络,允许较多的服务连接。
dmz:非军事区,允许部分外部连接。
work 和 home:针对工作和家庭网络环境的安全设置。
block:拒绝所有入站连接。
(二)文本管理基础操作
使用firewall-cmd工具
-get-default-zone | 作用 查询默认的区域名称 |
-set-default-zone=<区域名称> | 设置默认的区域,永久生效。 |
-get-zones | 显示可用的区域。 |
-get-services | 显示预先定义的服务。 |
-get-active-zones | 显示当前正在使用的区域与网卡名称。 |
-add-source= | 将来源于此IP或子网的流量导向指定的区域。 |
--remove-Source= | 不再将此IP或子网的流量导向某个指定区域 |
-add-interface=<网卡名称> | 将来自于该网卡的所有流量都导向某个指定区域。 |
-change-interface=<网卡名称> | 将某个网卡与区域做关联。 |
-list-all | 显示当前区域的网卡配置参数,资源,端口以及服务等信息。 |
-list-all-zones | 显示所有区域的网卡配置参数,资源,端口以及服务等信息。 |
-addservice=<服务名> | 设置默认区域允许该服务的流量。 |
--add-port=<端口号/协议> | 允许默认区域允许该端口的流量。 |
--remove-service=<服务名> | 设置默认区域不再允许该服务的流量。 |
--remove-port=<端口号/协议> | 允许默认区域不再允许该端口的流量。 |
--reload | 让“永久生效”的配置规则立即生效,覆盖当前的 |
1. 查看当前状态
查看Firewalld服务是否运行:systemctl status firewalld
查询当前默认区域:firewall-cmd --get-default-zone
2. 设置默认区域
例如,将默认区域设置为trusted:firewall-cmd --set-default-zone=trusted
出现success表示成功
3. 添加永久防火墙规则
允许80端口HTTP访问:firewall-cmd --permanent --add-service=http
重新加载防火墙以应用更改:firewall-cmd --reload
4. 查看与修改区域规则
查看特定区域的所有服务:firewall-cmd --list-services --zone=public
临时打开一个端口(如443):firewall-cmd --zone=public --add-port=443/tcp
5. 配置接口与区域关联
将网络接口(ens33)关联到指定区域
firewall-cmd --permanent --zone=public --change-interface=ens33
(三)图形化工具
执行firewall-config命令调出图形工具,或者从图形界面打开
1:选择”立即生效“或”重启后依然生效“配置。
2:区域列表。
3:服务列表。
4:当前选中的区域。
5:被选中区域的服务。
6:被选中区域的端口。
7.被选中区域的协议。
8.被选中区域的source proxys
9:被选中区域的伪装。
10:被选中区域的端口转发
11:被选中区域的ICMP 包。
12:被选中区域的富规则。
13:被选中区域的网卡设备。
14:被选中区域的服务,前面有V的表示允许。