两个路由互发心跳包自动改 hosts 怎么实现好? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
OpenWrt 是一个专门面向嵌入式设备的 Linux 发行版。你可以将 OpenWrt 支持的型号的嵌入式设备,比如各种路由器上的系统,换成一个有更多可能性可以折腾的 Linux 系统。
OpenWrt 官方网站
Kaiyuan
V2EX    OpenWrt

两个路由互发心跳包自动改 hosts 怎么实现好?

  •  
  •   Kaiyuan 2020-10-08 01:56:01 +08:00 759 次点击
    这是一个创建于 1910 天前的主题,其中的信息可能已经有所发展或是发生改变。

    就是隧道里保持相互通信的办法。

    我现在研究到的就是 shell 定时执行,然后 lua 接收然后修改 hosts 文件,但是有些坑。

    不知道是我固件问还是怎么,没法刷新 DNS,重启 dnsmasq 都没用。

    根据知乎的一个问题回答为基础实现 lua 接收 Post 。

    之前完全没接触过 lua,看着手册和 Google 弄了下面的代码。

    ##接收端

    /www/cgi-bin/edithosts

    #!/usr/bin/lua local edithosts= require 'edithosts' edithosts.Run() 

    /usr/lib/lua/edithosts

    local edithosts= {} function edithosts.Run() local client = os.getenv("REMOTE_ADDR") local GET = os.getenv("QUERY_STRING") local POST = nil local Domain = nil local ifedit = "0" local hostsFile = "/www/edithosts" local hostsLog = "/www/edithosts.log" local POSTLength = tonumber(os.getenv("CONTENT_LENGTH")) or 0 if (POSTLength > 0) then POST = io.read(POSTLength) Domain = string.sub(POST, 3) end if (Domain ~= nil) then -- 修改 Hosts local hostsMain = string.format("%s %s", client or '-', Domain or '-') local hostsR = io.open(hostsFile ,"a+") local hostsOld = hostsR:read() hostsR:close() ifedit = "2" if (hostsMain ~= hostsOld) then -- 如果内容不一样则修改 hosts 文件 local hostsIO = io.open(hostsFile, "w") hostsIO:write(hostsMain) hostsIO:close() ifedit = "1" -- 写入日志 local logIO = io.open(hostsLog, "a") local nowTime = os.date("%Y-%m-%d %H:%M:%S") local logMain = string.format("%s - %s - %s\n", client or '-', Domain or '-', nowTime or '-') logIO:write(logMain) logIO:close() -- 重启 dnsmasq local redns = os.execute("/etc/init.d/dnsmasq restart") end end io.write("Content-type: text/html\nPragma: no-cache\n\n") io.write(ifedit) end return edithosts 

    ##发送请求

    */5 * * * * /usr/bin/postroom.sh 

    br-wan 是网口

    /www/oldip 文件要预先创建

    1.room 和 2.room 是自定义的域名

    #!/bin/bash interface=br-wan NEW_IP=$(ip a show dev $interface |grep -oP "inet [0-9]+.[0-9]+.[0-9]+.[0-9]+" | sed 's/inet //g') NOWTIME=`date` IP_FILE='/www/oldip' CURRENT_IP=`cat /www/oldip` LOG_FILE="/www/post.log" if [ ${NEW_IP} == ${CURRENT_IP} ] || [ ! ${NEW_IP} ]; then echo "" else THIS_LOG=`curl -X POST --data 'd=1.room' 2.room:7080/cgi-bin/edithosts` echo ${NOWTIME} >> ${LOG_FILE} if [ ${THIS_LOG} ]; then echo "TR069 OK" ${NEW_IP} >> ${LOG_FILE} echo "" >> ${LOG_FILE} echo ${NEW_IP} > ${IP_FILE} else echo "Error " ${THIS_LOG} >> ${LOG_FILE} fi fi 

    该如何完善这个功能呢?

    第 1 条附言    2020-10-12 00:54:27 +08:00

    知道为什么有个路由的本地 hosts 文件无效了,因为我勾选了 DHCP/DNS 中的忽略解析文件,这个不能勾! DHCP/DNS

    4 条回复    2020-10-21 16:29:08 +08:00
    LGA1150
        1
    LGA1150  
       2020-10-09 15:00:50 +08:00   1
    接口上线时有 hotplug 事件触发,无需定时轮询
    hotplug 脚本在 /etc/hotplug.d/iface/
    再通过 SSH 远程执行命令(需要密钥验证)

    至于 DNS 缓存问题,路由器上是否有其他 DNS 代理?如 Adguard home,pdnsd

    不过要是两个路由器同时重启了,就保持不了了
    最好还是有一个固定 IP 的服务器,用 frp 或 SSH 穿透
    Kaiyuan
        2
    Kaiyuan  
    OP
       2020-10-09 23:12:22 +08:00
    @LGA1150 #1 这种功能不是在外网的环境使用,是纯内部环境下非固定 IP 的情况。
    有外网就直接 DDNS 方便多了。
    fkmc
        3
    fkmc  
       2020-10-21 10:25:40 +08:00
    @Kaiyuan #2 内网 ip 也可以 ddns 可以获取内网 ip
    Kaiyuan
        4
    Kaiyuan  
    OP
       2020-10-21 16:29:08 +08:00 via iPhone
    @wccc 是完全纯内网,完全无外网的情况。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1128 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 17:57 PVG 01:57 LAX 09:57 JFK 12:57
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86