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-Type
deve 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/login
Corpo 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árioGET /api/user
Resposta:
{
"name": "marek"
}
Crie um novo/api/fookup/new
corpo JSON do tokenPOST /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 emrepeat
campo, 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 host
comando 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.py
e dns_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íficoPOST /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_props
e, name
portanto, 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 vezesGET /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 / uuidPOST /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