Freamwork de religação de DNS contendo:

  • um servidor DNS obviamente
  • API da web para criar novos subdomínios e controlar o servidor DNS, visualizar logs, coisas assim
  • aplicativo de reação de merda para torná-lo ainda mais confortável

O que isso faz?
Ele permite que você crie caixas de DNS como um colaborador arroto, mas adiciona um pouco mais de recursos … (pelo menos tenta)

Você pode especificar para que ips deve resolver e quantas vezes, por enquanto ele suporta apenas registros A 🙁
Então você pode ver de onde foi solicitado, para o que resolveu … … nos logs

Como executá-lo
Antes de tudo, verifique a configuração em arquivos .py, geralmente é marcado por

"""
*** CONFIG ***
"""

Você também não deve esquecer de mudança janela de encaixe e Redis senhas em

  • docker-compose.yml
  • app.py
  • dns_resources
#Set up postgres and redis
sudo docker-compose up

#in ./BE
pip3 install -r requirements.txt

python3 dns.py # to start the dns server

# for testing purposes development server is enough I think
FLASK_APP=app.py
FLASK_ENV=development
flask run

# then in ./FE
npm install
npm start

Documentação da API
Para que a API funcione, você precisará estar conectado – a API está usando tokens de portador para autenticação eContent-Typedeve ser configurada para o corpo JSON do application/json

Registro/auth/signup
POST /auth/signup:

{
    "username": "marek",
    "password": "ffffffff"
}

Resposta:

{
    "name": "marek",
    "access_token": "eyJuYW1lIjoiMTMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzNyBTZUtyM1QgVDBLM24ifQo="
}

/auth/loginCorpo JSON de login (é o mesmo que a inscrição)
POST /auth/login:

{
    "username": "marek",
    "password": "ffffffff"
}

Resposta:

{
    "name": "marek",
    "access_token": "eyJuYW1lIjoiMTMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzNyBTZUtyM1QgVDBLM24ifQo="
}

O/auth/logout
POST /auth/logout
corpo do Json de logout pode ser deixado em branco
Resposta:

{
    "message": "Access token has been revoked"
}

Obter nome de usuário
GET /api/user
Resposta:

{
    "name": "marek"
}

Crie um novo/api/fookup/new corpo JSON do token
POST /api/fookup/new:

{
 "name":"dsads",
 "ip_props":
 {
  "1":{
   "ip":"123.0.0.1"
   ,"repeat":13

  },
  "2":{
   "ip":"3.2.1.1",
   "repeat": "4ever"
  }
 }
}

Para esclarecer isso

  • "name" é o nome se o bin DNS – é útil no aplicativo front-end
  • "ip_props" é onde a mágica acontece
    • "somenumber"– esses números devem estar na ordem de 1 a quanto você deseja (no máximo 32), para que não haja números aleatórios … o servidor dns passará de “1” e repetirá o ip um após o outro conforme fornecido, quando se trata de No último ip, ele redefinirá o contador e passará de “1” novamente, se "4ever"for fornecido em repeatcampo, esse loop não continuará e o domínio permanecerá preso no 4ever IP
      • "ip" – este é o ip para resolver
      • "repeat" – quantas vezes esse ip deve ser resolvido – isso pode ser definido como qualquer número inteiro positivo ou “4ever” para nunca parar de resolver esse ip depois que o programa chegar nele

Resposta:

{
    "subdomain": "0dd4d9083d7647e1a5fd5f1444e655ce.gel0.space"
}

este é o domínio que fará o

exemplo mágico
, digamos que fornecemos esse

{
 "name":"dsads",
 "ip_props":
 {
  "1":{
   "ip":"1.1.1.1"
   ,"repeat":2

  },
  "2":{
   "ip":"2.2.2.2",
   "repeat": 1
  }
 }
}

e estamos executando o hostcomando nesse domínio

$host {domain}
{domain} has address 1.1.1.1

$host {domain}
{domain} has address 1.1.1.1

$host {domain}
{domain} has address 2.2.2.2

$host {domain}
{domain} has address 1.1.1.1

$host {domain}
{domain} has address 1.1.1.1

$host {domain}
{domain} has address 2.2.2.2
... And this will go on and on

EXEMPLO 2 com “4ever”

{
 "name":"dsads",
 "ip_props":
 {
  "1":{
   "ip":"1.1.1.1"
   ,"repeat":2

  },
  "2":{
   "ip":"2.2.2.2",
   "repeat": "4ever"
  }
 }
}

Saída de host

$host {domain}
{domain} has address 1.1.1.1

$host {domain}
{domain} has address 1.1.1.1

