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

2020-10-08 01:56:01 +08:00
 Kaiyuan

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

我现在研究到的就是 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

该如何完善这个功能呢?

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

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

不过要是两个路由器同时重启了,就保持不了了
最好还是有一个固定 IP 的服务器,用 frp 或 SSH 穿透
Kaiyuan
2020-10-09 23:12:22 +08:00
@LGA1150 #1 这种功能不是在外网的环境使用,是纯内部环境下非固定 IP 的情况。
有外网就直接 DDNS 方便多了。
wccc
2020-10-21 10:25:40 +08:00
@Kaiyuan #2 内网 ip 也可以 ddns 可以获取内网 ip
Kaiyuan
2020-10-21 16:29:08 +08:00
@wccc 是完全纯内网,完全无外网的情况。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/712997

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX