linux安全技术与防火墙(iptables)

1.安全技术概述

  • 入侵检测系统(Intrusion Detection Systems):特点是不阻断任何网络访问,量化、定位来自内外网络的威胁情况,主要以提供报警和事后监督为主,提供有针对性的指导措施和安全决策依据,类 似于监控系统一般采用旁路部署(默默的看着你)方式。
  • 入侵防御系统(Intrusion Prevention System):以透明模式工作,分析数据包的内容如:溢出攻击、拒绝服务攻击、木马、蠕虫、系统漏洞等进行准确的分析判断,在判定为攻击行为后立即予以 阻断,主动而有效的保护网络的安全,一般采用在线部署方式。(必经之路)
  • 防火墙( FireWall ):隔离功能,工作在网络或主机边缘,对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件,基本上的实现都是默 认情况下关闭所有的通过型访问,只开放允许访问的策略,会将希望外网访问的主机放在DMZ (demilitarized zone)网络中

防水墙

广泛意义上的防水墙:防水墙(Waterwall),与防火墙相对,是一种防止内部信息泄漏的安全产品。 网络、外设接口、存储介质和打印机构成信息泄漏的全部途径。防水墙针对这四种泄密途径,在事前、事 中、事后进行全面防护。其与防病毒产品、外部安全产品一起构成完整的网络安全体系。

2.防火墙

Linux系统的防火墙:IP信息包过滤系统,它实际上由两个组件netfilter和 iptables组成。

(netfilter是linux内核中的一个子系统,采用模块化设计,具有良好的可扩展性,提供扩展各种网络服务的机构化底层框架)

主要工作在网络层,针对IP数据包。体现在对包内的IP地址、端口、协议等信息的处理上。

2.1 防火墙的分类

按保护范围划分:

  • 主机防火墙:服务范围为当前一台主机
  • 网络防火墙:服务范围为防火墙一侧的局域网

按实现方式划分:

  • 硬件防火墙:在专用硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现,如:华为, 山石hillstone,天融信,启明星辰,绿盟,深信服, PaloAlto , fortinet, Cisco, Checkpoint, NetScreen(Juniper2004年40亿美元收购)等
  • 软件防火墙:运行于通用硬件平台之上的防火墙的应用软件,Windows 防火墙 ISA --> Forefront

按网络协议划分:

  • 网络层防火墙:OSI模型下四层,又称为包过滤防火墙
  • 应用层防火墙/代理服务器:proxy 代理网关,OSI模型七层

2.2 包过滤防火墙

网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制列表(ACL),通过检查数据流中每个数据的源地址,目的地址,所用端口号和协议状态等因素,或他们的组合来确定是否 允许该数据包通过

优点: 对用户来说透明,处理速度快且易于维护

缺点: 无法检查应用层数据,如病毒等

2.3 应用层防火墙

应用层防火墙/代理服务型防火墙,也称为代理服务器(Proxy Server)

将所有跨越防火墙的网络通信链路分为两段

内外网用户的访问都是通过代理服务器上的"链接"来实现优点:在应用层对数据进行检查,比较安全

缺点:增加防火墙的负载

提示:现实生产环境中所使用的防火墙一般都是二者结合体,即先检查网络数据,通过之后再送到应用 层去检查

3 Linux 防火墙的基本认识

3.1 iptables & netfilter

iptables

  • 位于/sbin/iptables
  • 用来管理防火墙规则的工具称为Linux防火墙的"用户态"
  • 它使插入、修改和删除数据包过滤表中的规则变得容易

netfilter

  • 位于Linux内核中的包过滤功能体系
  • CentOS7默认的管理防火墙规则的工具(Firewalld)
  • 称为Linux防火墙的"内核态"(内核空间)
  • 是内核的一部分,由一些数据包过滤表组成,这些表包含内核用来控制数据包过滤处理的规则集。

3.2 四表五链

iptables由五个表table和五个链chain以及一些规则组成:

四表

raw表 确定是否对该数据包进行状态跟踪。包含两个规则链,OUTPUT、PREROUTING
mangle表 修改数据包内容,用来做流量整形,给数据包设置标记。包含五个规则链,INPUT、 OUTPUT、 FORWARD、 PREROUTING、 POSTROUTING
nat表 负责网络地址转换,用来修改数据包中的源、目标IP地址或端口。包含三个规则链,OUTPUT、 PREROUTING、 POSTROUTING
filter表 负责过滤数据包,确定是否放行该数据包(过滤)。包含三个规则链,INPUT、 FORWARD、 OUTPUT

五链

INPUT 处理入站数据包,匹配目标IP为本机的数据包。
OUTPUT 处理出站数据包,一般不在此链上做配置。
FORWARD 处理转发数据包,匹配流经本机的数据包。
PREROUTING链 在进行路由选择前处理数据包,用来修改目的地址,用来做DNAT。相当于把内网服务器的IP和端口映射到路由器的外网IP和端口上。
POSTROUTING链 在进行路由选择后处理数据包,用来修改源地址,用来做SNAT。相当于内网通过路由器NAT转换功能实现内网主机通过一个公网IP地址上网
  • 规则表之间的顺序

raw->mangle>nat->filter

  • 规则链之间的顺序
  1. 入站: PREROUTING>INPUT
  2. 出站:OUTPUT>POSTROUTING
  3. 转发: PREROUTING>FQRWARD>POSTROUTING
  • 规则链内的匹配顺序
  1. 按顺序依次检查,匹配即停止 (LOG策略例外)
  2. 若找不到相匹配的规则,则按该链的默认策略处理
  • 三种报文流向
  1. 流入本机:PREROUTING --> INPUT-->用户空间进程
  2. 流出本机:用户空间进程 -->OUTPUT--> POSTROUTING
  3. 转发:PREROUTING --> FORWARD --> POSTROUTING

3.3 内核中数据包的传输过程

  1. 当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要 转送出去
  2. 如果数据包是进入本机的,数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后, 任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链,然后到达
  3. 如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出

4.防火墙工具 iptables

Linux 的防火墙体系主要工作在网络层,针对 TCP/IP 数据包实施过滤和限制,属于典型的包过滤防火墙(或称为网络层防火墙)。Linux 系统的防火墙体系基于内核编码实现, 具有非常稳定的性能和高效率,也因此获得广泛的应用。

由软件包iptables提供的命令行工具,编写规则,再将规则发送给netfilter,让其处理数据包

centos7默认使用firewalld防火墙,没有安装iptables,若想使用iptables防火墙,必须先关闭firewalld防火墙, 再安装iptables

iptables防火墙的配置方法:

1、使用iptables命令行。

2、使用system-config-firewall centso7不能使用 centos 6可以使用

命令格式:

css 复制代码
iptables  [-t 表名]  管理选项   [链名]   [匹配条件]   [-j 控制类型]
​
        -t   nat  filter    如果不指定  默认是filter

其中,表名、链名用来指定 iptables 命令所操作的表和链,未指定表名时将默认使用 filter 表;

管理选项:表示iptables规则的操作方式,如插入、增加、删除、查看等; 匹配条件:用来指定要处理的数据包的特征,不符合指定条件的数据包将不会处理; 控制类型指的是数据包的处理方式,如允许、拒绝、丢弃等。

注意事项: 不指定表名时,默认指filter表 不指定链名时,默认指表内的所有链 除非设置链的默认策略,否则必须指定匹配条件 选项、链名、控制类型使用大写字母,其余均为小写

4.1 数据包的常见控制类型

对于防火墙,数据包的控制类型非常关键,直接关系到数据包的放行、封堵及做相应的日志记录等。在 iptables 防火墙体系中,最常用的几种控制类型如下

- ACCEPT 允许数据包通过
- DROP 直接丢弃数据包,不给出任何回 应信息
- REJECT 拒绝数据包通过,必要时会给数据发送端一个响应信息
- LOG 在/var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则
- SNAT 修改数据包的源地址
- DNAT 修改数据包的目的地址
- MASQUERADE 伪装成一个非固定公网IP地址

防火墙规则的"匹配即停止"对于 LOG 操作来说是一个特例,因为 LOG 只是一种辅助 动作,并没有真正处理数据包。

4.1.11添加、查看、删除规则等基本操作表

注意下面只有两个是小写,n和v,其余均需要大写

-A 在指定链末尾追加一条 iptables -A INPUT (操作)
-I 在指定链中插入一条新的,未指定序号默认作为第一条 iptables -I INPUT (操作)
-P 指定默认规则 iptables -P OUTPUT ACCEPT (操作)
-D 删除 iptables -t nat -D INPUT 2 (操作)
-p 服务名称 icmp tcp
-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 (操作)
-N 新加自定义链
-X 清空自定义链的规则,不影响其他链 iptables -X
-Z 清空链的计数器(匹配到的数据包的大小和总和)iptables -Z
-S 看链的所有规则或者某个链的规则/某个具体规则后面跟编号