$host {domain}
{domain} has address 2.2.2.2

$host {domain}
{domain} has address 2.2.2.2

$host {domain}
{domain} has address 2.2.2.2

$host {domain}
{domain} has address 2.2.2.2

$host {domain}
{domain} has address 2.2.2.2

It will never resolve to 1.1.1.1 ...Almost

Mas há uma exceção a essas informações de loop de 4ever sobre o que foi resolvido e o que deve ser resolvido a seguir é armazenado em redis com a expiração definida em 1 hora; portanto, o domínio será resolvido para 1.1.1.1 novamente em 1 hora após a criação. Você pode alterar essa configuração na variável REDIS_EXP dns.pydns_resources.py

listar todos os compartimentos/api/fookup/listAll
GET /api/fookup/listAll
.

[
    {
        "uuid": "0dd4d9083d7647e1a5fd5f1444e655ce",
        "name": "dsads"
    },
    {
        "uuid": "ffffffffffffffffffffffffffffffff",
        "name": "someothername"
    }
]

Isso responderá com os uuids e os nomes de todos os compartimentos que você já criou.

Obter propriedades sobre o/api/fookup/props corpo JSON de bin específico
POST /api/fookup/props
:

{
 "uuid":"0dd4d9083d7647e1a5fd5f1444e655ce"
}

Resposta:

  {
     "ip_props": {
         "1": {
             "ip": "123.0.0.0",
             "repeat": 13
         },
         "2": {
             "ip": "0.0.1.77",
             "repeat": 3
         }
     },
     "ip_to_resolve": "1",
     "turn": 5,
     "name": "dsads"
 }

Isso retornará todas as informações sobre o dnsbin, você já está familiarizado com a parte ip_propse, nameportanto, explicarei essas outras coisas

  • "ip_to_resolve": número de ip que o programa deve resolver agora
  • "turn"– o número de vezes "ip_to_resolve"já foi resolvido, portanto, quando o turno == repetir, ip_to_resolve se tornará “2” e isso será redefinido

Todos os logs/api/fookup/logs/all
Isso retornará todos os logs de todas as posições pertencentes ao usuário. Isso pode ser um pouco lento se você solicitou os domínios 12321312 vezes
GET /api/fookup/logs/all
Resposta:

[
   {
       "uuid": "0dd4d9083d7647e1a5fd5f1444e655ce",
       "resolved_to": "123.0.0.0",
       "domain": "0dd4d9083d7647e1a5fd5f1444e655ce.gel0.space",
       "origin_ip": "127.0.0.1",
       "port": "41095",
       "created_date": "2019-09-17 20:38:44.769560"
   },
...snip...
   {
       "uuid": "ffffffffffffffffffffffffffffffff",
       "resolved_to": "99.123.64.19",
       "domain": "0dd4d9083d7647e1a5fd5f1444e655ce.gel0.space",
       "origin_ip": "127.0.0.1",
       "port": "51515",
       "created_date": "2019-09-17 20:38:50.321975"
   }
]

Registros para determinado corpo JSON uuid / api / fookup / logs / uuid
POST /api/fookup/logs/uuid
:

{
 "uuid":"0dd4d9083d7647e1a5fd5f1444e655ce"
}

Resposta:

[
    {
        "uuid": "0dd4d9083d7647e1a5fd5f1444e655ce",
        "resolved_to": "123.0.0.0",
        "domain": "0dd4d9083d7647e1a5fd5f1444e655ce.gel0.space",
        "origin_ip": "127.0.0.1",
        "port": "41095",
        "created_date": "2019-09-17 20:38:44.769560"
    },
...snip...
    {
        "uuid": "0dd4d9083d7647e1a5fd5f1444e655ce",
        "resolved_to": "0.0.1.77",
        "domain": "0dd4d9083d7647e1a5fd5f1444e655ce.gel0.space",
        "origin_ip": "127.0.0.1",
        "port": "51515",
        "created_date": "2019-09-17 20:38:50.321975"
    }
]

Estatísticas/api/statistics
Isso apenas obtém as estatísticas do aplicativo frontend.
GET /api/statistics
Resposta:

{
   "request_count": 420,
   "created_bins": 69
}

TODO:
FE – crie um novo formulário de token FE – mostre mensagens de erro na tela FE – in / mybins adicione uma breve visão geral da lixeira selecionada -DONE- API – encurtar domínios uuid longos? – uuid4 (). hex -DONE- -DONE- DNS SERVER, exceto – se o IP inválido for fornecido, não trava –DONE- FE + BE – paginação nos logs FE – capacidade de especificar 4ever no campo de repetição FE + BE – excluir compartimento

Baixar dnsFookup