Linux入门攻坚——37、Linux防火墙-iptables-3

news2025/1/6 19:08:25

私网地址访问公网地址的问题,请求时,目标地址是公网地址,可以在公网路由器中进行路由,但是响应报文的目的地址是私网地址,此时在公网路由器上就会出现问题。公网地址访问私网地址的问题,需要先访问一个公网的地址,由公网地址在转换为私网地址。解决的方法有:nat和proxy。

NAT:Network Address Translation,此技术最初是为了安全性,隐藏本地网络主机。网络层+传输层;
proxy:代理,应用层;

NAT:
  SNAT:只修改请求报文的源地址;
  DNAT:只需改请求报文的目标地址;

iptables中的nat表三个链:
  PREROUTING:DNAT在这个链上,否则目标地址是nat服务器本身,直接到INPUT去了,所以一进入就要进行地址转换。
  OUTPUT:
  POSTROUTING:只有确定了路由后,才进行地址转换(如果是访问NAT服务器本身,则不需要转换),所以SNAT在这个链上。

关于SNAT与DNAT:


SNAT是源地址转换,DNAT是目标地址转换,都是从请求报文方面来说的,因为对于一个SNAT,都会对应一个响应报文的DNAT,对于一个DNAT,都会有一个响应报文的SNAT。上图中实线是请求报文流,虚线是响应报文流。

对于SNAT,主要用于内网主机访问外网服务器,从上图可以看出,如果不经过地址转换,请求报文是可以到达外网服务器的,但是外网服务器的响应报文,因为其目的地址是内网地址CIP,所以是无法在外网中路由的,无法返回响应报文,这就是需要SNAT的原因;另一个关键问题是对于防火墙来说,这个地址转换的位置在哪?如果是在PREROUTING转换,那如果这个请求报文就是给NATServer本身的,就会出现问题,此时根本不需要转换,都在一个内网中,所以,SNAT是在路由之后,在发出报文前进行地址转换,即在POSTROUTING将CIP转换为NATServer的外网地址FIP;此时的响应报文,其目的地址就是转换后的源地址FIP,可以到达NATServer,在到达NATServer后,第一步要进行目的地址转换,将FIP转换为CIP,即在PREROUTING转换,否则,进行路由后在转换,路由的结果可能就是错误的。

对于DNAT,主要用于内网主机提供服务的情景,外网主机访问内网主机服务器,从上图可以看出,内网主机提供的服务是映射在NATServer上,外网主机访问NATServer,如果不进行目的地址转换,请求报文达到NATServer后,NATServer根本就没有这个服务,请求失败,所以要在请求报文达到NATServer时,根据转换规则,先进行目的地址转换,即将请求报文的目的地址FIP转换为CIP,转换位置在PREROUTING上,然后通过路由达到内网主机CIP,而响应报文,其源地址是内网主机的地址CIP,在路由之后,响应报文发出NATServer前,要进行源地址的转换,由CIP转换为FIP,如果不转换,响应报文是能够到达外网主机的,但是因为其响应报文的源地址是CIP,外网主机根本没给这个地址发过请求,这个响应报文会被作为异常报文,可能就丢弃了。

所以,源地址转换都是在POSTROUTING,目的地址转换都是在PREROUTING。

proxy:代理,工作于应用层,获取客户端的请求报文,完全拆解报文后,获取请求内容,在自己构建一个请求,发送给服务器,然后接收服务器的响应报文,拆解报文,在重新构建一个响应报文给客户端。

NAT实现方式:
还是使用前面的拓扑:

SNAT实现:
F2上有httpd服务器,将其假设为外网服务器,F1为内网主机,F1要访问F2上的服务。
F1(内网主机)上的路由:

7.9(NATServer)上的路由:

F2(外网服务器)上的路由:

从F1访问F2的WEB服务,在F2上抓包:
访问的结果是在F1上无法访问F2上的httpd服务的页面:

F2上的抓包:

从抓包的结果可以看到,F1的请求报文到达了F2,F2也向F1发送了响应报文,但是因为F2没有F1的路由,即没有192.168.61.0的路由,送给了默认网关192.168.147.2,响应报文无法返回。这里要注意的是请求报文的源地址是192.168.61.129,响应报文的目的地址是192.168.61.129。

想要能够访问,需在F2上增加路由:
route add -net 192.168.61.0/24 gw 192.168.147.128
此时访问成功。