列出(fliter)表中的所有链 iptables -L

一般常用iptables -vnL

4.2添加新的防火墙规则

css 复制代码
添加新的防火墙规则时,使用管理选项"-A"、"-I",前者用来追加规则,后者用来插入规则
​
[root@localhost ~]#iptables -t filter -A INPUT -p icmp -j REJECT 
//此规则指定了filter表中的INPUT链添加规则,不允许其他主机ping本机(icmp协议)
​
​

4.3 查看规则表

scss 复制代码
iptables [-t表名] -n -L [链名] |[-- line-numbers]
查看已有的防火墙规则时,使用管理选项"-L",结合"--line-numbers"选项还可显示各条规则在链内的顺序号
iptables - [vn]L
//注意:不可以合写为-Ln
​
[root@localhost ~]#iptables -t filter -vnL
0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
//内有许多规则,可以看到刚刚添加禁止ping本机规则
​

4.4 删除,清空,替换

css 复制代码
替换:
iptables -A INPUT -s 192.168.82.101 -j DROP
iptables -R INPUT 1 -s 192.168.82.101 -j ACCEPT 
​
//需要知道规则序号,将原来禁止82.101访问替换为允许
​
删除
iptables -D INPUT 5
​
​
清空指定链或表中的所有防火墙规则,使用管理选项"-F"
iptables -F INPUT
//清空 filter 表 INPUT
​
注意事项:
1.若规则列表中有多条相同的规则时,按内容匹配只删除的序号最小的一条
2.按号码匹配删除时,确保规则号码小于等于已有规则数,否则报错
3.按内容匹配删数时,确保规则存在,否则报错
​

4.5 设置默认策略

css 复制代码
iptables 的各条链中,默认策略是规则匹配的最后一个环节------当找不到任何一条能够匹配数据包的规则时,则执行默认策略。默认策略的控制类型为 ACCEPT(允许)、DROP(丢弃)两种
​
iptables [-t表名] -P <链名> <控制类型>
​
iptables -P FORWARD DROP
//将 filter 表中 FORWARD 链的默认策略设为丢弃
​
一般在生产环境中设置网络型防火墙、主机型防火墙时都要设置默认规则为DROP,并设置白名单
拒绝所有前  先将22端口放开
​
需要注意的是,当使用管理选项"-F"清空链时,默认策略不受影响。因此若要修改默认 策略,必须通过管理选项"-P"重新进行设置。另外,默认策略并不参与链内规则的顺序编排, 因此在其他规则之前或之后设置并无区别
​

4.6 通用匹配

arduino 复制代码
直接使用,不依赖于其他条件或扩展,包括网络协议、IP地址、网络接口等条件。
协议匹配: -p协议名
地址匹配: -s 源地址、-d目的地址
可以是IP、网段、域名、空(任何地址)
接口匹配: -i入站网卡、-o出站网卡
​
iptables -A FORWARD ! -p icmp -j ACCEPT
//在FORWARD链中添加规则,除了icmp协议都允许,感叹号"!"表示取反
iptables -A INPUT -s 192.168.1.10 -j DROP
//在INPUT链中添加规则,拒绝所有82.101的流量
iptables -I INPUT -i ens33 -s 192.168.1.0/24 -j DROP
//拒绝来自网卡ens33的192.168.1.0网段访问
​
​

4.7 默认策略

css 复制代码
iptables -A INPUT -s 192.168.82.1 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT 
iptables -A INPUT -j REJECT
最后一条加入拒绝,形成白名单
​

4.8 隐含扩展

iptables 在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块

要求以特定的协议匹配作为前提,包括端口、TCP标记、ICMP类型等条件。 端口匹配: --sport 源端口、--dport 目的端口 //可以是个别端口、端口范围

scss 复制代码
--source-port, --sport port[:port]:匹配报文源端口,可为端口连续范围
--destination-port,--dport port[:port]:匹配报文目标端口,可为连续范围
--tcp-flags mask comp
     mask 需检查的标志位列表,用,分隔 , 例如 SYN,ACK,FIN,RST
     comp 在mask列表中必须为1的标志位列表,无指定则必须为0,用,分隔tcp协议的扩展选项
