条件说明
宽带无公网ip,局域网中的局域网,需要有一台有公网ip的服务器
场景说明
pc | net ip | lan ip |
---|---|---|
local | / | 192.168.31.60 |
server | 11.12.13.14 | 192.168.0.100 |
-
local为本地电脑,家庭宽带,无公网ip
-
server为阿里云服务器,有固定公网ip,linux
配置
-
修改服务器配置
server上需编辑/etc/ssh/sshd_config,修改GatewayPorts为yes,更多请查看 man sshd_config
-
本地机器操作
ssh sshUser@11.12.13.14 -C -N -g -R \ localhost:22:localhost:10022 \ -o ExitOnForwardFailure=yes \ -o ServerAliveInterval=60
访问远程10022端口就是访问本地的22端口,心跳检测为60s,前面的localhost可更换为局域网其它电脑的ip、端口,比如换成3389,windows的远程桌面服务,即可随时访问家里电脑了,端口酌情替换。
其它
-
服务器上新建一个用户,专门用于端口转发,并限制登录,执行以下命令
useradd ddns -s /home/ddns/bin/login.sh -m # 创建用户,指定shell passwd ddns # 修改密码 chown ddns:ddns -R /home/ddns # 修改文件夹权限 vi /home/ddns/bin/login.sh # 创建login.sh文件,内容见下文 chmod +x /home/ddns/bin/login.sh # 添加执行权限
login.sh文件内容,远程登录后只能用ssh命令
#!/bin/sh stty erase ^H stty kill ^U echo -en "SSH to Host :" read host echo -en "UserName: " read username /usr/bin/ssh $host -l $username
-
本地服务配置(linux环境)
-
vi /usr/lib/systemd/system/ddns.service
[Unit] Description=ddns After=network.target [Service] Type=simple ExecStart=/usr/bin/ssh ddns@server-ip -C -N -g -R *:20010:localhost:80 -o ExitOnForwardFailure=yes -o ServerAliveInterval=60 [Install] WantedBy=multi-user.target
-
配置免密登录到服务器
把本地服务器公钥放到云服务器上
-
服务开机自启
systemctl daemon-reload systemctl enable ddns # 上面的文件名 systemctl start ddns
-
服务断线重连(crontab)
使用crontab定时任务隔几分钟执行下面命令
#!/bin/bash DDNS=`systemctl status ddns | grep Active | awk '{print $3}'` if [ "$DDNS" == "(running)" ] then echo "ddns is running" else systemctl start ddns fi