在了解反向代理之前我们先了解一下什么是代理。
代理:你 → 代理服务器 → 网站

所以
正向代理:替客户端跑腿(你访问不了的网站,代理帮你去访问)
反向代理:替服务器跑腿(用户请求过来,代理帮你转发到后面真正干活的服务器)

nginx就是一个典型的反向代理!

核心原理:是因为每个服务可以选择监听哪个ip哪个端口(比如mysql,java程序,ssh这些)
在他们的配置文件中可以选择监听在哪里,比如配置文件里面写
0.0.0.0代表监听外网,只要连上互联网的设备都可以连接
如果是127.0.0.1代表监听本地,就是说只允许本地连接,不允许外网访问。

数据流向分析:
用户浏览器 → 访问 ​
请求到达 Nginx(Nginx监听了0.0.0.0:80,所以能收到)
Nginx 根据配置规则,把请求转发给 http://127.0.0.1:8080
后端服务(Tomcat)处理请求,把结果返回给 Nginx Nginx 再把结果返回给用户

反向代理也有独立的软件,但是在这里我们使用nginx来配置反向代理。

首先我们需要有一台云服务器或者虚拟机,系统ubuntu 24.04(我做实验时所使用的虚拟机)
第一步就是下载一个web服务(nginx)
命令:
1.sudo apt update
2.sudo apt install nginx -y
这里建议下载nginx-full,这个版本比较完整,功能也多,如果不下载这个版本nginx可能会不认识stream(后文会有介绍)

下载完毕后可以切换到/etc/nginx目录,结构应该是这样的。
/etc/nginx/
├── nginx.conf # 主配置文件(全局配置,一般不用改)
├── sites-available/ # 可用的站点配置(放这里的不一定生效)
│ └── default # 默认站点配置
├── sites-enabled/ # 已启用的站点配置(真正生效的,是软链接)
│ └── default → /etc/nginx/sites-available/default
├── conf.d/ # 额外的配置目录(.conf文件会自动加载)
├── snippets/ # 配置片段(可复用的)
└── ...
nginx的两种工作机制:
1.七层代理(http块):能看懂应用层数据(HTTP),功能强,但只能代理HTTP/HTTPS
2.四层代理(stream块):不管里面是什么协议,只管把TCP/UDP数据包转发过去,什么都能代理,但功能简单(只能按IP+端口转发)
如果我们想要把ssh服务设置成nginx反向代理就只能用stream块,而不能用七层代理,因为ssh使用的不是http协议。

好,现在我们正式开始配置反向代理,这里先用ssh举例子,比如我们想要配置ssh反向代理应该怎么做。
这里我用nmap来扫描。
图片1.png
可以观察到初始时我的ubuntu系统对外开了两个端口,22端口是ssh服务。
好,现在我们来进行操作。
在ubuntu系统上执行切换到/etc/ssh目录下(命令:cd /etc/ssh)然后读取配置文件sshd_config,应该是这样的:
图片2.png
在这个图片倒数第二行那个0.0.0.0的下面或者其他地方写入配置
ListenAddress 127.0.0.1(意思是让这个服务只监听本地连接),就像这样:
图片3.png
写完之后退出,重启服务。命令:sudo systemctl restart ssh
然后继续使用nmap扫描,结果如下:
图片4.png
可以发现已经扫描不到22端口了,这是因为ssh服务已经只进行本地监听,所以外网扫描不到。
注:如果还能扫描到的话重启一下ubuntu系统就行。

好,接下来我们配置nginx。切换到/etc/nginx目录下,去编辑全局配置文件nginx.conf(命令:sudo nano nginx.conf)在空白处写入如下配置:
图片5.png
listen 2222; 监听2222端口
proxy_pass 127.0.0.1:22; 讲监听端口的流量转发到22端口(也就是ssh服务运行的那个端口)

超时设置

proxy_connect_timeout 30s;
proxy_timeout 1h; # SSH是长连接,超时设长一点
配置完成,保存退出后执行这两条命令
1.sudo nginx -t(用来检查你的配置是否有语法错误,看到successful就代表没有)
2.sudo systemctl restart nginx (重启nginx服务,使得配置生效)
图片6.png
OK到此我们已经成功完成了ssh反向代理配置。
扫描验证一下:
图片7.png
成功扫描出2222端口,连接一下看看呢
图片8.png
连接成功。
看到这里可能会有人有疑问
1.直接把ssh配置文件端口改成2222不就行了,为什么要这么麻烦?
答:这里只是用作演示,其他服务你自然可以这么配置。这么改具有一定的隐藏效果,但不大。
2.为什么用了反向代理还是能扫描出是ssh服务呢?是nginx监听服务不应该是nginx吗?
答:只要流量特征在nmap的库里就能扫出来是什么服务,常见的框架都能扫出来,除非你改流量特征

上面讲的是stream四层配置,如果是http七层配置就要写在sites-enabled文件夹下面的站点配置文件中。因为在nginx.conf这个主配置文件中
图片9.png
这个include意思是:把那个文件里的内容,原封不动地抄到我这个位置
所以这个http{}块里面会自动加载conf.d目录和sites-enabled目录下的所有配置。
而http七层反向代理的配置写法比stream要复杂一些,这里就不过多讲解。

标签: none

添加新评论