当前位置: 首页 > news >正文

探讨4层代理和7层代理行为以及如何获取真实客户端IP

准备工作

实验环境

IP角色
192.168.1.100客户端请求IP
192.168.1.100python 启动的HTTP服务
192.168.1.102nginx服务
192.168.1.103haproxy 服务

HTTP服务

这是一个简单的HTTP服务,主要打印HTTP报文用于分析客户端IP

#!/usr/bin/env python
# coding: utf-8import socket
from threading import Thread# 创建socket对象
sock_srv = socket.socket()# 绑定IP和port
sock_srv.bind(('0.0.0.0', 5001))# 开启服务
sock_srv.listen()# 定义一个函数, 处理来自客户端链接的处理
def socket_deal(conn: socket.socket, address: tuple):# 通过socket获取客户端的IP; 这里的客户端IP其实指的是TCP报文中的原始IP和原始Port# 就是上一个发起TCP发起的地址 print(address)# 打印HTTP的报文print(conn.recv(1024).decode())# 不做特殊处理,所有的请求均返回Hello Wordtemplate = """
HTTP/1.1 200 OK
Service: HTTP
Version: 1.1.2.2<h1>hello word</h1>"""conn.send(template.encode())# 关闭此次HTTP的请求conn.close()while True:# 接受Client的数据请求conn, address = sock_srv.accept()Thread(target=socket_deal, args=(conn, address)).start()

Nginx报文分析

nginx 4层代理

  • 配置启动4层代理, 并请求 http://192.168.1.102 并观察 101 的请求信息
stream {server {listen 80 ;proxy_pass 192.168.1.100:5001;  		# Python的HTTP服务# proxy_protocol on;					# 可选性, 4层携带真实IP}
}
  • 客户端请求4层转发,默认不传递客户端IP。
# print(address), 可以从socket得到客户端IP
('192.168.1.102', 52842)# 得到HTTP的报文信息如下
GET / HTTP/1.1
Host: 192.168.1.102
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
  • 客户端请求4层转发,要求传递客户端IP。
# print(address), 可以从socket得到客户端IP
('192.168.1.102', 52848)# 得到HTTP的报文信息如下,多了一行PROXY。其余信息不变
PROXY TCP4 192.168.1.100 192.168.1.102 55360 80
GET / HTTP/1.1
Host: 192.168.1.102
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9

nginx 7层代理

  • 配置文件
server {                                                                           listen       80;                                                               server_name  localhost;                                                        location / {                                                                   proxy_pass http://192.168.1.100:8000/;                                                                         # proxy_set_header X-Forwarded-For $remote_addr;   # nginx 去掉注释请求携带客户端真实IP                                }                                                                              }
  • 客户端请求7层代理,默认不传递客户端IP真实IP。
# print(address), 可以从socket得到客户端IP
('192.168.1.102', 52854)# 得到HTTP的报文信息如下.
GET / HTTP/1.0
Host: 192.168.1.100:5001
Connection: close
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
  • 客户端请求7层,要求传递客户端IP真实IP。
# print(address), 可以从socket得到客户端IP
('192.168.1.102', 52858)# 得到HTTP的报文信息如下,多了一行PROXY。其余信息不变
GET / HTTP/1.0
Host: 192.168.1.100:5001
Connection: close
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
X-Forwarded-For: 192.168.1.100

分析NGINX获取客户端IP方法

方式修改header信息是否修改原始报文获取客户端IP方式
4层转发不带客户端IP不修改不修改服务端可以获取上一层发起请求的socket 源IP, 但不是客户端真实IP
4层转发携带客户端IP不修改原始报文前增加PROXY格式内容通过PROXY内容可以获取客户端IP
7层转发不带客户端IP不修改nginx重新封装HTTP报文服务端 socket 获取
7层转发携带客户端IPnginx 通过增加header信息传递客户端IPnginx重新封装HTTP报文通过nginx封装的报文获取XFF
  1. 7层代理会对报文进行重新封装,封装过程中可以通过增加XFF的header传递客户端IP。

  2. 4层转发不会修改报文。在不修改HTTP报文前提下,前置补充代理信息, 格式: PROXY TCP 客户端IP 代理端IP 客户端端口 代理端端口

Haproxy 代理分析

Haproxy 4层代理

  • 配置
defaultsmode                    tcpfrontend  main *:80default_backend             appbackend appbalance     roundrobinserver  app1 192.168.1.100:5001 check # 不携带真实IP# server  app1 192.168.1.100:5001 send-proxy check  # 携带真实IP
  • 客户端请求4层转发,默认不要求传递客户端IP
# print(address) 获取客户端的address信息
('192.168.1.103', 56790)# 这个信息和NGINX 4层信息一样
GET / HTTP/1.1
Host: 192.168.1.103
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
  • 客户端请求4层转发,要求传递客户端IP
# print(address) 获取客户端的address信息
('192.168.1.103', 58410)# 与Nginx 4层带真实IP一样, 报文之前增加了PROXY信息
PROXY TCP4 192.168.1.100 192.168.1.103 57871 80
GET / HTTP/1.1
Host: 192.168.1.103
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9

Haproxy 7层代理

  • 配置
defaultsmode                    httpoption forwardfor       except 127.0.0.0/8   # 默认携带客户端IP,frontend  main *:80default_backend             appbackend appbalance     roundrobinserver  app1 192.168.1.100:5001 check 
  • 客户端请求7层代理,默认传递客户端IP
# print(address) 获取客户端的address信息
('192.168.1.103', 53178)# 与Nginx 7层带客户端IP一样, 报文包含X-Forwarded-For
GET /favicon.ico HTTP/1.1
Host: 192.168.1.103
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
Referer: http://192.168.1.103/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
X-Forwarded-For: 192.168.1.100
Connection: close
  • 客户端请求7层代理,注释不传递客户端IP
# print(address) 获取客户端的address信息
('192.168.1.103', 53576)# 与Nginx 7层不传递客户端IP一样, 报文包含没有X-Forwarded-For
GET / HTTP/1.1
Host: 192.168.1.103
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

分析Haproxy获取客户端IP方法

其实和nginx一样

方式修改header信息是否修改原始报文获取客户端IP方式
4层转发不带客户端IP不修改不修改服务端可以获取上一层发起请求的socket 源IP, 但不是客户端真实IP
4层转发携带客户端IP不修改原始报文前增加PROXY格式内容通过PROXY内容可以获取客户端IP
7层转发不带客户端IP不修改nginx重新封装HTTP报文服务端 socket 获取
7层转发携带客户端IPnginx 通过增加header信息传递客户端IPnginx重新封装HTTP报文通过nginx封装的报文获取XFF

案例小结

上述操作主要是完成: Nginx和Haproxy两款服务分别完成: 4层转发和7层代理。 携带IP与不携带客户端IP配置上的区别和报文展示

转发方式传递方式特点
7层代理增加HTTP报文的header信息X-Forwarded-For, 进行传递客户端IP在原始报文进行修改
4层代理在HTTP报文前方附加一层PROXY信息, 进行传递客户端IP不修改原始报文,在HTTP报文前方附加数据

提前了解一下: NGINX中参数设定protocol。开启后可以处理 “在HTTP报文前方附加数据” 混淆的HTTP报文结构

在这里插入图片描述

附伪代码获取客户端IP

#!/usr/bin/env python
# coding: utf-8
import socket
from threading import Thread# 创建socket对象
sock_srv = socket.socket()# 绑定IP和port
sock_srv.bind(('0.0.0.0', 5001))# 开启服务
sock_srv.listen()# 简单的Response结构
def response(content, status, msg, conn):template = """
HTTP/1.1 %d %s
Service: HTTP
Version: 1.1.2.2
Content-Type: text/html; charset=UTF-8
Connection: close%s  """ % (status, msg, content)return conn.send(template.encode())# 定义一个函数, 处理来自客户端链接的处理
def socket_deal(conn: socket.socket, address: tuple):try:# 通过socket获取客户端的IP; 这里的客户端IP其实指的是TCP报文中的原始IP和原始Port# 就是上一个发起TCP发起的地址_client_ip, _client_port = addressdata = conn.recv(1024).decode()# 打印HTTP的报文_data_lines = data.splitlines()# 代理模式_proxy_type = "可能HTTP代理"# header 信息收集extend_data = ["header信息", ]for line in _data_lines:# 如果4层传递客户端IP,会得到如下信息。if line.startswith('PROXY'):# PROXY TCP4 192.168.1.100 192.168.1.102 55360 80_, protocol, _c_ip, _p_ip, _c_port, _p_port = line.split()if protocol != 'TCP4':response("PROXY ERROR", 500, "PROXY_ERROR", conn)else:_proxy_type = "TCP代理"_client_ip = _c_ip# 有时候报文只收到PROXY信息, 就需要第二次接收报文信息if len(_data_lines) == 1:socket_deal(conn, (_c_ip, _c_port))return# 如果一次性收完报文信息则继续处理else:continueif ":" not in line:# 不是K:V 形式,那不是header。 可能是post数据, 也可能是HTTP协议。 此处忽略continue# 拿到header信息header_key, header_value = [item.strip() for item in line.split(":", 1)]if header_key == 'X-Forwarded-For':_client_ip = header_value# header 信息入库extend_data.append(":".join((header_key, header_value)))content = ["真实的客户端IP可能是" + _client_ip, "<br />"]content.extend(extend_data)response("<br />".join(content), 200, 'ok', conn)except Exception as e:print(e)finally:# 关闭此次HTTP的请求conn.close()while True:# 接受Client的数据请求conn, address = sock_srv.accept()Thread(target=socket_deal, args=(conn, address)).start()

实践: NGINX与HAProxy结合使用。

准备环境

IP角色标记说明
192.168.1.100客户端请求IPclient浏览器请求4层转发到后端HTTP服务
192.168.1.102NGINX实现提供4层转发NGINX-PROXY转发到104服务器
192.168.1.103Haproxy提供4层转发HAProxy4层转发到102的7层
192.168.1.104NGINX 7层服务NGINX-HTTP代表HTTP服务器。直接返回,并观察日志
  1. 启动一台NGINX HTTP服务器,扮演正常访问的网站。 代号NGINX-HTTP
  2. 另启动一台NGINX服务器,实现四层转发功能到NGINX HTTP服务器,代号NGINX-PROXY
  3. 启动一台HAProxy服务器,实现四层转发功能到NGINX HTTP服务器,代号HAProxy
  4. 在客户端分别访问NGINX-PROXY和HAProxy, 并采集NGINX-HTTP的日志
  5. 在NGINX-PROXY和HAProxy交叉请求CURL,并携带Header信息: X-FORWARDED-FOR, 并采集NGINX-HTTP的日志
  6. PROXY-PROTOCOL, 是四层转发开启携带真实IP补充协议,即: 在HTTP报文前方附加的数据。 参考文档

NGINX-HTTP服务器

  • HTTP服务主要配置
  • 因为4层转发携带了真实IP后, NGINX收到的不再是一个纯粹的HTTP报文。 所以需要在NGINX服务开启如下设置。 参考文档

http {# r:访问IP, 也就是代理端IP。 # P: PROXY-PROTOCOL的IP,也就是4层转发携带的补充报文的IP,也就是客户端IP。 # xff: 藏在Header中的X-Forwarded-For的IP。log_format  proxy_protocol_log  'r: $remote_addr p: $proxy_protocol_addr xff: $http_x_forwarded_for';server {access_log logs/proxy_protocol_access.log proxy_protocol_log;	# 观察IP: 访问IP,代理IP,XFFerror_log logs/proxy_protocol_error.loglisten       80 ;               		# 接收HTTP报文走80端口                                        listen       8000 proxy_protocol;     	# PROXY PROTOCOL 走8000端口,PROTOCOL 是通过四层转发获取真实IP的补充协议               server_name  localhost;   location / {root html;index index.html;}}
}

NGINX-PROXY服务器

关键配置

stream {server {listen 80 ;proxy_protocol on; 	# 需要开启使用PROXY PROTOCOL协议。proxy_pass 192.168.1.104:8000;}
}

浏览器访问, NGINX-HTTP(192.168.1.104)输出日志信息

tail logs/proxy_protocol_access.log
r: 192.168.1.102 p: 192.168.1.100 xff: -

CURL访问,NGINX-HTTP(192.168.1.104)输出日志信息

tail logs/proxy_protocol_access.log
r: 192.168.1.102 p: 192.168.1.103 xff: 192.168.1.199

HAProxy服务器

关键配置

defaultsmode  tcpbackend appbalance     roundrobinserver  app1 192.168.1.104:8000 send-proxy  	# send-proxy 开启支持PROXY-PROTOCOL

浏览器访问, NGINX-HTTP(192.168.1.104)输出日志信息

tail -f logs/proxy_protocol_access.log
r: 192.168.1.103 p: 192.168.1.100 xff: -

CURL访问,NGINX-HTTP(192.168.1.104)输出日志信息

tail -f logs/proxy_protocol_access.log
r: 192.168.1.103 p: 192.168.1.102 xff: 192.168.1.199

再次小结

我们尝试结合常见配置结构进行验证。 可以初步发现

  1. 4层转发携带客户端IP是需要使用PROPXY-PROTOCOL协议支持。客户端IP会补充在这个协议内
  2. 作为4层转发端,因为4层转发不修改报文,所以在HTTP报文前添加PROPXY-PROTOCOL信息。
    • 4层转发服务器需要开启 protocol 支持发送PROXY-PROTOCOL+HTTP的混淆报文结构
    • 4层目标服务器需要开启 protocol 支持接收PROXY-PROTOCOL+HTTP的混淆报文结构
  3. 使用补充PROXY-PROTOCL后,HTTP的报文不在是一个纯粹的报文结构,所以作为服务网端NGINX开启了两种模式
    • listen 80; 支持处理普通HTTP请求,
    • listen 80 protocol; 支持处理PROXY-PROTOCOL + HTTP报文的形式。这也是四层代理携带IP的特有形式
  4. 在选择HTTP服务器时,需要考虑HTTP服务是否支持PROXY-PROTOCOL。

相关文章:

探讨4层代理和7层代理行为以及如何获取真实客户端IP

准备工作 实验环境 IP角色192.168.1.100客户端请求IP192.168.1.100python 启动的HTTP服务192.168.1.102nginx服务192.168.1.103haproxy 服务 HTTP服务 这是一个简单的HTTP服务&#xff0c;主要打印HTTP报文用于分析客户端IP #!/usr/bin/env python # coding: utf-8import …...

java算法day11

二叉树的递归遍历二叉树的非递归遍历写法层序遍历 递归怎么写&#xff1f; 按照三要素可以保证写出正确的递归算法&#xff1a; 1.确定递归函数的参数和返回值&#xff1a; 确定哪些参数是递归的过程中需要处理的&#xff0c;那么就在递归函数里加上这个参数&#xff0c; 并且…...

linux下安装cutecom串口助手;centos安装cutecom串口助手;rpm安装包安装cutecom串口助手

在支持apt-get的系统下安装 在终端命令行中输入&#xff1a; sudo apt-get install cutecom 安装好后输入 sudo cutecom 就可以了 关于如何使用&#xff0c;可以看这个https://www.cnblogs.com/xingboy/p/14388610.html 如果你的电脑不支持apt-get。 那我们就通过安装包…...

2024年信息系统项目管理师2批次上午客观题参考答案及解析(1)

1、关于收集需求管理过程及相关技术的描述&#xff0c;正确的是&#xff08;&#xff09; A&#xff0e;需求跟踪矩阵是把产品需求从其来源链接到能满足需求的可交付成果的一种表格 B&#xff0e;原型法是一种结构化的头脑风暴形式&#xff0c;通过投票排列最有用的创意 C&am…...

Xinstall揭秘:APP推广数据背后的真相,让你的营销更精准!

在这个移动互联网时代&#xff0c;APP如同雨后春笋般涌现&#xff0c;但如何在这片红海中脱颖而出&#xff0c;成为每一个开发者与运营者面临的共同难题。其中&#xff0c;APP推广统计作为衡量营销效果、优化推广策略的关键环节&#xff0c;更是不可忽视的一环。今天&#xff0…...

科研绘图系列:R语言小提琴图(Violin Plot)

介绍 小提琴图(Violin Plot)是一种结合了箱线图和密度图的图表,它能够展示数据的分布密度和分布形状。以下是对小提琴图的详细解释: 小提琴图能表达: 数据分布:小提琴图通过在箱线图的两侧绘制曲线来展示数据的分布密度,曲线的宽度表示数据点的密度。集中趋势:箱线图部…...

【Vite】修改构建后的 index.html 文件名

在 Vite 项目中&#xff0c;默认构建 index.html 。但有时候我们需要修改 index.html 为其他文件名&#xff0c;比如 index-{时间戳}.html 。 我们可以这样配置 vite.config.js&#xff1a; import { defineConfig } from vite; import type { PluginOption } from vite;// 自…...

解决IDEA每次新建项目都需要重新配置maven的问题

每次打开IDEA都要重新配置maven&#xff0c;这是因为在DEA中分为项目设置和全局设置&#xff0c;这个时候我们就需要去到全局中设置maven了。我用的是IntelliJ IDEA 2023.3.4 (Ultimate Edition)&#xff0c;以此为例。 第一步&#xff1a;打开一个空的IDEA&#xff0c;选择左…...

论文学习_Getafix: learning to fix bugs automatically

1. 引言 研究背景:现代生产代码库极其复杂并且不断更新。静态分析器可以帮助开发人员发现代码中的潜在问题(在本文的其余部分中称为错误),这对于在这些大型代码库中保持高代码质量是必要的。虽然通过静态分析尽早发现错误是有帮助的,但修复这些错误的问题在实践中仍然主要…...

Xilinx FPGA:vivado关于真双端口的串口传输数据的实验

一、实验内容 用一个真双端RAM&#xff0c;端口A和端口B同时向RAM里写入数据0-99&#xff0c;A端口读出单数并存入单端口RAM1中&#xff0c;B端口读出双数并存入但端口RAM2中&#xff0c;当检测到按键1到来时将RAM1中的单数读出显示到PC端&#xff0c;当检测到按键2到来时&…...

RedisTemplate 中序列化方式辨析

在Spring Data Redis中&#xff0c;RedisTemplate 是操作Redis的核心类&#xff0c;它提供了丰富的API来与Redis进行交互。由于Redis是一个键值存储系统&#xff0c;它存储的是字节序列&#xff0c;因此在使用RedisTemplate时&#xff0c;需要指定键&#xff08;Key&#xff09…...

数据结构与算法基础篇--二分查找

必要前提&#xff1a;有序数组 算法简述&#xff1a;通过不断取中间值和目标target值进行比较&#xff08;中间值&#xff1a;mid (left right) / 2&#xff09; 如果目标值等于中间位置的值&#xff0c;则找到目标&#xff0c;返回中间位置如果目标值小于中间位置的值&…...

python xlsx 导出表格超链接

该Python脚本用于从Excel文件中的第一列提取所有超链接并保存到一个文本文件中。首先&#xff0c;脚本导入必要的库并定义输入和输出文件的路径。然后&#xff0c;它确保输出文件的目录存在。接着&#xff0c;脚本加载Excel文件并选择活动工作表。通过遍历第一列的所有单元格&a…...

Data Guard高级玩法:failover备库后,通过闪回恢复DG备库

作者介绍&#xff1a;老苏&#xff0c;10余年DBA工作运维经验&#xff0c;擅长Oracle、MySQL、PG、Mongodb数据库运维&#xff08;如安装迁移&#xff0c;性能优化、故障应急处理等&#xff09; 公众号&#xff1a;老苏畅谈运维 欢迎关注本人公众号&#xff0c;更多精彩与您分享…...

【Unity2D 2022:NPC】制作任务系统

一、接受任务 1. 编辑NPC对话脚本&#xff1a; &#xff08;1&#xff09;创建静态布尔变量用来判断ruby是否接受到任务 public class NPCDialog : MonoBehaviour {// 创建全局变量用来判断ruby是否接到任务public static bool receiveTask false; } &#xff08;2&#xff…...

【C++深度学习】多态(概念虚函数抽象类)

✨ 疏影横斜水清浅&#xff0c;暗香浮动月黄昏 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &…...

Ubuntu 安装CGAL

一、什么是CGAL CGAL&#xff08;Computational Geometry Algorithms Library&#xff09;是一个广泛使用的开源库&#xff0c;主要用于计算几何算法的实现。该库提供了一系列高效、可靠和易于使用的几何算法和数据结构&#xff0c;适用于各种应用领域。以下是 CGAL 的主要功能…...

RK3568平台开发系列讲解(网络篇)netfilter框架

🚀返回专栏总目录 文章目录 一、Netfilter 介绍二、netfilter 简单案例三、防火墙功能一、Netfilter 介绍 Linux内核自2.4版本开始引入了Netfilter框架,这是一项重要的网络功能增强。Netfilter框架由Linux内核防火墙和网络维护者 Rusty Russell 所提出和实现。这个作者还基于…...

检测音视频文件的声压

FFmpeg使用 ebur128 滤镜检测声压&#xff0c;EBU R128 是欧洲广播联盟&#xff08;European Broadcasting Union&#xff0c;简称 EBU&#xff09;推荐的音频响度测量和归一化标准。 ffmpeg -i input_video.mp4 -filter_complex ebur128peaktrue -f null --f null -&#xff…...

计算机网络-HTTP常见面试题

目录 1. HTTP是什么&#xff1f;2. HTTP常见的状态码&#xff1f;3. HTTP 常见的字段有哪些&#xff1f;4. GET和POST有什么区别&#xff1a;5. GET 和POST方法都是安全和幂等的吗&#xff1f;6. HTTP缓存技术7. HTTP/1.1相比HTTP/1.0提高了什么性能&#xff1f;8. HTTP/2做了什…...

Java高频面试题:RocketMQ有哪些使用场景?

大家好&#xff0c;我是锋哥。今天分享关于【Java高频面试题&#xff1a;RocketMQ有哪些使用场景&#xff1f;】面试题 。希望对大家有帮助&#xff1b;Java高频面试题&#xff1a;RocketMQ有哪些使用场景&#xff1f;RocketMQ 是阿里巴巴开源的一款分布式消息中间件&#xff0…...

GNN实战:Cora、Citeseer、PubMed三大文献数据集保姆级使用指南(附代码)

GNN实战&#xff1a;Cora、Citeseer、PubMed三大文献数据集深度解析与工程实践 引言&#xff1a;为什么这三个数据集成为GNN研究的"黄金标准"&#xff1f; 在探索图神经网络&#xff08;GNN&#xff09;的浩瀚宇宙中&#xff0c;Cora、Citeseer和PubMed如同三颗璀璨的…...

如何突破Cursor试用限制?3种创新方案全解析

如何突破Cursor试用限制&#xff1f;3种创新方案全解析 【免费下载链接】go-cursor-help 解决Cursor在免费订阅期间出现以下提示的问题: Youve reached your trial request limit. / Too many free trial accounts used on this machine. Please upgrade to pro. We have this …...

Maxwell16.0实战:如何用实验电流数据搞定电机仿真(附.tab文件制作技巧)

Maxwell16.0实战&#xff1a;实验电流数据驱动电机仿真的全流程解析 电机仿真作为现代工业设计的重要环节&#xff0c;其准确性直接影响产品性能评估。而将实测电流数据融入仿真流程&#xff0c;往往是工程师突破"理想模型"局限的关键一步。本文将系统性地拆解从实验…...

抖音高效采集与无水印提取工具使用指南

抖音高效采集与无水印提取工具使用指南 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在数字内容创作与研究领域&#xff0c;高效的抖音资源管理已成为提升工作流的关键环节。本文将全面介绍一款功能强大的…...

高效PDF处理:用PDF Arranger实现极简文档管理

高效PDF处理&#xff1a;用PDF Arranger实现极简文档管理 【免费下载链接】pdfarranger Small python-gtk application, which helps the user to merge or split PDF documents and rotate, crop and rearrange their pages using an interactive and intuitive graphical int…...

NaViL-9B图文问答入门必看:纯文本+图像理解双模式快速上手

NaViL-9B图文问答入门必看&#xff1a;纯文本图像理解双模式快速上手 1. 认识NaViL-9B多模态模型 NaViL-9B是一款原生支持多模态交互的大语言模型&#xff0c;由专业研究团队开发。它最大的特点是能同时处理纯文本问答和图片内容理解任务&#xff0c;就像一个同时精通文字和视…...

CTP行情接口避坑指南:从‘不合法的登录’到稳定接收tick数据的5个关键步骤

CTP行情接口实战避坑手册&#xff1a;从登录异常到稳定接收tick的深度解决方案 当你在深夜调试CTP行情接口时&#xff0c;突然看到控制台跳出"不合法的登录"错误提示&#xff0c;而距离第二天开盘只剩3小时——这种场景恐怕不少量化开发者都经历过。本文将分享5个关键…...

智能客服系统搭建实战:基于NLP与微服务架构的AI客服实现指南

最近在帮公司搭建一套智能客服系统&#xff0c;从零开始踩了不少坑&#xff0c;也积累了一些实战经验。今天就来聊聊&#xff0c;如何基于当前比较成熟的 NLP 和微服务架构&#xff0c;一步步构建一个能扛住真实业务压力的 AI 客服系统。整个过程涉及技术选型、核心模块实现、性…...

轴承‘健康度’预测新思路:用LSTM处理振动信号,我对比了PyTorch和TensorFlow 2.x的实现差异

轴承健康预测实战&#xff1a;PyTorch与TensorFlow 2.x的LSTM实现深度对比 在工业设备维护领域&#xff0c;轴承作为旋转机械的核心部件&#xff0c;其健康状态直接影响整机运行安全。传统基于阈值的报警方式往往滞后于实际故障发生&#xff0c;而采用LSTM&#xff08;长短期记…...