废话:
一直想在本地搭建一个服务器,至于有什么用、干嘛用,我也不知道,也许就是喜欢捣腾吧。
现在本地建站阻碍越来越多,动态IP、80端口封闭、NAT转发……,唉~
还好还有些希望,比如电信目前还是对外真实IP,不像移不动直接给NAT转发了,直接灭了一些希望 =_=!
还有就是有一批大小公司在帮着我们解决问题 (*^__^*)
目标:
外界能通过域名直接访问到本地环境上的网站。
阻碍:
动态IP、80端口封闭。(移动网的话,还有被NAT转发了的困境)
解决动态IP:
办法1:申请固定IP。(别拿砖拍我,也许土豪就需要这个答案呢)
方法2:不关机OR不关路由器。(貌似这办法已经失效了,网络提供商会定时刷新)
方法3:使用花生壳、nat123或DNSPod等,电脑装一下他们的客户端,然后帮上域名就OK了。(路由器一般都直接支持花生壳)
//可能有些人总会感觉第三方软件或平台不安全、太多广告,限制多、收费……,那我们就自己弄一个。(需要公网主机或空间)
方法4:可以自己写个脚本OR小软件,实时将本地公网IP发送给处在公网的主机,然后主机上再转发、代理或跳转过来。
//当然也可以使用自己脚本加第三方的平台,这样既拒绝了客户端的广告……也省掉了公网主机。
方法5:通过脚本实时更新第三方平台的dns解析地址,例如:shell脚本+DNSPod。
解决80端口被封:
//80端口被封闭其实并不是太影响我们,毕竟我们不是真的想在本地搭建一个生产环境。
//本地建服务器用于生产的话,还是有很多瓶颈的,例如带宽、稳定性……
//当然也要为了使用方便,我可不希望我的网站网址长这样“http://zpblog.cn:8888”
方法1:通过nat123进行80端口映射。(应该也有其他提供类似服务的网站,你们可以百度百度)
方法2:通过nat123上面的url隐形转发。(我也试过其他DNS服务商的URL隐形转发,但貌似都不能带端口)
方法3:通过公网的主机或者空间进行代理转发或者跳转等。(在自己的主机空间上那就自由多了,方法也很多)
下面给出两个不借助路由及客户端的实例
实例1:
本机环境:
系统:Ubuntu;网络:电信(动态公网IP、80及8080被封、其他端口正常)。
使用方法:
通过脚本实时更新DNSPod上的域名解析以解决动态IP,再通过nat123的url隐藏转发以解决80封闭
具体过程:
首先注册nat123和DNSPod并接入域名。
然后在DNSPod上建个二级域名,例如:“nat.zpblog.cn”
接着拷贝附件中的“DNSPod更新脚本”到你的电脑,把最下面的“#设置用户参数”和“#检查更新域名”改成你自己的。
执行脚本,然后到DNSPod上看看域名的解析地址是否给成你本地的公网IP地址了,也可以ping一下看看。
测试一下,例如通过“http://nat.zpblog.cn:8888”看能不能访问,如果不能,试一下“http://ip:8888”看看能不能访问
然后到nat123上面设置url隐藏转发。例如将“zpblog.cn”转发到“http://nat.zpblog.cn:8888”
最后将上面的脚本设置成定时执行,我们就可以直接通过“http://zpblog.cn”访问了
友情提示:
域名的解析、转发等生效等都是需要时间的,请耐心等待生效。
实例2:
本机环境:
系统:都行;网络:电信(动态公网IP、80及8080被封、其他端口正常)。
使用方法:
通过定时将IP发送到公网主机或空间以解决动态IP,再通过公网主机空间跳转以解决80封闭
具体过程:
首先你的有一个处于公网的主机或者空间。
在公网主机或者空间上放上附件中的“IP接收GetIP.php”这个文件
在本地电脑上加上一个定时访问GetIP这个页面,例如:“curl zpblog.cn/GetIP.php”
将域名指向这个主机或者空间,并在这个主机上上传附件中“IP跳转JumpIP.php”这个文件,并重名为index.php
通过域名就可以直接访问了,看看是否直接跳转到你本地环境了
附件:
DNSPod更新脚本
#!/bin/sh ################################################# # AnripDdns v3.08.09 # 基于DNSPod用户API实现的动态域名更新 # 作者: 若海[[email protected]] # 介绍: http://www.anrip.com/ddnspod ################################################# # 全局变量表 arPass=arMail="" # 获得外网地址 arIpAdress() { local inter="http://members.3322.org/dyndns/getip" wget --quiet --no-check-certificate --output-document=- $inter } # 查询域名地址 # 参数: 待查询域名 arNslookup() { local dnsvr="114.114.114.114" nslookup ${1} $dnsvr | tr -d '\n[:blank:]' | sed 's/.\+1 \([0-9\.]\+\)/\1/' } # 读取接口数据 # 参数: 接口类型 待提交数据 arApiPost() { local agent="AnripDdns/3.08([email protected])" local inter="https://dnsapi.cn/${1:?'Info.Version'}" local param="login_email=${arMail}&login_password=${arPass}&format=json&${2}" wget --quiet --no-check-certificate --output-document=- --user-agent=$agent --post-data $param $inter } # 更新记录信息 # 参数: 主域名 子域名 arDdnsUpdate() { local domainID recordID recordRS recordCD # 获得域名ID domainID=$(arApiPost "Domain.Info" "domain=${1}") domainID=$(echo $domainID | sed 's/.\+{"id":"\([0-9]\+\)".\+/\1/') # 获得记录ID recordID=$(arApiPost "Record.List" "domain_id=${domainID}&sub_domain=${2}") recordID=$(echo $recordID | sed 's/.\+\[{"id":"\([0-9]\+\)".\+/\1/') # 更新记录IP recordRS=$(arApiPost "Record.Ddns" "domain_id=${domainID}&record_id=${recordID}&sub_domain=${2}&record_line=默认") recordCD=$(echo $recordRS | sed 's/.\+{"code":"\([0-9]\+\)".\+/\1/') # 输出记录IP if [ "$recordCD" == "1" ]; then echo $recordRS | sed 's/.\+,"value":"\([0-9\.]\+\)".\+/\1/' return 1 fi # 输出错误信息 echo $recordRS | sed 's/.\+,"message":"\([^"]\+\)".\+/\1/' } # 动态检查更新 # 参数: 主域名 子域名 arDdnsCheck() { local postRS local hostIP=$(arIpAdress) local lastIP=$(arNslookup "${2}.${1}") echo "hostIP: ${hostIP}" echo "lastIP: ${lastIP}" if [ "$lastIP" != "$hostIP" ]; then postRS=$(arDdnsUpdate $1 $2) echo "postRS: ${postRS}" if [ $? -ne 1 ]; then return 0 fi fi return 1 } ################################################### # 设置用户参数 arMail="[email protected]" arPass="******" # 检查更新域名 arDdnsCheck "zpblog.cn" "nat"
IP获取GetIP.php
<?php # GetIP.php # 用于获取来访IP并存入ip.txt文件 # By zpblog.cn //获取来访IP function getIP(){ global $ip; if (getenv("HTTP_CLIENT_IP")) $ip = getenv("HTTP_CLIENT_IP"); else if(getenv("HTTP_X_FORWARDED_FOR")) $ip = getenv("HTTP_X_FORWARDED_FOR"); else if(getenv("REMOTE_ADDR")) $ip = getenv("REMOTE_ADDR"); else $ip = "Unknow"; return $ip; } echo getIP(); //将获取的IP存入ip.txt文件中。 $file = 'ip.txt'; if (is_writable($file) == false) { die('file not found'); } $data = getIP(); file_put_contents ($file, $data); ?>
IP跳转JumpIP.php
<?php # JumpIP.php # 用于读取文件ip.txt里的地址,然后转发过去。 # By zpblog.cn //读取ip.txt中的IP地址 $file = "ip.txt"; if (file_exists($file) == false) { die('file not found'); } $data = file_get_contents($file); ?> <frameset> <!-- 跳转到获取的IP地址 --> <frame src="http://<?php echo $data;?>:8888" /> </frameset>
相关文章
转:Linux安装rinetd实现TCP/UDP端口转发2021-03-19
windows端口转发(映射)2020-02-20
Windows目标服务器端口监测脚本微信通知2016-08-25
CentOS上搭建ngrok服务端(内网穿透)2016-02-26
实战 SSH 端口转发2014-09-29