Linux入门攻坚——37、Linux防火墙-iptables-3
私网地址访问公网地址的问题,请求时,目标地址是公网地址,可以在公网路由器中进行路由,但是响应报文的目的地址是私网地址,此时在公网路由器上就会出现问题。公网地址访问私网地址的问题,需要先访问一个公网的地址,由公网地址在转换为私网地址。解决的方法有: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,是程序名。
相关文章:
Linux入门攻坚——37、Linux防火墙-iptables-3
私网地址访问公网地址的问题,请求时,目标地址是公网地址,可以在公网路由器中进行路由,但是响应报文的目的地址是私网地址,此时在公网路由器上就会出现问题。公网地址访问私网地址的问题,需要先访问一个公网…...
微服务架构面试内容整理-安全性-Spring Security
Spring Security 是 Spring 框架中用于实现认证和授权的安全模块,它提供了全面的安全解决方案,可以帮助开发者保护 Web 应用、微服务和 API 免受常见的安全攻击。以下是 Spring Security 的主要特点、工作原理和使用场景: 主要特点 1. 身份认证与授权: 提供多种认证方式,…...
新的服务器Centos7.6 安装基础的环境配置(新服务器可直接粘贴使用配置)
常见的基础服务器配置之Centos命令 正常来说都是安装一个docker基本上很多问题都可以解决了,我基本上都是通过docker去管理一些容器如:mysql、redis、mongoDB等之类的镜像,还有一些中间件如kafka。下面就安装一个 docker 和 nginx 的相关配置…...
深度学习:广播机制
广播机制(Broadcasting)是 PyTorch(以及其他深度学习框架如 NumPy)中的一种强大功能,它允许不同形状的张量进行逐元素操作,而不需要显式地扩展张量的维度。广播机制通过自动扩展较小的张量来匹配较大张量的…...
音视频入门基础:FLV专题(25)——通过FFprobe显示FLV文件每个packet的信息
音视频入门基础:FLV专题系列文章: 音视频入门基础:FLV专题(1)——FLV官方文档下载 音视频入门基础:FLV专题(2)——使用FFmpeg命令生成flv文件 音视频入门基础:FLV专题…...
Openstack7--安装消息队列服务RabbitMQ
只需要在控制节点安装 安装RabbitMQ yum -y install rabbitmq-server 启动RabbitMQ并设置开机自启 systemctl start rabbitmq-server;systemctl enable rabbitmq-server 创建 rabbitmq 用户 并设置密码为 000000 rabbitmqctl add_user rabbitmq 000000 如果你不慎创错了…...
day55 图论章节刷题Part07([53.寻宝]prim算法、kruskal算法)
前言:使用最小生成树的方法解决将所有节点连接起来所需的最小路径问题。 prim算法 Prim算法是一种贪心算法,从任意一个顶点开始构建最小生成树。每次选择当前已加入生成树的顶点中,距离最近的尚未加入生成树的顶点,直到所有顶点…...
LeetCode 93-复制 IP地址
题目链接:LeetCode93 欢迎留言交流,每天都会回消息。 class Solution {//定义结果集,返回最终结果List<String> rs new ArrayList<>();public List<String> restoreIpAddresses(String s) {//将字符串包装为可变长度的字…...
海底捞点单
单点锅底推荐: 番茄锅底通31 牛油麻辣通44 清汤麻辣备44 菌汤锅底通31 小吃&主食: 捞派捞面一黄金小馒头一茴香小油条 红糖枇杷一小酥肉 DIY锅底推荐: 1.寿喜锅:海鲜味酱4勺陈醋1勺蚝油2勺盐适量白糖7勺 芹菜1勺 2.麻辣锅底…...
It’s All About Your Sketch: Democratising Sketch Control in Diffusion Models
翻译: 摘要 本文揭示了草图在扩散模型中的潜力,解决了生成式人工智能中直接草图控制的虚假承诺。我们重要的是使这个过程更加普及,让业余的草图也能生成精确的图像,真正实现“你画的就是你得到的”。一项初步研究强调了这一研究的…...
Java基础-组件及事件处理(下)
(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 面板组件 说明 常见组件 JScrollPane常用构造方法 JScrollPane设置面板滚动策略的方法 JScrollPane滚…...
npm list -g --depth=0(用来列出全局安装的所有 npm 软件包而不显示它们的依赖项)
您提供的命令 npm list -g --depth0 是在 Node Package Manager (npm) 的上下文中使用的,用来列出全局安装的所有 npm 软件包而不显示它们的依赖项。 这是它的运作方式: npm list -g --depth0-g: 指定列表应包括全局安装的软件包。--depth0: 限制树形结…...
深度学习:nn.Linear
nn.Linear 是 PyTorch 中的一个线性层(全连接层),用于将输入张量从一个维度空间映射到另一个维度空间。具体来说,nn.Linear 执行以下操作: outputinputweightTbias 其中: input 是输入张量。 weight 是权重…...
大数据新视界 -- 大数据大厂之 Impala 性能提升:高级执行计划优化实战案例(下)(18/30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...
常用的Anaconda Prompt命令行指令
一、环境管理 查看已安装的环境 conda env list 或 conda info --envs:列出所有已安装的Anaconda环境。 创建新环境 conda create -n env_name pythonx.x:创建一个名为env_name的新环境,并指定Python版本为x.x。 激活环境 conda activate env…...
如何低成本、零代码开发、5分钟内打造一个企业AI智能客服?
传统客服因员工效率低、时段需求波动大、数据管理费时费力等管理难题,导致难以满足用户需求,无法深入挖掘客服数据价值,造成客源流失。而智能体搭建的“智能客服”能借助大模型和知识库知识,助力实现数字化运营,破解企…...
全网最全最新最细的MYSQL5.7下载安装图文教程
一、MYSQL两种安装包格式 MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的。zip格式相当于绿色版,不需要安装,只需解压缩之后就可以使用了,但是要进行配置。msi格式是安装版。 二、MYSQL官网下载 1.官网地址…...
NoSQL数据库与关系型数据库的主要区别
NoSQL数据库与关系型数据库在多个方面存在显著区别,以下是对这些主要区别的详细描述: 一、数据存储模型 关系型数据库:使用表格形式存储数据,每个表格由行和列组成,行表示记录,列表示字段。数据之间的关系…...
ubuntu24.04安装matlab失败
又是摸鱼摆烂的一天,好难过~ 官方教程:https://ww2.mathworks.cn/help/install/ug/install-products-with-internet-connection.html 问题描述:https://ww2.mathworks.cn/matlabcentral/answers/2158925-cannot-install-matlab-r2…...
Oracle 11g rac 集群节点的修复过程
Oracle 11g rac 集群节点的修复过程 目录 Oracle 11g rac 集群节点的修复过程一、问题的产生二、修复过程1、执行 roothas.pl 命令2、执行 root.sh 命令3、查看集群信息4、查看节点2的IP地址5、查看节点2的监听信息 一、问题的产生 用户的双节点 Oracle 11g rac 集群ÿ…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