从F2的httpd日志中也能看到请求访问的主机地址:

现在将F2上的路由去掉:route del -net 192.168.61.1/24 gw 192.168.147.128

此时,F1又无法访问了,请求报文能够到达F2,F2的响应报文无法返回。

在7.9上(NATServer),做SNAT:
 iptables -t nat -A POSTROUTING -s 192.168.61.0/24 ! -d 192.168.61.0/24 -j SNAT --to-source 192.168.147.128
此时,在F1上又可以访问F2的WEB服务了,但是在F2上抓包:

访问的源地址变为NATServer的地址192.168.147.128,而不是F1的地址,响应报文的目的地址也变为192.168.147.128,而不是F1的地址。这就是SNAT。

DNAT测试:
清空nat表规则:

现在假定F2是内网的主机,提供web服务,而外网的主机F1要访问内网的服务,F1是无法通过内网的IP地址直接访问F2的服务。此时需要进行目的地址转换,即DNAT。
在网关上,即NATServer上声明
iptables -t nat -A PREROUTING -d 192.168.61.128 -p tcp --dport 80 -j DNAT --to-destination 192.168.147.129

在F2上增加默认路由,route add default gw192.168.147.128
此时,F1可以访问F2的服务,即外网访问内网的服务。curl http://192.168.61.128,在F2上抓包:

可以看到,访问的目的地址是192.168.147.129,而不是192.168.61.128。这就是DNAT,目的地址转换。

因为我们只是对80端口进行了转换,所以如果F1上访问ssh服务:ssh 192.168.61.128,则访问的是NATServer本身:

将22端口进行转换:
iptables -t nat -A PREROUTING -d 192.168.61.128 -p tcp --dport 22 -j DNAT --to-destination 192.168.147.129
再次访问:

这个应该是安全的原因,类似中间人攻击。在F2上抓包:

目的地址已经进行了转换。
端口转换:将第一条规则修改为192.168.61.128转换为192.168.147.129:8080
iptables -t nat -R PREROUTING 1 -d 192.168.61.128 -p tcp --dport 80 -j DNAT --to-destination 192.168.147.129:8080

对于源地址转换,有时候外网的地址经常变动,如ADSL拨号上网,此时可以使用MASQUEREAD,进行地址伪装,此时NATServer会找到合适的IP地址进行源地址转换:
iptables -t nat -A POSTROUTING -s 192.168.147.0/24 !-d 192.168.147.0/24 -j MASQUEREAD

自定义规则链及其使用,以及常用的一些规则:

iptables -N  clean_in
iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
iptables -A clean_in -d 192.168.255.255 -p icmp -j DROP
iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP
iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
iptables -A clean_in -d 192.168.147.128 -j RETURN

iptables -A INPUT -d 192.168.147.128 -j clean_in
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

iptables -A INPUT -i eth0 -m multiport -p tcp --dports 53,113,135,137,139,445 -j DROP
iptables -A INPUT -i eth0 -m multiport -p udp --dports 53,113,135,137,139,445 -j DROP
iptables -A INPUT -i eth0 -p udp --dport 1026 -j DROP
iptables -A INPUT -i eth0 -m multiport -p tcp --dports 1433,4899 -j DROP

iptables -A INPUT -p icmp -m limit --limit 10/second -j ACCEPT

tcp_wrapper:tcp包装器

对基于tcp协议开发并提供服务的应用程序,提供的一层访问控制工具;tcp_wrapper是基于库调用实现其功能:libwrap库。

只能对本机内部程序(服务)进行访问控制。

判断服务是否能够由tcp_wrapper进行访问控制:
  1)动态编译:ldd命令;
  2)静态编译:strings命令查看应用程序文件,其结果中如果出现:hosts.allow和hosts.deny


在配置文件在为各服务分别定义访问控制规则实现访问控制:
  /etc/hosts.allow
  /etc/hosts.deny

先检查hosts.allow,后检查hosts.deny;

服务检查逻辑:
  client --> /etc/hosts.allow --> (Y) --> ALLOW
  client --> /etc/hosts.allow --> (N) --> /etc/hosts.deny --> (Y) --> DENY
                                                                                     --> (N) --> ALLOW

