共计 3462 个字符,预计需要花费 9 分钟才能阅读完成。
最好的进攻形式就是攻打 知己知彼,百战不殆。把握攻击者的套路才好顶得住攻打。
可能我的读者多少理解过Nginx
,我先给不理解的同学简略说一下原理。曾经理解的跳到第二节。
3 分钟理解Nginx
Nginx
是一款高性能的 Web
服务器和反向代理服务器。
它能够用来搭建网站、做应用服务器,可能解决大量的并发连贯和申请。
- 动态内容托管(次要):能够用来做网页、图片、文件的 “动态”内容托管。
- 动静内容托管(次要):将常常拜访的动静内容缓存到内存中,进步访问速度和性能。
- 反向代理(次要):将客户端的申请发送到后端实在服务器,并将后端服务器的响应返回给客户端。
相似于一个快递收发室,指挥快递(流量)应该投递到哪个买家。
它还能提供一些高级性能:
- 负载平衡:将客户端的申请散发到多个后端服务器上,从而进步服务的可用性和性能。
- SSL/TLS 加密传输:通过加密和认证爱护数据传输平安。
- HTTP/ 2 反对:通过多路复用技术进步并发连贯解决能力和页面加载速度。
- 平安防护:提供多种防护机制,如限度 IP 拜访、申请频率限度、反爬虫等。
- 动静内容解决:反对 FastCGI、uWSGI 等协定,与后端应用服务器进行动静内容交互。
- 日志记录:记录拜访日志和谬误日志,不便监控和排查问题。
- 自定义模块开发:反对自定义模块开发,能够依据需要进行二次开发和扩大。
读到这里,我晓得很多人脑子都要爆了。当初让咱们直入主题。联合以上性能的能做哪些攻击方式。
反向代理攻打
应用 Nginx
作为反向代理服务器,将攻打流量转发到指标服务器。这样就能暗藏攻打流量的实在地址。
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
- 所有拜访
www.example.com:80
的流量全副都会转发到http://backend_server
服务器上。 proxy_set_header X-Real-IP $remote_addr;
设置申请头提供实在起源ip
。proxy_set_header Host $host;
设置拜访的Host
。
只有把 X-Real-IP
改成其余不存在的 IP
,就能够暗藏本人的实在 IP 地址,让攻打更难以被追踪和进攻。当然绝对于客户端来说,只能晓得nginx
的地址就不晓得实在服务器的地址了。
DDoS 攻打
DDoS
攻打就是借助某些工具霎时动员大量的申请,让服务器资源耗尽,无奈失常响应其余用户的申请,个别也罕用于压力测试。介绍一些罕用的工具:
ApacheBench
(ab):罕用的命令行工具,用于模仿多个并发申请。能够管制申请总数、并发数等参数。Siege
:命令行工具,和下面一样,并且还反对HTTP
和HTTPS
协定。JMeter
:一个功能强大的Java
应用程序,能够用于模仿各种负载状况。JMeter
能够通过图形界面进行配置,反对更多协定和数据格式,包含 HTTP、HTTPS、SOAP、REST 等。
但事实往往比这个残暴,攻击者会做一些病毒,在网络上流传开来,病毒运行时能够间接疯狂拜访服务器,或者利用 Nginx
提供的反向代理和其反对的比方socket
、SSL
,一直的建设握手申请。
限流、黑名单进攻
小熊次要给大家介绍怎么进攻。这种病毒感染形式就不说了,我胆怯戴银手铐。
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
geo $block {
default 0;
include /path/to/block_ip.txt;
}
server {
listen 80;
location / {
limit_req zone=one burst=10 nodelay;
if ($block) {return 403;}
proxy_pass http://backend;
}
}
}
limit_req_zone
定义了一个名为“one”的限度申请速率的区域,该区域的大小为 10MB,申请速率限度为每秒 5 个申请。limit_req
指定应用名为“one”的限度规定。geo $block
是黑名单,这个文件能够写须要屏蔽的ip
。server
块中的location
指令应用了limit_req
和if
示意黑名单的返回403
状态码。
负载平衡进攻
假如我有两个后端服务器。
http {
upstream backend {
# 轮询形式的负载平衡
server backend1.example.com;
server backend2.example.com;
}
...
server{...}
}
有多种负载平衡形式。
server {
...
location /api/ {
# 轮训
proxy_pass http://backend;
}
location /lb/ {
# IP 哈希形式的负载平衡
ip_hash;
proxy_pass http://backend;
}
location /upstream/ {
# 依据服务器性能或响应工夫进行加权轮询
upstream backend {
server backend1.example.com weight=2;
server backend2.example.com;
}
# 对 backend 进行拜访
proxy_pass http://backend;
}
location /least_conn/ {
# 起码连接数的负载平衡
least_conn;
proxy_pass http://backend;
}
location /random/ {
# 随机形式的负载平衡
random;
proxy_pass http://backend;
}
location /sticky/ {
# 基于客户端 IP 的哈希形式的负载平衡
hash $remote_addr consistent;
server backend1.example.com;
server backend2.example.com;
}
}
很多人学 nginx
都会对 ip_hash
和基于客户端 IP 的哈希形式的负载平衡有纳闷。分不清,我一句话给大家讲清楚。
ip_hash
能保障雷同起源肯定能拜访雷同的服务器,实用于登录等有状态的场景。在申请量少的时候,容易呈现很多ip
落在同一服务器上,散布不平衡。- 基于客户端 ip 的 hash,是依据客户端 IP 地址计算哈希值,而后将哈希值与后端服务器数量取模。使申请平均分配到不同的服务器上,也能保障同一
ip
申请落到同一服务器上。然而能够保障各个服务器比拟平衡。
我认为应用形式二更好,可能了解无限,欢送各位读者分享本人的认识!
网络钓鱼攻打
黑客能够应用 Nginx 伪装成一个非法的网站,诱骗用户输出敏感信息。例如,他们能够应用 Nginx 结构一个伪造的登录页面,让用户输出用户名和明码,而后将这些信息发送给黑客服务器。
其实就是动态托管 + 反向代理性能的组合。
server {
listen 80;
server_name example.com;
# 动态网站托管
location / {
root /var/www/mywebsite/dist;
index index.html index.htm;
}
# API 代理转发
location /api {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
- 拜访根目录就拜访到动态的网站资源。
- 拜访
/api
路由转发到api
服务上。
我的博客就用了这种形式,同样的我写了很多了不同的 server{}
块,来监听不同的域名,这样我能够把多个网站全副部署在同一台机器上,极限利用服务器资源。
最初
这两天在写一个小程序,打算做成程序员资源、求助、内推、课程、学习路线图之类的综合类小程序,所以更新有点慢了,见谅见谅。
对于明天所述的文章,真正有不良存心的人,总是会有更 sao
的攻打办法。我也不敢说得太多,而且这些攻打的行为都是守法的,倡议大家学会当前手下留情。
明天的目标实际上是教大家学会 nginx
的罕用配置办法,用心良苦,莫辜负点个赞再走。
一起提高
你好,我是小熊,是一个爱技术然而更爱钱的程序员。上进且佛系自律的人。喜爱发小机密 / 臭屁又爱夸耀。
奋斗的大学,激情的当初。赚了钱买了房,写了书出了名。当过面试官,带过师傅搬过转。
大厂外来务工人员。是我,我是小熊,是不一样的烟火欢送围观。
我的博客 机智的程序员小熊 欢送珍藏