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 集群ÿ…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
