https://github.com/bitcoin/bitcoin/blob/d72758c3f6c34cd835f5de3efc230964f3b1ea56/src/torcontrol.cpp#L539

If a user is running Tor proxy outside localhost (perhaps on other host inside LAN or in containerised environment) , the automatic creation of onion services ends up creating an onion service listening to hardcored 127.0.0.1 address on the Tor proxy's host instead of the private address of the bitcoind – effectively running an empty onion service listening the Tor proxy's localhost.
stats.m_ping_usec = nPingUsecTime;
    stats.m_min_ping_usec  = nMinPingUsecTime;
    stats.m_ping_wait_usec = count_microseconds(ping_wait);
    
    CService addrLocalUnlocked = GetAddrLocal();
    stats.addrLocal = addrLocalUnlocked.IsValid() ? addrLocalUnlocked.ToString() : "";
    stats.m_conn_type_string = ConnectionTypeAsString();
}
#undef X
/**
 * Receive bytes from the buffer and deserialize them into messages.
 *
 * @param[in]   pch         A pointer to the raw data
 * @param[in]   nBytes      Size of the data
 * @param[out]  complete    Set True if at least one message has been
 *                          deserialized and is ready to be processed
 * @return  True if the peer should stay connected,
 *          False if the peer should be disconnected from.
 */
bool CNode::ReceiveMsgBytes(const char *pch, unsigned int nBytes, bool& complete)
{
    complete = false;
    const auto time = GetTime<std::chrono::microseconds>();
    LOCK(cs_vRecv);
    nLastRecv = std::chrono::duration_cast<std::chrono::seconds>(time).count();
    nRecvBytes += nBytes;
    while (nBytes > 0) {
        
        int handled = m_deserializer->Read(pch, nBytes);
        if (handled < 0) {