由于很多的第三方API在认证的时候都需要都需要一个回调地址(域名路径),而域名只能指向一个公网的IP,所以我们就需要一个暴露在公网的IP或者端口。
解决方法有很多,比如路由器做端口映射,ngrok内网穿透等等,这里,我们使用的方法是【SSH打洞+Apache反向代理】的方式,更多方法可以参考《自己搭建服务器…》)
最早,我的概念是 内网可以可以访问外网,但是外网由于不知道内网主机的IP,无法访问内网。再后来 了解了路由器端口映射,知道原来可以通过把路由器某个端口转发到内部某台电脑上的某个端口来实现让外网访问内网。
至此,我开始想如果外网访问内网的时候不仅带上公网IP,也带上了内网IP,是不是可以访问内网呢?理论上如果硬件支持,个人觉得应该可行。但估计需要路由器与应用的支持,感兴趣的可以了解下NAT。或者,如果我们建立一个socket长连接,只要长连接不关闭,接下来是不是就可以由外网一直访问内网呢?
SSH实现内网穿透的原理类似,ssh命令内网和服务器建立一个类似telnet的较长时间的连接(隧道),然后让服务器监听自己的某一个端口,ssh会将信息加密通过之前建立的专门的隧道发送到本机,并转发给本机之前指定的端口。若服务器是一个web服务器,某个端口已经被监听,可以再详细配置,本实验是将apache再做一个反向代理,实现对某个特定域名进行转发。
3.1 配置Apache反向代理
3.1.1加载指定模块。将mods-available
中的proxy.conf
和proxy.load
以及proxy_http.load
三个文件建立软连接到mods-enabled
,同时编辑proxy.conf
,改变权限
Require all denied > Require all granted
3.1.2 在apache上建立一个虚拟主机。
仅需要配置域名和转发端口参考 ,因为apache已经监听80端口,ssh无法再次监听,所以需要建立虚拟主机,将指定域名的访问转发到其他接口再由ssh转发到本地。
ServerName 【domain】
ProxyPass / http://127.0.0.1:XXXX/
ProxyPassReverse / http://127.0.0.1:XXXX/
测试:若有tomcat实例,可以将XXXX
改为实例端口,先转发到tomcat测试是否成功。
3.2 配置SSH
3.2.1在服务器和本地电脑上都装上open-ssh。linux默认已经有了。windows要安装。
3.2.2在本地电脑上打开cmd,输入命令.XXXX
为上诉apache转发到本地的端口
ssh -R -v -N XXXX:localhost:8080 root@hostname
以root身份登录hostname,建立ssh隧道。
hostname监听自身XXXX端口,并加密改该端口收到的信息
传送到ssh隧道,转到本机。
再由本机转发到localhost的8080端口。
ps:若服务器上无apache或者80端口没有被监听,可以不配置apache,直接配置ssh
3.3 ssh连接超时解决方法
3.3.1 修改server端的etc/ssh/sshd_config
ClientAliveInterval 60 #server每隔60秒发送一次请求给client,然后client响应,从而保持连接
ClientAliveCountMax 3 #server发出请求后,客户端没有响应得次数达到3,就自动断开连接,正常情况下,client不会不响应
3.3.2 修改client端的etc/ssh/ssh_config添加以下:(在没有权限改server配置的情形下)
ServerAliveInterval 60 #client每隔60秒发送一次请求给server,然后server响应,从而保持连接
ServerAliveCountMax 3 #client发出请求后,服务器端没有响应得次数达到3,就自动断开连接,正常情况下,server不会不响应
要重启sshd服务 service ssh restart
3.3.3另一种方式:
在命令参数里ssh -o ServerAliveInterval=60
这样子只会在需要的连接中保持持久连接, 毕竟不是所有连接都要保持持久的。
3.3.4 或者可以一直接收信息,加个top,实时回显数据。
1.由于版本不同,很难从网上找到apache2.7载入模块的方法。只能通过查看入口apache2.conf
内容和之前载入站点的方式判断,只要莫相应模块从mods-available
复制或软连接到mods-enabled
。
2.proxy.conf
的配置文件改好忘记保存,浪费了大量时间。此处应该注意每一个命令的用处。