如何获得wan口的public ipv4地址
这是一篇非常没用的文章,只是用来水金币的。
能受益于该文章的只有符合以下全部条件的人:
1.宽带有动态公网IP
2.死都不想用DDNS
3.想在外面远程访问
4.不会用Chat gpt
5.Headless Linux服务器
在没有用ddns之前我有想过尝试这方法,但是啊,这方法除了不需要域名之外完全被ddns吊打,ddns真的是太香了,所以你懂的,这文章真的是水文。
我搜索过在Linux里用Shell怎么获得ip,搜索引擎推送的文章告诉我用ip addr,的确显示ip了,甚至连ipv6的global address都有了,但是却没有显示ipv4的公网ip。然后我又搜索用Shell怎么获得ipv4公网ip,所有的推送都告诉我需要用第三方才能查到,那就用第三方吧。第三方有这几种:
1.路由器
2.第三方网站
3.DNS服务器
用路由器的话,那路由器得有ssh或者telnet的功能,我的没有,pass。
用第三方网站的话,安全吗?
用那就剩下DNS服务器了,反正我每天都用,对面早就摸清我的老底了。
我搜索到的DNS服务器有cloudflare、opendns还有谷歌。经过我反复测试的结果是谷歌最靠谱,cloudflare有时会无法解析,opendns甚至无视我。但是我在zdm又不能写谷歌的,因为会警告我,而且不让文章发表,别问我怎么知道的。所以我就用cloudflare的来写,如果你们想知道搜索关键词是什么的话请搜索dig whoami。
dig @1.1.1.1 ch txt whoami.cloudflare +short
执行这命令,就会显示你ipv4的公网ip了。
好了,这文章结束了。是不是很水,我写了那么多废话其实只需要用一行命令就能总结。
但是啊,你在家里知道了公网ip有什么用,你在内网直接用内网地址访问自己的服务器不就行了。那把这地址记在手机上,然后出门访问呢?当然可以,但是别忘了自己的公网ip是会变的,你想想自己不在家然后公网变了怎么办,这情况可能只有第三方服务商的vnc可以救你,但是你的Linux服务器上有GUI吗有装vnc吗。所以这文章还能接着写。
解决的方法很简单,那就是让你的服务器反复的运行那命令,然后当ip改变后,发个消息给你。当然发消息得依赖第三方服务,毕竟你懂的,你要远程访问self host的服务,你得知道服务器ip是什么。第三方服务很多的,你们怎么喜欢怎么来,我用pushplus演示。反复运行命令当然是用cron job方便,我相信所有Linux系统都会有的。
好了,开始写解决的方法。
首先得要用个文件存变化前的ip地址,就叫ipv4.txt吧。因为你懂的,你运行完上面的命令后就显示下就没了,服务器并不记得下次运行那命令时之前的ip是什么,那样的话,每运行一次那命令就提醒能一次。
然后再建个文件存要执行的命令,就叫getip.py。和之前一样,你们喜欢哪种语言就用哪种,我用Python演示。
假设服务器上的用户名是test,我把那2个文件放进了一个叫ip的文件夹,那2个文件所在文件夹的绝对路径就是/home/test/ip/,如果你不知道自己所在位置的话就用pwd命令。
因为我不想解释Python,所以我直接丢代码出来,然后说下要改哪些地方。
#! /usr/bin/env python3
# encoding:utf-8
import subprocess
import requests
ip_dir = '$PWD'
dns_request = 'dig @1.1.1.1 ch txt whoami.cloudflare +short'
old_ip = open(ip_dir+'ipv4.txt','r',encoding='UTF-8')
get_new_ip = subprocess.check_output(['bash','-c',dns_request])
convert_type = get_new_ip.decode()
new_ip = convert_type.replace('"','')
token = 'youtoken'
title = 'update'
content = 'new%20public%20address%20is%3A' + new_ip
url = 'http://www.pushplus.plus/send?token=' + token + '&title=' + title + '&content=' + content
if old_ip != new_ip:
requests.get(url)
update_ip = open(ip_dir+'ipv4.txt','w',encoding='UTF-8')
update_ip.write(new_ip)
update_ip.close()
首先我是用Ubuntu运行Python时得用python3所以才写/usr/bin/env python3,如果你是用其它Linux的话可能直接写/usr/bin/env python就行,具体自己查。
然后要把ip_dir的''里的$PWD改成文件所在的绝对路径,如果你运行pwd命令的话,最后的/会被省掉,记得补上。
如果你想换个DNS服务商的话,请先运行下那命令,确保可以正确获得ip,然后把dns_request的''里的命令替换掉就行。
然后把token的''里的youtoken换成你的token。
好了就保存,为了确保这py文件可以执行,运行下chmod +x /home/test/ip/getip.py。然后现在试试这py有没有出错,运行下/home/test/ip/getip.py,再看看pushplus上有没有收到消息,如果没有检查下你是不是把'给删掉了,或者少了/,或者还有可能就是平台修改了代码,记得和图片对比下。如果你收到消息但是不是你的公网ip,那就表示cloudflare抽风了,你可以换个DNS服务商。要注意下记得把/home/test/ip/换成你的绝对路径。我确定这代码可以用,我测试了3次,都成功了。
成功发送消息后,就该用cron job定时运行py脚本了。
运行crontab -e,首次使用时可能会问用什么editor,我是选nano,你们选什么是你们的事。然后移动到最下面加入这行:
*/15 * * * * /home/test/ip/getip.py
然后保存。然后运行crontab -l,是小写的L,确认把任务加上去了。记得换成你的绝对路径。
好了,如果没有出问题,那每15分钟就会运行1次那代码,然后如果你的ipv4公网ip改变就会发送消息到pushplus给你。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~