--tcp-flags SYN,ACK,FIN,RST SYN 表示要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0,第一次握手
--tcp-flags SYN,ACK,FIN,RST SYN,ACK 第二次握手
//错误包   
​
--tcp-flags ALL ALL  
--tcp_flags ALL NONE
--sport 1000          匹配源端口是1000的数据包
--sport 1000:3000     匹配源端口是1000-3000的数据包
--sport :3000         匹配源端口是3000及以下的数据包
--sport 1000:         匹配源端口是1000及以上的数据包
注意: --sport和--dport 必须配合-p <协议类型>使用
端口可以使用的范围 0-65535
​
[root@localhost ~]#iptables -A INPUT -p tcp  --sport 10000:30000 -j REJECT 
10000到30000端口的包全部被拒绝
​
[root@localhost ~]#iptables -I INPUT -i ens33 -p tcp --tcp-flags FIN,RST,ACK SYN -j ACCEPT
//丢弃SYN请求包,放行其他包
​

4.9 ICMP

类型匹配: --icmp-type ICMP类型 #可以是字符串、数字代码 "Echo- Request" (代码为8)表示请求 "Echo- Reply" (代码为0)表示回复 "Dest ination-Unreachable" (代码为3)表示目标不可达 关于其它可用的ICMP协议类型,可以执行"iptables -p icmp -h"命令,查看帮助信息

css 复制代码
[root@localhost ~]#iptables -A INPUT -p icmp --icmp-type 8 -j DROP 
//禁止其它主机ping本机
​
[root@localhost ~]#iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT 
//允许本机ping其它主机
​
[root@localhost ~]#iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT  //当本机ping不通其它主机时提示目标不可达
​
//此时其它主机需要配置关于icmp协议的控制类型为REJECT
[root@localhost ~]#iptables -A INPUT -p icmp -j REJECT
​
​
/icmp 协议的扩展选项
[!] --icmp-type {type[/code]|typename}
 type/code
 0/0   echo-reply icmp应答
 8/0   echo-request icmp请求
 
 

4.10 显示扩展模块

显示扩展即必须使用-m选项指明要调用的扩展模块名称,需要手动加载扩展模块

4.10.1 multiport扩展

以离散方式定义多端口匹配,最多指定15个端口

css 复制代码
--source-ports,--sports port[,port|,port:port]...
指定多个源端口 逗号隔开
--destination-ports,--dports port[,port|,port:port]...
指定多个目标端口 逗号隔开
--ports port[,port|,port:port]...
多个源或目标端
​
[root@localhost ~]#iptables -t filter -A INPUT -s 192.168.1.10 -p tcp --dport 22,80 -j REJECT
iptables v1.4.21: invalid port/service `22,80' specified
Try `iptables -h' or 'iptables --help' for more information.
//不支持离散的端口号
​
[root@localhost ~]#iptables -A INPUT  -s 192.168.1.10 -p tcp -m multiport --dports 22,80 -j REJECT
//阻止 ip地址来自192.168.82.101  访问当前机器 的tcp  22 80端口
​
​

4.10.2 iprange扩展

指明连续的(但一般不是整个网络)ip地址范围

css 复制代码
--src-range from[-to] 源IP地址范围
--dst-range from[-to] 目标IP地址范围
​
​
[root@localhost ~]#iptables -A INPUT  -m iprange --src-range 192.168.1.100-192.168.1.103 -j REJECT 
/指定源地址为192.168.1.100-192.168.1.103三个地址无法访问
​

4.10.3 mac地址

mac 模块可以指明源MAC地址,,适用于:PREROUTING, FORWARD,INPUT chains

格式:-m mac --mac-source XX:XX:XX:XX:XX:XX

css 复制代码
[root@localhost ~]#iptables -A INPUT -m mac --mac-source 00:0c:29:8e:80:24 -j REJECT
//拒绝源mac地址为00:0c:29:8e:80:24访问
​

4.10.4 string字符串

对报文中的应用层数据做字符串模式匹配检测

css 复制代码
--algo {bm|kmp} 字符串匹配检测算法
 bm:Boyer-Moore           算法
 kmp:Knuth-Pratt-Morris   算法
​
--from offset 开始查询的地方
--to offset   结束查询的地方
​
​
--string pattern 要检测的字符串模式
--hex-string pattern要检测字符串模式,16进制格式
​