配置文件语法:
  daemon_list:client_list [:options]

  daemon_list:
    应用程序的文件名称,而非服务名;
    用用程序文件名称列表,彼此间使用逗号分隔;
      例如:sshd,vsftpd;  ALL表示所有服务;
  client_list:
    IP地址;
    主机名;
    网络地址:必须使用完整格式的掩码,不使用前缀格式掩码;类似192.168.0.0/16不合法;
    简短格式的网络地址:如192.168.  表示192.168.0.0/255.255.0.0
    ALL:所有主机;
    KNOWN
    UNKNOWN
    PARANOID

例如:vsftpd服务不允许192.168.147.129访问:在/etc/hosts.deny中,
vsftpd:192.168.147.129

在hosts.allow中匹配到的,允许访问,没有匹配到的,默认拒绝,然后在hosts.deny中进行匹配,deny中匹配到,则拒绝,否则,允许访问,即默认允许。

EXCEPT:除了
  hosts.allow
    vsftpd:172.16. EXCEPT 192.16.100.1
    vsftpd:172.16. EXCEPT 172.16.100.0/255.255.255.0 EXCEPT 172.16.100.1

[:options]
  deny:拒绝,主要用于hosts.allow文件中,实现deny的功能
  allow:允许,用于hosts.deny文件中,实现allow的功能
  spawn:启动额外应用程序;
vsftp:ALL :spawn /bin/echo `date` login attempt from %c to %s,%d >>/var/log/vsftpd.log
    %c:client ip  、%s:server ip 、%d:daemon name

对于telnet服务,因为在CentOS6上,是xinetd超级服务控制的,使用的deamon即不是xinetd,也不是telnetd,而是in.telnetd,是程序名。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2240191.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言的内存函数(文章后附gitee链接,模拟实现函数)

之前我们已经讲解过了字符型数据的一类字符串函数, 现在我们来讨论字符型以外的数据处理。 1:memcpy 的使用和模拟实现 void * memcpy ( void * destination, const void * source, size_t num ); 注意: 1:函数memcp…

Leetcode 整数转罗马数字

这段代码的算法思想是基于罗马数字的减法规则,将整数转换为罗马数字的字符串表示。下面是详细的解释: 算法步骤: 定义数值和符号对应关系:代码中定义了两个数组:values 和 symbols。values 数组包含了罗马数字的数值&…

【赵渝强老师】MySQL InnoDB的段、区和页

