网站服务器架构设计
0x01 网站用云服务器
网站用云服务器搭建,只有一个IP且是网站真实IP
0x02 网站用Nginx代理服务器
Nginx搭建的网站,并不能直接知道真实IP,当访问IP发现这个页面,很有可能这个机器是反向代理服务器。这时,可以访问该服务器开放的其他端口,看是否是正常页面,一般是将其端口的流量转发给真正的web服务器。
其真正的网络拓扑图可能是:
这⾥⽹站通过采⽤Nginx代理服务器来转发流量,可以很好的隐蔽真实的⽹站服务器。我们通过ping只可以得到nginx服务器的ip地址,但是这并不是真正⽹站服务器的ip地址,真正服务器隐藏在nginx代理服务器之后。并且⽹站也可以通过Nginx代理服务器来基于不同端⼝转发和负载均衡。
- 基于监听不同端⼝的转发
- 负载均衡
nginx服务器通过监听端⼝,将请求转发给后⾯多台真实的服务器,并且进⾏负载均衡。
- 本地转发
Nginx服务器就是web服务器。nginx根据请求的⻚⾯的不同后缀(.php / .jsp / 等等),来转发给不同的端⼝进⾏解析。
0x03 ⽹站通过NAT映射
我们并不能知道⽹站服务器真实的ip地址,这种情况⼤多数是属于稍微⼤型的企业⽤户,拥有⾃⼰的机房。位于内⽹DMZ区的服务器通过NAT映射到公⽹地址。这时,我们通过ping得到的ip地址是企业位于公⽹处的ip地址,并不是真实的ip地址。
更⼤型的企业,出⼝处有⼏个运营商,提供热备份和负载均衡。这时,我们通过域名查询ip地址可以找到3个ip地址。但是这3个ip地址都是出⼝处运营商的ip地址,并不是真正的web服务器的ip地址,真正的web服务器在内⽹中。
0x04 ⽹站通过CDN进⾏解析
这种情况属于有钱的企业,因为CDN的费⽤并不便宜。⽹站通过CDN解析域名,通过中⼼平台的负载均衡、内容分发、调度等功能模块,使⽤户就近获取所需内容,降低⽹络拥塞,提⾼⽤户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。这时,我们通过⽹站域名解析得到的ip地址都是CDN的地址,并不是web服务器真实的ip地址。
端⼝转发和端⼝映射
0x01 端⼝映射
端⼝映射就是将内⽹中的主机的⼀个端⼝映射到外⽹主机的⼀个端⼝,提供相应的服务。当⽤户访问外⽹IP的这个端⼝时,服务器⾃动将请求映射到对应局域⽹内部的机器上。⽐如,在内⽹中有⼀台Web服务器,但是外⽹中的⽤户是没有办法直接访问该服务器的。于是可以在路由器上设置⼀个端⼝映射,只要外⽹⽤户访问路由器ip的80端⼝,那么路由器会把⾃动把流量转到内⽹Web服务器的80端⼝上。并且,在路由器上还存在⼀个Session,当内⽹服务器返回数据给路由器时,路由器能准确的将消息发送给外⽹请求⽤户的主机。在这过程中,路由器充当了⼀个反向代理的作⽤。
0x02 端⼝转发
端⼝转发(Port forwarding),有时被叫做隧道,是安全壳(SSH) 为⽹络安全通信使⽤的⼀种⽅法。⽐如,我们现在在内⽹中,是没有办法直接访问外⽹的。但是我们可以通过路由器的NAT⽅式访问外⽹。假如我们内⽹现在有100台主机,那么我们现在都是通过路由器的这⼀个公⽹IP和外⽹通信的。那么,当互联⽹上的消息发送回来时,路由器是怎么知道这个消息是给他的,⽽另外消息是给你的呢?这就要我们的ip地址和路由器的端⼝进⾏绑定了,这时,在路由器中就会有⼀个内⽹ip和路由器端⼝对应的⼀张表。当路由器的1000端⼝收到消息时,就知道把消息发送给他,⽽当2000端⼝收到消息时,就知道把消息发送给你。这就是端⼝转发,其转发⼀个端⼝收到的流量,给另⼀个主机
端口转发和端口映射实现的效果是一样的,都是流量转发。区别在于有没有查看包的内容(路由是否主动寻找内网主机并转发)
端口转发:需要查看包的标识,寻找标识对应的主机转发流量,端口绑定的Session持续时间,程序
端口映射:不需要查看包内容,直接转发到绑定的内网主机,人为绑定,长期有效
正向代理和反向代理
0x01 正向代理
Lhost ——> proxy ——> Rhost
Lhost为了访问到Rhost,向proxy发送了⼀个请求并且指定⽬标是Rhost,然后proxy向Rhost转交请求并将获得的内容返回给Lhost,简单来说正向代理就是proxy代替了我们去访问Rhost。
正向代理:简单的说,就是客户端主动向代理发送⼀个请求,然后代理向服务器请求并将获取的内容返回给客户端。
0x02 反向代理
Lhost<—>proxy<—>firewall<—>Rhost
Lhost只向proxy发送普通的请求,具体让他转到哪⾥,proxy⾃⼰判断,然后将返回的数据递交回来,这样的好处就是在某些防⽕墙只允许proxy数据进出的时候可以有效的进⾏穿透。除了保证内⽹服务器的安全外,还提供负载均衡的功能。
代理工具
0x01 proxychains-ng
#安装gcc
yum -y install gcc gcc-c++ kernel-devel
#安装proxychains-ng
wget -O- https://gist.githubusercontent.com/ifduyue/dea03b4e139c5758ca114770027cf65c/raw/install-proxychains-ng.sh | sudo bash -s
#如果是Kali系统的话,由于Kali默认安装了proxychains,所以我们需要先卸载⾃带的proxychains,然后再安装proxychains-ng
apt-get autoremove proxychains
#我的VPS上不去github,选择手动
下载上传到VPS:https://github.com/rofl0r/proxychains-ng/releases/tag/v4.15
cd proxychains-ng-4.15/
chmod +x configue
./configure --prefix=/usr --sysconfdir=/etc
make && make install
make install-config
配置文件/etc/proxychains.conf
##vim /etc/proxychains.conf
dynamic_chain
chain_len = 1
proxy_dns
remote_dns_subnet 224
tcp_read_time_out 15000
tcp_connect_time_out 8000
[ProxyList]
#socks5 0.0.0.0 1080
#socks5 0.0.0.0 10000 admin 123456
socks4 0.0.0.0 1080
使用
Usage: proxychains4 -q -f config_file program_name [arguments]
-q makes proxychains quiet - this overrides the config setting
-f allows one to manually specify a configfile to use
一般使用
proxychains4 命令/程序
不显示过程
proxychains4 -q 命令/程序
0x02 Proxifier
配置VPSIP和1080端口