4.10.5 数据包结构

一般一个完整的数据包从第63个字符开始才是真正的数据包内容,详细可以查询数据包结构

typescript 复制代码
[root@localhost ~]#echo "www.bilibili.com" > /var/www/html/index.html
//自行建立一个网页
​
[root@localhost ~]#iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --from 62 --string "bilibili" -j REJECT
//注意:请求的包不带字符,回复的包带字符  所以要 output
当这个包内有bilibili的字符串时,拒绝连接
​

4.10.6 time模块

根据将报文到达的时间与指定的时间范围进行匹配

--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期

--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] --timestart hh:mm[:ss] 时间

--timestop hh:mm[:ss] --monthdays day[,day...] 每个月的几号

--weekdays day[,day...] 星期几,1 -- 7 分别表示星期一到星期日

--kerneltz:内核时区(当地时间),不建议使用,CentOS 7版本以上系统默认为 UTC

注意: centos6 不支持kerneltz ,--localtz指定本地时区(默认)

less 复制代码
[root@localhost ~]#date
2023年 08月 24日 星期日 16:32:21 CST
[root@localhost ~]#date -u
2023年 08月 24日 星期日 08:32:34 UTC
​
[root@localhost ~]#iptables -A INPUT  -m time --timestart 14:00 --timestop 16:00 -j REJECT 
//拒绝14:00到16:00数据段的访问
​

4.10.7 connlimit扩展

根据每客户端IP做并发连接数数量匹配

可防止Dos(Denial of Service,拒绝服务)攻击

--connlimit-upto N //连接的数量小于等于N时匹配

--connlimit-above N //连接的数量大于N时匹配

css 复制代码
[root@localhost1 ~]#iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 2 -j REJECT 
//当连接数超过2时,拒绝访问
​

4.10.8 state状态

状态类型

常见连接状态 含义
NEW 新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
ESTABLISHED :NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态(响应请求或者已建立连接的,连接态)
RELATED 与已有连接有相关性的(如FTP主被动模式的数据连接),衍生态,一般与ESTABLISHED 配合使用(新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系)
INVALID 不能被识别属于哪个连接或没有任何状态(无效的连接,如flag标记不正确)
UNTRACKED 未进行追踪的连接,如:raw表中关闭追踪
css 复制代码
--state state
 
ipatables  -A INPUT -m state --state   NEW            -j  REJECT
新用户无法访问
ipatables  -A INPUT  -m state --state  ESTABLISHED    -j   ACCEPT
                  

4.11 保存规则

使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限

持久保存规则:

javascript 复制代码
iptables-save > /PATH/TO/SOME_RULES_FILE

加载规则

css 复制代码
iptables-restore < /PATH/FROM/SOME_RULES_FILE
iptables-restore选项
-n, --noflush:不清除原有规则
-t, --test:仅分析生成规则集,但不提交

开机自动重载规则

用脚本保存各个iptables命令;让此脚本开机后自动运行

.bashrc

/etc/rc.d/rc.local文件添加

javascript 复制代码
iptables-save > /opt/iptables
vim ~/.basrc
iptables-restore < /opt/iptables

5.NAT

NAT: network address translation

支持PREROUTING,INPUT,OUTPUT,POSTROUTING四个链

请求报文:修改源/目标IP,

响应报文:修改源/目标IP,根据跟踪机制自动实现

NAT的实现分为下面类型:

  • SNAT:source NAT ,支持POSTROUTING, INPUT,让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装,请求报文:修改源IP
  • DNAT:destination NAT 支持PREROUTING , OUTPUT,把本地网络中的主机上的某服务开放给外部网络访问(发布服务和端口映射),但隐藏真实IP,请求报文:修改目标IP
  • PNAT: port nat,端口和IP都进行修改

5.1 SNAT

当我私网地址去访问 外网时,由于公网上没有私网网段,所以无法通信,

需要借助snat 技术 将 源地址私网网段 转换成公网网段 静态nat 需要 一一对应

5.1.1 SNAT原理与应用:.

  • SNAT 应用环境:

局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由)

  • SNAT原理:

源地址转换,根据指定条件修改数据包的源IP地址,通常被叫做源映谢

5.1.2 SNAT转换前提条件:

  1. 局域网各主机已正确设置IP地址、子网掩码、默认网关地址
  1. Linux网关开启IP路由转发
  1. linxu系统本身是没有转发功能 只有路由发送数据

