家庭网络非80端口访问以及cloudflare页面规则配置实现不加端口随意访问
家宽nginx反代https网站建设 利用页面规则实现不用80端口也可访问
0x01 环境
1、一台 linux 主机
2、电信网
3、路由器(分配有公网 ip)
0x02 nginx 反代 部署
2.1 原理
反向代理即把内网服务映射到公网地址上。(优点,可以直接公网地址访问)
正向代理即你挂公网主机的 vpn,然后访问内网。(缺点,要挂 vpn)
2.2 nginx 部署反向代理
我内网有多个应用,我的路由器获得了公网 ip 地址(没有就百度想办法)。路由器开启端口转发,即可用 `公网ip:端口` 访问内网资源。注意公网端口不要用 ==80、443==,因为国内运营商为了防止家宽建站把这些封了。只要换其他端口就可以使用。
2.21 安装 nginx 环境
这步网上很多教程,我是用 docker 的方式安装,你也可以使用 `apt install nginx` 命令一步到位安装
主要用到的文件有 `/etc/nginx/nginx.conf` ` /etc/nginx/conf.d/default.conf`
参考公网环境
1、域名和端口:domain.myhost.com:2333
2、路由映射:2333 <-> linux主机ip:443
2.22 nginx 配置
更改配置前记得备份。`cp nginx.conf .nginx.conf.bak `
先编辑 nginx.conf 文件,设置 upstream 负载均衡,再添加 server 服务器。
为什么不去 `/etc/nginx/conf.d/` 目录下添加配置文件呢,因为那样我需要把 ssl 证书重新写一遍。但那样也会灵活一些。两种方式看你们吧
方式一(我的方式)
1、打开 nginx.conf vim /etc/nginx/nginx.conf
2、添加配置,我的配置信息已经脱敏处理了。不要有其他想法哦
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
#ssl配置(23行-28行)不用可以不写,不然找不到证书路径会报错
ssl_certificate /etc/nginx/ssl/*.myhost.com/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/*.myhost.com/*.myhost.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
# 添加名为domain的负载均衡服务
upstream domain{
ip_hash;
# server 写要反向代理的服务器,可以是域名,也能有多个server
server 192.168.1.1:9000;
}
# 启动服务,监听端口,进行方向代理
server {
# 没有ssl的直接 listen 80;
listen 443 ssl;
# 这里即从公网访问来的域名,每个http请求都会有个host字段,nginx可以读取这字段进行转发
server_name domain.myhost.com;
# 启用路径服务,将根目录代理到名为 domain 的负载均衡服务
location / {
proxy_pass http://domain;
}
# 启用跳转,$http_host保留端口,将http请求变成https请求,建议开启ssl的写,不然 http:域名:端口 会出现错误
error_page 497 301 https://$http_host$request_uri;
# 有网盘需求的添加以下配置:1、分别为nginx不缓存请求 2、不设置客户端能传送的最大数据
# 不添加可能出现传不了文件的情况
#proxy_request_buffering off;
#client_max_body_size 0;
}
# 如果需要添加多几个服务,也是一样的
upstream domain2{
ip_hash;
server 192.168.1.1:9000;
}
server {
listen 443 ssl;
server_name domain2.myhost.com;
location / {
proxy_pass http://domain2;
proxy_set_header Host $http_host;
}
error_page 497 301 https://$http_host$request_uri;
}
}
配置好后执行 systemctl nginx restart
或者 docker restart nginx(你的容器名字)
0x03 cloudflare 页面规则实现不添加端口访问服务
上面配置好后,外网访问 `http://domain.myhost.com:2333` 即可访问到内网对应服务器 domain,访问 `http://domain2.myhost.com:2333` 即可访问到服务器 domain2
但是有没有办法实现:`domain.myhost.com` `domain2.myhost.com` 不添加端口直接访问到对应服务器呢?这就要用到页面规则了
页面规则即你的 dns 服务商,比如腾讯的 dnspod 阿里的 alibaba dns 等。使用这功能的前提是你有两个域名,这样你就可以设置另外一个域名,比如 `domain.a.com` 跳转到 `http://domain.b.com:2333`
是的,即 301 跳转到某个 url 页面。
cloudflare 页面规则配置如下
1、登录 cloudflare,选择你的另外一个域名 a.com
,
2、 点击创建页面规则
3、 输入如下
含义解释
*
代表任意字符$1 表示第一处的任意字符替换
$2 表示第二次的任意字符替换
当你输入 www.a.com/index.php 时,$1 的值为
www.
$2 的值为index.php
可以实现不同子域的跳转
dns 配置如下
分别添加如下记录,一定要点亮小云朵
名称分别分别为 www
@
*
内容写 8.8.8.8
至此访问 domain.a.com
即可跳转到 http://domain.myhost.com:2333
搞CTF