Skip to main content

动态公网IP再利用

问题

  • 这个公网IP为路由器WAN口所得,我可以让局域网内的服务主机供公网访问吗

    • 利用路由器上的端口映射功能,将内网的8081映射到公网的8081
  • 这个IP地址每天会更新一次,我要每次使用都需要查询一下吗

    • 通过DDNS更新IP地址值到域名的A记录
  • 我想做一个网站,80、443端口被运营商封了怎么办

    • 通过服务器搭建的反向代理服务,将服务器上的80端口反向代理到公网IP的8081端口

端口映射

内网地址:192.168.188.205的所有端口,映射到外网接口的1-65536,all端口

映射成功后,比如192.168.188.205这台主机搭建了WEB服务在8088端口,此时,访问外网接口的8088端口就可以进行连接

DDNS:

端口映射后,虽然可以达成访问需求,但是毕竟是动态公网IP,此地址每天都会更新,我们可以利用DDNS服务,定期检查现在公网,把这个地址自动写进DNS的域名解析A记录的值

DDNS工作流程:

获取当前公网IP地址

通过API的ID与密码登录DNS控制台

修改配置文件里子域名的IP值

通过定时任务定时更新域名解析的值为当前公网IP

材料:

  • 随便注册域名一个
  • Linux主机或支持DDNS服务的路由器

我拿已经注册好的域名来做一个演示(DNSPod平台)

在控制台->我的域名->选择已有域名->增加记录

随便增加一个三级域名记录:xxx.llzdsec.com,类型为A记录,记录值随便填

获取控制台API

点击右上角头像->账号中心->API密钥->DNSPod Token

创建成功后,请记住ID与Token值,为API的账号与密码

编辑脚本

1
2
mkdir /ddns -m 777 
vim /ddns/ddns.sh
BASH

修改TOKEN,DOMAIN,SUB_DOMAIN为实际值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/bin/bash

# This program establish ddns service
# to modify the public ip address of dns server.
# The dns server is dnspod.
# /etc/crontab # if centos etc.
# */10 * * * * root /usr/local/sbin/dnspod_ddns.sh 1>&2> /dev/null
# /etc/crontabs/root # if openwrt etc.
# */10 * * * * /usr/sbin/dnspod_ddns.sh

#TOKEN=id,token
TOKEN="112233,67fa231667a33de0f5255f62d33161eb"
#full domain name
DOMAIN="yourdomain.com"
#sub domain first name
SUB_DOMAIN="xxx"

# TOKEN=`cat dnspod_ddns.conf|grep TOKEN|awk -F'=' '{print $2}'`
# DOMAIN=`cat dnspod_ddns.conf|grep -e '^DOMAIN'|awk -F'=' '{print $2}'`
# SUB_DOMAIN=`cat dnspod_ddns.conf|grep SUB_DOMAIN|awk -F'=' '{print $2}'`


DATA="login_token=$TOKEN&format=json&domain=$DOMAIN&sub_domain=$SUB_DOMAIN&record_type=A&offset=0&length=3"
JOSN_RECORDS=`curl -4 -s -X POST https://dnsapi.cn/Record.List -d $DATA`

RECORD_ID=`echo $JOSN_RECORDS|sed '/id/ s/.*id":"\(.*\)","ttl.*/\1/'`
LINE_ID=`echo $JOSN_RECORDS|sed '/line_id/ s/.*line_id":"\(.*\)","type.*/\1/'`
#=================get record ip
IP_RESOLVED=`echo $JOSN_RECORDS|sed '/value/ s/.*value":"\(.*\)","enabled.*/\1/'`

#================get real ip
#REAL_IP=`cat</dev/tcp/ns1.dnspod.net/6666`
REAL_IP=`curl -4 -s myip.ipip.net|awk -F' |:' '{print $3}'`

#REAL_IP="2.2.3.2"
if [ $REAL_IP != $IP_RESOLVED ]; then
#================modify record
DATA="login_token=$TOKEN&format=json&domain=$DOMAIN&record_id=$RECORD_ID&sub_domain=$SUB_DOMAIN&value=$REAL_IP&record_type=A&record_line_id=$LINE_ID"
# echo $DATA
JSON_RESULT=`curl -4 -s -X POST https://dnsapi.cn/Record.Modify -d $DATA`
echo $JSON_RESULT >> /var/log/dnspod_ddns.log
IP_RESOLVED=$REAL_IP
fi
BASH
1
2
3
chmod ugo+x ./*.sh							#赋予脚本执行权限
nslookup update.llzdsec.com #查看记录是否更改成功
curl ip.sb #查看当前公网ip是否符合
BASH

定时执行

1
2
crontab -e
*/30 * * * * /bin/bash /liangzai/ddns.sh #每30分钟执行一次更新
BASH

反向代理

做完上面步骤后,已经可以通过域名的方式访问内网的WEB应用了,但是由于运营商封堵了80(http)和443(https)端口,导致要用到其他端口才可以访问:update.llzdsec.com:8088,加个端口会显得比较别扭,用反向代理可以很好解决

登录自己购买的服务器

在开始之前,先关闭阻止菜鸟前进的SElinux和防火墙

1
2
3
sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
cat /etc/selinux/config |grep ^SELINUX=
setenforce 0
GRADLE
1
2
systemctl stop firewalld
systemctl disable firewalld
BASH

安装配置

1
yum install nginx -y
BASH
1
vim /etc/nginx/conf.d/proxy.conf
BASH
1
2
3
4
5
6
7
8
server {
listen 80;
server_name test.llzdsec.com;

location / {
proxy_pass http://update.llzdsec.com:8088;
}
}
BASH
1
systemctl enable nginx -now