所以需要linux网关开启ip路由转发

bash 复制代码
临时打开:
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  #读取修改后的配置

SNAT:基于nat表的target,适用于固定的公网IP

5.1.3 SNAT选项

  • to-source [ipaddr[-ipaddr]][:port[-port]]

  • random

注意,需要开启ip_forward

ini 复制代码
永久打开:
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1    将此行写入配置文件
保存退出
sysctl -p  读取修改后的配置
csharp 复制代码
SNAT转换1:固定的公网IP地址:
​
[root@node2 ~]#iptables -t nat -A POSTROUTING  -s  192.168.1.0/24  -o ens33 -j SNAT --to 12.0.0.1
#交给网关
[root@localhost ~]#iptables -t nat -A POSTROUTING -s  192.168.1.0/24 -o ens37 -j SNAT --to 12.xxxxx
                                                     内网地址             出站网卡               外网ip 或地址池
​
​
SNAT转换2:非固定的公网IP地址:
iptables -t nat -A POSTROUTING -s 12.0.0.0/24 -d 192.168.1.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -s  192.168.1.0/24 -o ens37 -j MASQUERADE
​

5.2 DNAT

5.2.1 DNAT原理与应用环境:

  • DNAT原理:

目的地址转换,根据指定条件修改数据包的目的IP地址,保证了内网服务器的安全,通常被叫做目的映谢。

  • DNAT应用环境:

    在Internet中发布位于局域网内的服务器

5.2.2 DNAT转换前提条件:

  1. 局域网的服务器能够访问Internet
  2. 网关的外网地址有正确的DNS解析记录
  3. Linux网关开启IP路由转发

内网有一个 网页服务器 想要给外网用户访问

外网用户直接访问私网是访问不了 公网没有 私网网段地址

需要借助 DNAT 技术 将 私网地址 映射成 公网地址:80

访问公网地址:80 等于 访问 私网地址:80

csharp 复制代码
DNAT转换1:发布内网的Web服务
//把从ens37进来的要访问web服务的数据包目的地址转换为192.168.1.10
[root@localhost ~]#iptables -t nat  -A PREROUTING -i ens36 -s 12.0.0.1 -p tcp --dport 80 -j DNAT --to 192.168.1.10
[root@localhost ~]#iptables -t nat -A POSTROUTING  -o ens36 -s 192.168.1.0/24  -j SNAT --to 12.0.0.1
[root@localhost ~]#iptables -t nat -A POSTROUTING -s 192.168.1.10 -o ens36 -j MASQUERADE 
​
[root@localhost ~]#iptables -t nat -A PREROUTING -d 12.0.0.1 -p tcp --dport 80 -i ens36 -j DNAT --to 192.168.1.10:80
//若 端口也可以指定
​

6.SNAT和DNAT实操

三台主机模拟,使用SNAT和DNAT技术实现内外网连接

三台主机原配置:

内网服务器:192.168.1.10/24

网关服务器:192.168.1.100/24

外网服务器:192.168.1.110/24

后续配置修改如下图:

6.1 网关服务器配置

6.2 内网服务器配置

6.3 外网服务器端配置

6.4 在网卡服务器中添加SNAT规则

6.5 SNAT测试

内网ping外网

6.6 在网关服务器添加DNAT规则并测试

6.6.1 查看访问日志

相关推荐
爱吃喵的鲤鱼2 分钟前
linux进程的状态之环境变量
linux·运维·服务器·开发语言·c++
dessler14 分钟前
Linux系统-ubuntu系统安装
linux·运维·云计算
AskHarries1 小时前
Java字节码增强库ByteBuddy
java·后端
荒Huang1 小时前
Linux挖矿病毒(kswapd0进程使cpu爆满)
linux·运维·服务器
佳佳_1 小时前
Spring Boot 应用启动时打印配置类信息
spring boot·后端
许野平2 小时前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
hjjdebug3 小时前
linux 下 signal() 函数的用法,信号类型在哪里定义的?
linux·signal
其乐无涯3 小时前
服务器技术(一)--Linux基础入门
linux·运维·服务器
Diamond技术流3 小时前
从0开始学习Linux——网络配置
linux·运维·网络·学习·安全·centos
斑布斑布3 小时前
【linux学习2】linux基本命令行操作总结
linux·运维·服务器·学习