# 动态公网IP再利用 ## 问题 - 这个公网IP为路由器WAN口所得,我可以让局域网内的服务主机供公网访问吗 - 利用路由器上的端口映射功能,将内网的8081映射到公网的8081 - 这个IP地址每天会更新一次,我要每次使用都需要查询一下吗 - 通过DDNS更新IP地址值到域名的A记录 - 我想做一个网站,80、443端口被运营商封了怎么办 - 通过服务器搭建的反向代理服务,将服务器上的80端口反向代理到公网IP的8081端口 ## 端口映射 内网地址:192.168.188.205的所有端口,映射到外网接口的1-65536,all端口 [![](https://img.llzdsec.com/ddns/%E6%88%AA%E5%B1%8F2022-04-23%20%E4%B8%8B%E5%8D%884.23.22.png)](https://img.llzdsec.com/ddns/%E6%88%AA%E5%B1%8F2022-04-23%20%E4%B8%8B%E5%8D%884.23.22.png) 映射成功后,比如192.168.188.205这台主机搭建了WEB服务在8088端口,此时,访问外网接口的8088端口就可以进行连接 ## DDNS: 端口映射后,虽然可以达成访问需求,但是毕竟是动态公网IP,此地址每天都会更新,我们可以利用DDNS服务,定期检查现在公网,把这个地址自动写进DNS的域名解析A记录的值 ### DDNS工作流程: 获取当前公网IP地址 通过API的ID与密码登录DNS控制台 修改配置文件里子域名的IP值 通过定时任务定时更新域名解析的值为当前公网IP ## 材料: - 随便注册域名一个 - Linux主机或支持DDNS服务的路由器 我拿已经注册好的域名来做一个演示(DNSPod平台) 在控制台->我的域名->选择已有域名->增加记录 [![](https://img.llzdsec.com/ddns/%E6%88%AA%E5%B1%8F2022-04-23%20%E4%B8%8B%E5%8D%885.14.11.png)](https://img.llzdsec.com/ddns/%E6%88%AA%E5%B1%8F2022-04-23%20%E4%B8%8B%E5%8D%885.14.11.png) 随便增加一个三级域名记录:xxx.llzdsec.com,类型为A记录,记录值随便填 [![](https://img.llzdsec.com/ddns/%E6%88%AA%E5%B1%8F2022-04-23%20%E4%B8%8B%E5%8D%885.18.47.png)](https://img.llzdsec.com/ddns/%E6%88%AA%E5%B1%8F2022-04-23%20%E4%B8%8B%E5%8D%885.18.47.png) ## 获取控制台API 点击右上角头像->账号中心->API密钥->DNSPod Token 创建成功后,请记住ID与Token值,为API的账号与密码 [![](https://img.llzdsec.com/ddns/%E6%88%AA%E5%B1%8F2022-04-23%20%E4%B8%8B%E5%8D%887.24.43.png)](https://img.llzdsec.com/ddns/%E6%88%AA%E5%B1%8F2022-04-23%20%E4%B8%8B%E5%8D%887.24.43.png) ## 编辑脚本
``` 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

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,加个端口会显得比较别扭,用反向代理可以很好解决 [![](https://img.llzdsec.com/ddns/%E6%97%A0%E6%A0%87%E9%A2%98.png)](https://img.llzdsec.com/ddns/%E6%97%A0%E6%A0%87%E9%A2%98.png) 登录自己购买的服务器 在开始之前,先关闭阻止菜鸟前进的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

```