MySQL的InnoDB存储引擎的逻辑存储结构和Oracle大致相同,所有数据都被逻辑地存放在一个空间中,我们称之为表空间(tablespace)。表空间又由段(segment)、区(extent)、页(pa…

element-ui-plus给头像avatar增加头像框

template部分&#xff1a; <el-avatar shape"square" :size"50" :fit"fit":src"avatarImg"class"avatar-with-border-image"/>style部分&#xff1a; .avatar-with-border-image {position: relative;margin-top: 5px…

MySQL 忘记 root 密码,使用跳过密码验证进行登录

操作系统版本&#xff1a;CentOS 7 MySQL 忘记 root 密码&#xff0c;使用跳过密码验证进行登录 修改 /etc/my.cnf 配置文件&#xff0c;在 [mysqld] 后面任意一行添加 skip-grant-tables vim /etc/my.cnf 重启 MySQL systemctl restart mysqld 登录 MySQL&#xff08;无 -…

飞书 富文本(Markdown)

飞书机器人webhook支持Markdown格式&#xff0c;包括表格 表格 |Syntax | Description |\n|-------- | -------- |\n|Header | Title |\n|Paragraph | Text |参考 富文本&#xff08;Markdown&#xff09;

jmeter常用配置元件介绍总结之用linux服务器压测

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之用linux服务器压测 1.编写测试脚本2.执行测试脚本 1.编写测试脚本 在linux服务器上进行压测&#xff0c;由于是没有界面的&#xff0c;因此我们可以先在界面上把压测脚本写好&#xff1a; 如图&#xff1a;我这里简单的写…

记录日志中logback和log4j2不能共存的问题

本文章记录设置两个日志时候&#xff0c;控制台直接报错 标黄处就是错误原因&#xff1a;1. SLF4J(W)&#xff1a;类路径包含多个SLF4J提供程序。 SLF4J(W)&#xff1a;找到提供程序[org.apache.logging.slf4j. net]。 SLF4J(W)&#xff1a;找到提供程序[ch.qos.log .classi…

丹摩征文活动 |通过Pycharm复现命名实体识别模型--MECT模型

文章目录 &#x1f34b;1 引言&#x1f34b;2 平台优势&#x1f34b;3 丹摩平台服务器配置教程&#x1f34b;4 实操案例&#xff08; MECT4CNER-main&#xff09;&#x1f34b;4.1 MECT4CNER-main模型&#x1f34b;4.2 环境配置&#x1f34b;4.3 训练模型&#x1f34b;4.4 数据…

电脑浏览器打不开网页怎么办 浏览器无法访问网页解决方法

我们在使用电脑的时候&#xff0c;使用浏览器是经常的&#xff0c;很多用户在点开浏览器时&#xff0c;却遇到浏览器无法访问网页的情况。那么电脑浏览器打不开网页是什么原因呢&#xff1f;今天小编就给大家分享几个常见的原因和具体的解决方法&#xff0c;希望能对大家有所帮…

YOLOv11实战宠物狗分类

本文采用YOLOv11作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv11以其高效的特征提取能力&#xff0c;在多个图像分类任务中展现出卓越性能。本研究针对5种宠物狗数据集进行训练和优化&#xff0c;该数据集包含丰富的宠物狗图像样本…

Struts源码阅读——三个常用的辅助类DispatchAction

Struts源码阅读——三个常用的辅助类 紧接前文&#xff0c;我们来阅读org.apache.struts.actions包中三个常用类的源码。 DispatchAction、LookupDispatchAction 和 MappingDispatchAction 是 Struts 1 框架中的三个常用的辅助类&#xff0c;用来简化 Action 类中的请求分发。…

Linux设置Nginx开机启动

操作系统环境&#xff1a;CentOS 7 【需要 root 权限&#xff0c;使用 root 用户进行操作】 原理&#xff1a;利用 systemctl 管理服务 设置 Nginx 开机启动 需要 root 权限&#xff0c;普通用户使用 sudo 进行命令操作 原理&#xff1a;利用 systemctl 管理服务 1、新建…

C# WPF 记录DataGrid的表头顺序,下次打开界面时应用到表格中

效果&#xff1a; 代码实现 前端 <DataGrid x:Name"DataGrid1"<!--定义当列位置变化后的触发事件-->CanUserReorderColumns"True"ColumnReordered"DataGrid_ColumnReordered"rubyer:ControlHelper.FocusedForegroundBrush"{Stati…

Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型多变量回归预测

Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型多变量回归预测 目录 Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 吐血售&#xff01;聚划算&#xff01;Transforme…

面试官:如何设计一个能够支持高并发的系统?

强烈推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站:人工智能 设计一个支持高并发的系统是一个系统工程&#xff0c;涉及多个层面的优化。以下逐一展开说明&#xff1a; 1. 分布式架…

企业数字化转型指南:如何通过价值流推动业务创新与变革

在全球企业加速数字化转型的浪潮中&#xff0c;企业领导者和技术人员必须理解数字化转型的核心不只是技术的应用&#xff0c;而是业务流程的彻底重塑。根据《价值流&#xff08;Value Streams&#xff09;》中的理论框架&#xff0c;数字化转型的关键在于价值流&#xff08;Val…

知识库管理系统:企业数字化转型的加速器

在数字化转型的大潮中&#xff0c;知识库管理系统&#xff08;KBMS&#xff09;已成为企业提升效率和创新能力的关键工具。本文将探讨知识库管理系统的定义、企业建立知识库的必要性&#xff0c;以及如何快速搭建企业知识库。 知识库管理系统是什么&#xff1f; 知识库管理系统…

Python 绘图工具详解:使用 Matplotlib、Seaborn 和 Pyecharts 绘制散点图

目录 数据可视化1.使用 matplotlib 库matplotlib 库 2 .使用 seaborn 库seaborn 库 3 .使用 pyecharts库pyecharts库 注意1. 确保安装了所有必要的库2. 检查Jupyter Notebook的版本3. 使用render()方法保存为HTML文件4. 使用IFrame在Notebook中显示HTML文件5. 检查是否有其他输…

JAVA学习日记(十五) 数据结构

一、数据结构概述 数据结构是计算机底层存储、组织数据的方式。 数据结构是指数据相互之间以什么方式排列在一起的。 数据结构是为了更加方便的管理和使用数据&#xff0c;需要结合具体的业务场景来进行选择。 二、常见的数据结构 &#xff08;一&#xff09;栈 特点&…