利用Nginx正向代理实现局域网电脑访问外网

这篇具有很好参考价值的文章主要介绍了利用Nginx正向代理实现局域网电脑访问外网。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

在网络环境中,有时候我们需要让局域网内的电脑访问外网,但是由于网络策略或其他原因,直接访问外网是不可行的。这时候,可以借助 Nginx 来搭建一个正向代理服务器,实现局域网内电脑通过 Nginx 转发访问外网的需求。

在工作中我遇到了一个类似的情况:在公司网络中,由于管理要求,局域网内的电脑不能直接访问外网。但是,有时候我们需要让局域网内的电脑能够访问外网上的某个网站,这时候就需要用到正向代理。本文将介绍如何配置 Nginx 实现这一功能。

准备工作

首先,我们需要一台可以访问外网的服务器,例如一台服务器、电脑或者虚拟机。确保该服务器已经安装了 Nginx,并且网络配置正确。

我这里是有一台服务器是可以正常访问外网的(IP:192.168.0.10),同时局域网内的其他电脑也可以访问这台服务器。

修改nginx.conf

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;

    keepalive_timeout  65;

	# 正向代理配置内容
	server {
		 listen 9000;	# 监听端口
		 server_name localhost;
		
		set $url "proxy_server_doman_or_ip";	# 设置代理的域名或IP变量,这里替换成自己需要代理的网站
		 location / {
		     proxy_pass http://$url:8082;	# 将请求转发到由 $url 变量表示的地址。
		 }
	}
}

重启nginx,打开局域网电脑测试访问:192.168.0.10:9000,网页跳转成功。不就是请求转发嘛,so easy!
nginx如何代理访问网络,开发坏境配置,nginx,运维,微服务

问题解决?如果这么简单我就不写这篇文章了😄

果然第二天就出问题了,有同事反馈网站进不去了。我想不可能吧,一测试果然不行。果断查阅了一下资料,找到问题原因:nginx在进行域名转发时会先把域名解析成IP保存在内存中,后面的访问都是通过IP直接访问,如果目标网站的 IP 地址发生变化,我们的代理就会失效。

找到原因就好办了,添加域名解析功能嘛

域名解析

为了解决 IP 地址变化的问题,我们可以使用域名解析来动态获取目标网站的 IP 地址。直接奉上完整配置,修改 Nginx 配置如下:

# 设置Nginx启动一个工作进程,这是Nginx的一个核心设置,它决定了Nginx会使用多少个工作进程来处理客户端请求。
worker_processes  1;		

# 配置定义了Nginx如何处理事件,例如连接请求,数据传输等
events {
    worker_connections  1024;		# 定义了每个工作进程允许的最大并发连接数。
}

# HTTP模块的配置块,包含了HTTP服务器的一般配置
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;

    keepalive_timeout  65;

	# 正向代理配置内容
	server {
		 listen 9000;	# 监听端口
		 server_name localhost;

		# 设置DNS解析器的地址为8.8.8.8,并且设置了解析器的缓存时间为300秒(这样每隔300s就会重新解析一次)。ipv6=off 是关闭IPv6的解析支持。
		resolver 8.8.8.8 valid=300 ipv6=off; 
		resolver_timeout 3s;	# 设置解析DNS的超时时间为3秒
		
		proxy_read_timeout 60s;
		proxy_send_timeout 60s;
		proxy_connect_timeout 60s;
		
		set $url "proxy_server_doman_or_ip";	# 设置代理的域名或IP变量,这里替换成自己需要代理的网站
		 location / {
			proxy_pass http://$url:9000;	# 将请求转发到由 $url 变量表示的地址。9000是目标网站的端口。
			
			proxy_buffers 256 4K;		# 设置用于缓存后端响应的缓冲区大小为256个,每个大小为4K。
			proxy_max_temp_file_size 0;		# 设置Nginx暂存响应数据的最大临时文件大小为0,即不使用临时文件。
			proxy_cache_valid 200 302 1m; 	# 针对状态码为200和302的响应,设置缓存有效期为1分钟。
			proxy_cache_valid 301 1h;		# 针对状态码为301的响应,设置缓存有效期为1小时。
			proxy_cache_valid any 1m;	# 对于其他任何响应状态码,设置缓存有效期为1分钟。
		 }
	}
}

重启nginx,问题解决。到这里,正向代理功能就实现了。如果只想实现正向代理功能看到这里就可以了。后面是我在遇到问题时的一些调试经验技巧!

转发代理调试

我在实现代理后,发现正向代理响应的速度非常慢有时候需要一分钟才能响应结果。但有时候又很快。就好奇为啥会这样,为了方便调试和监控,我设置添加了Nginx 的访问日志。

修改 Nginx 配置如下:

# 设置日志记录格式
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"' 'upstreamIP: $upstream_addr' 'upgrade: $http_upgrade';

# 正向代理配置内容
	server {
		 listen 9000;	# 监听端口
		 server_name localhost;

		# 设置DNS解析器的地址为8.8.8.8,并且设置了解析器的缓存时间为300秒(这样每隔300s就会重新解析一次)。ipv6=off 是关闭IPv6的解析支持。
		resolver 8.8.8.8 valid=300 ipv6=off; 
		resolver_timeout 3s;	# 设置解析DNS的超时时间为3秒
		
		proxy_read_timeout 60s;
		proxy_send_timeout 60s;
		proxy_connect_timeout 60s;
		
		set $url "proxy_server_doman_or_ip";	# 设置代理的域名或IP变量,这里替换成自己需要代理的网站
		 location / {
			proxy_pass http://$url:9000;	# 将请求转发到由 $url 变量表示的地址。9000是目标网站的端口。
			
			proxy_buffers 256 4K;		
			proxy_max_temp_file_size 0;		
			proxy_cache_valid 200 302 1m; 
			proxy_cache_valid 301 1h;		
			proxy_cache_valid any 1m;	
			
			access_log logs/proxy/access.log main;		# 定义了访问日志的路径和格式。
		    error_log logs/proxy/error.log;		# 定义了错误日志的路径
		 }
	}

这样,Nginx 将会在nginx项目下的 logs/proxy/access.log 文件中记录所有代理转发日志。

日志信息:

192.168.0.28 - - [27/Feb/2024:17:02:03 +0800] “GET /prod-api/system/todo/listAll?pageNum=1&pageSize=10&active=true HTTP/1.1” 200 64 “http://192.168.20.2:8082/user-task/todo” “Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0” "-"upstreamIP: 182.148.159.30:8082
192.168.0.28 - - [27/Feb/2024:17:02:03 +0800] “GET /prod-api/process/business/listAll?pageNum=1&pageSize=10&active=true HTTP/1.1” 200 979 “http://192.168.20.2:8082/user-task/todo” “Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0” "-"upstreamIP: 182.148.159.30:8082
192.168.0.28 - - [27/Feb/2024:17:02:06 +0800] “GET /prod-api/system/user/select HTTP/1.1” 499 0 “http://192.168.20.2:8082/login?redirect=%2Findex” “Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0” "-"upstreamIP: 172.16.30.6:8082

通过日志信息可以看到,请求转发后的upstreamIP有两个不同的IP:182.148.159.30和172.16.30.6,说明请求被转发到了两个不同的IP,当请求IP为182.148.159.30时,响应正常;当请求IP为172.16.30.6时,响应失败导致等待。

发现这个情况后,我也是很疑惑为啥会将域名解析出两个IP,第一反应是域名解析错误,为了验证我将DNS解析的服务器换成了离我最近的四川电信服务器:61.139.2.69,测试发现结果也是一样的。虽然感觉解析是没有问题的,保险起见我还是自己在网上通过解析网站测试了一下域名解析的结果:结果显示域名确实绑定了两个IP,一个是正常的一个是不行的。

然后我就联系我们这个域名对应网站的负责人,得出的结果就是他们确实绑定了两个IP,有一个IP是绑定的内网IP,所以才导致外网请求时失效。

失败的原因:nginx获取解析后的IP是通过轮询往IP转发请求,如果轮询到内网IP就会导致请求失败。

解决办法:

  1. 手动选择IP地址:在Nginx配置中,你可以手动指定代理的目标IP地址,而不是使用解析出的IP地址。这样可以避免将请求发送到内网IP。

  2. 使用域名解析出的IP地址进行请求:你可以通过解析域名获取到的IP地址列表,然后使用一些方法(比如按照某种规则选择IP地址)来保证请求不会发送到内网IP地址。

  3. 使用nginx的upstream模块进行负载均衡:通过upstream模块,你可以指定多个代理服务器,然后使用一定的负载均衡策略,比如轮询、权重等,来分配请求到不同的服务器。在这里,你可以手动配置upstream模块,指定外网IP,而不包括内网IP。

  4. 修改DNS设置:联系网站负责人,修改域名解析,只将外网IP绑定到域名上,而不包括内网IP。

你们猜我最后咋解决的???

必须是第四条啊!!!文章来源地址https://www.toymoban.com/news/detail-843819.html

到了这里,关于利用Nginx正向代理实现局域网电脑访问外网的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 两台同一局域网下的电脑实现共享文件夹

    两台同一局域网下的电脑实现共享文件夹

    背景 :买了台新的笔记本;旧笔记本连接校园网并开移动热点;新笔记本连接热点; 目标 :旧笔记本创建一个共享文件夹,供新笔记本访问读写 2.1、旧笔记本 (1)网络设置 win+i - 网络和Internet - 网络和共享中心 - 更改高级选项设置 - 勾选两个 所有网络 - 无密码保护的共享

    2024年02月09日
    浏览(18)
  • 如何在局域网中进行远程桌面登入实现远程控制电脑

    要远程控制本地桌面电脑,就必须要获得本地电脑权限。所有的远程控制软件都是一个原理哦,只是有些远程控制软件把获得权限的设置伪装成一个木马而已,当你点击后就证明你允许它远程控制电脑,受理他所有的权限,那么他就可以为所欲为了。其实正规的获取本地电脑

    2024年02月06日
    浏览(17)
  • 软路由R4S+iStoreOS实现公网远程桌面局域网内电脑

    软路由R4S+iStoreOS实现公网远程桌面局域网内电脑

    上篇教程我们介绍了如何在iStoreOS中安装Cpolar,并使用Cpolar远程访问iStoreOS面板。 iStoreOS安装永久免费内网穿透软件Cpolar - Cpolar 极点云 接下来我们介绍,如何使用实体软路由,通过Cpolar来远程公网控制局域网内的所有电脑。 软路由 是PC的硬件加上路由系统来实现路由器的功能

    2024年02月05日
    浏览(12)
  • 局域网限速软件控制电脑网速、控制局域网流量教程

    在局域网网络管理中,网管员一个非常重要的工作就是限制局域网网速、合理分配上网带宽。这是因为国内企事业单位出口网络带宽一般较小,企业上网速度普遍较慢。而当前各种网络应用层出不穷,尤其是P2P下载、在线看视频、看网络电视等行为极为普遍。这些与工作无关

    2024年02月06日
    浏览(13)
  • 局域网,手机与电脑文件共享

    局域网,手机与电脑文件共享

    优点: 1.传输速度快,平时校园网下载网速2MB/秒,用这个可达6.1MB/秒 2.利用校园网,可做到只连接Wifi不使用账号登录,也可传输。 3.可传输较大文件(5GB都可)。 4.有可视化面板,操作简单。 5.有文字共享功能,可互相发送文字信息。 缺点: 1.需要有java运行环境。 2.需要在

    2024年02月16日
    浏览(10)
  • 局域网中电脑共享文件给手机

    局域网中电脑共享文件给手机

    学习资源: 局域网共享:这样设置,你可以轻松拷贝任何电脑的文件。_哔哩哔哩_bilibili 可以实现什么效果? 连接同一个WIFI,电脑端为服务端,提供共享文件,手机是客户端,可以读取服务端的文件。 如何实现这样的效果。 跟着视频一步步走。 过程中遇到的问题: 1.计算

    2024年02月11日
    浏览(12)
  • 局域网电脑网卡故障维修实例

    一、合理配置服务器电脑硬盘 当局域网的访问速度降低时,往往会首先想到网卡、交换机等所谓\\\"瓶颈\\\"设备,其实服务器硬盘的速度也是影响网络性能的重要因素。通常,在设置硬盘时需要考虑以下两方面因素:服务器的硬盘应尽量选择转速快、容量大的硬盘。服务器最好采

    2024年02月05日
    浏览(14)
  • Nginx开启https和局域网访问配置攻略

    Nginx开启https和局域网访问配置攻略

    随着网络应用的普及,越来越多的服务和应用开始运行在互联网上。这些服务和应用需要保护用户数据的机密性、完整性和可用性。HTTPS作为一种可防止中间人攻击的加密通信协议,可以有效地保护用户数据的安全性和隐私性。同时,对于在局域网内部运行的服务和应用,也

    2024年03月10日
    浏览(16)
  • Windows电脑怎么设置局域网内共享磁盘?

    Windows电脑怎么设置局域网内共享磁盘?

    前言: 我有一台主机硬盘容量比较大,想做为一个共享硬盘,方便我其他笔记本能够往这台硬盘传输文件,想到的最好最快的方法就是通过局域网内部进行文件传输。通过局域网共享磁盘,这种方法也是非常便捷的。那如何设置操作呢?请详细看下文。 局域网共享磁盘,共

    2024年02月09日
    浏览(14)
  • 局域网内的手机、平板、电脑的文件共享

    局域网内的手机、平板、电脑的文件共享

    在日常工作生活中,经常需要将文件在手机、平板、电脑间传输,以下介绍三种较为便捷的方法: 该软件是免费开源的,可以 在局域网内的任意手机、平板、电脑间传递文件 ,并且 任意一方都可以作为“发送方”和“接收方” 。同时该软件还支持直接传输“ 复制的文本内

    2024年04月16日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包