Por: @mariliars
Publicado em: 2019-06-04

Comando netmgr Lógica de criação das subtabelas de rotemento do v2

1 Política de Roteamento

1.1 Aquivos e diretórios

  • GATEWAY_CONF_DIR = /var/lib/itflex/multilinks/gateways
  • LOCK_FILE = /var/lock/subsys/policy-routing
  • POLICY_ROUTING_CONFS = etc/policy-routing

1.2 Comandos disponíveis:

*Obs: Todos os comandos executam as funções **check_lock *(no ínicio) e clean_lock (no fim).

A função check_lock verifica se o arquivo LOCK_FILE da policy routing está sendo executado/utilizado por algum processo. Esta verificação é executada 3 vezes, sendo que a cada iteração deve-se aguardando um tempo aleatório — calculado da seguinte forma LOCK_WAIT_TIME="$(( ( RANDOM % 10 )  + 1 ))". Após essas iterações uma última verificação é feita. Caso ainda estiver sendo executada por algum processo a operação (start, stop, restart ou reload) não é executada e retorna uma mensagem de erro informando que a operação não pode ser executada devido a outro processo já estar com lock. Caso contrário cria-se o LOCK_FILE para que a operação seja executada. Retorna as seguintes mensagens:

A função clean_lock deleta o arquivo LOCK_FILE liberando para a execução de processos futuros.

Ainda, os comandos stop e restart executam a função de **check_gateway **que é responsável por verificar a existência de uma rota default (com o camando ip route) . Caso não houver retorna uma mensagem de erro informando que a operação foi cancelada por não ter uma rota padrão.

start

  • Executa o comando ip route flush cache

  • Lê os arquivos do diretório POLICY_ROUTING_CONFS para cada um executa os seguintes passos:

  • Verifica se a interface tem ip, caso não tiver não cria a tabela de roteamento.

  • Verifica se deve utilizar as configurações do gateway e rede e as regras do sistema. Caso deva pegar essas informações o gateway deve ser atualizado no arquivo de conf GATEWAY_CONF_DIR/{interface}. Se não encontrar o gateway a tabela de rotemento não é criada.

Está utilizando o netmgr para consultar o gateway da interface. Obs: O gateway já vem provisionado no conf. Possivelmente iremos verificar somente a segunda parte da lógica

  • Carrega as rotas da tabela main e insere nas subtabelas (policy_routing), execeto as rotas default e as exclude. Deve ser verificado se a rota já existe na subtabela. ip route list | grep -Ev "^default" | grep -Ev "$EXCLUDE" | \ ip route list table $TABLE_ID | grep -Eq "$ROUTE" ip route add $ROUTE table $TABLE_ID
  • Altera/adiciona o gateway/rota default na subtabela (policy_routing) se a subtabela ainda não tiver a rota default. ip route list table $TABLE_ID | grep -Eq "^default" ip route add default via $GATEWAY table $TABLE_ID
  • Adiciona rotas adicionais na subtabela. Verificar se rota já existe na tablea. ip route add ${route} dev $INTERFACE table $TABLE_ID
  • Cria as regras from/to na subtabela. As regras tem prioridade igual à 2000 + table_id (RULES_PRIO_CFG=2000). Verifica se deve utilizar as redes da interface, caso contrário utiliza as regras do arquivo de conf. ip rule add ${rule} table $TABLE_ID prio $(( RULES_PRIO_CFG + TABLE_ID ))

Obs: Aqui acredito que não seja necessário essa verficação, pois o conf da policy routing já vem com as rotas da interface provisionadas

  • Cria as regras de fwmark na subtabela. As regras tem prioridade igual à 1000 + table_id (RULES_PRIO_FWM=1000). Lembrando que no server o mark é igual ao id da tabela de roteamento. ip rule add fwmark $MARK table $TABLE_ID prio $(( RULES_PRIO_FWM + TABLE_ID ))

stop

  • Verifica se existe rota padrão. Se não existir cancela operação e retorna mensagem de erro.
  • Lista as regras das subtabelas e as remove do sistema: ip rule del $RULE
  • Limpa (flush) as subtablelas de roteamento: ip route flush table $TABLE_ID

restart

  • Verifica se existe rota padrão. Se não existir cancela operação e retorna mensagem de erro.
  • Executa os comandos stop e start.

reload

  • Executa o comando start.

*Obs: Verificar regex de prioridade das regras para excluir as tabelas certas *RULES_PRIO_REGEX="[123][0-9]{3}"

2 Comando routemgr

**Uso: **routemgr <option> <link>

A lógica implementada em cada opção do comando está descrita abaixo. No fim da execução de cada opção do comando é feito:

  • A deleção de regras de marcação que não estão mais ativas
  • O reload do iptables: /etc/init.d/iptables save
  • A limpeza (flush) das marcações das conexões do link para removê-las do link
  • O reload do openvpn

-e ou --enable <link>

  • Verifica se o arquivo de configuração da política existe, se não existir retorna erro.
  • Verificar se o campo ENABLED, existente no arquivo de configuração da política de roteamento, está habilitado. Caso não estiver, substitui-se o valor do campo para yes e executa-se o reload do iptables.
  • Escrever 1 no arquivo /var/itflex/multilinks/ativo/{policy_name}

-d ou --disable <link>

  • Verifica se o arquivo de configuração da política existe, se não existir retorna erro.
  • Substitui-se o valor do campo ENABLED para no e executa-se o reload do iptables.
  • Adiciona o nome da política na lista de CONNTRACK_FLUSH+=("$2") para limpar as marcações das conexões do link.
  • Adiciona a política na lista de MARK_DELETE+=("$2").
  • Escrever 0 no arquivo /var/itflex/multilinks/ativo/{policy_name}

Atualização dinâmicas de DNS

-n ou --nsupdate <link>

  • Se o arquivo /etc/policy-routing/{policy_name}.ns existir executa o nsupdate sobre ele. Caso contrário retorna mensagem de que a alteração do DNS está sendo ignorada para o link.

-g ou --gateway <link>

  • Verifica se o arquivo de configuração da política existe, se não existir retorna erro.
  • Captura o gateway da interface contido em /var/lib/itflex/multilinks/gateways/{interface_name}
  • Altera rota padrão para o link com o gateway do passo anterior: route del -net default e route add -net default gw $GATEWAY
  • Executa a opção nsupdate para realizar atualizações dinâmicas de DNS
  • Escreve o nome da política em /var/itflex/multilinks/gateway

-v ou --vpn <link>

  • Verifica se o arquivo de configuração da política existe, se não existir retorna erro.
  • Executa o reload do openvpn

-f ou --flush <link>

  • Adiciona o nome da política na lista de CONNTRACK_FLUSH+=("$2") para limpar as marcações das conexões do link.
  • Verifica se o arquivo de configuração da política existe, se não existir retorna erro.
  • Lista as conntrack filtrando pelos protocolos udp (ASSURED) e tcp (ESTABLISHED), e, pelo campo mark da politica para deletar as marcações com o seguinte comando

/usr/sbin/conntrack -D -s $src -d $dst -p tcp --orig-port-src $sport --orig-port-dst $dport

Ativar todas as regras de um grupo

--enable-group <grupo>

  • Remove comentários de linhas das regras desativadas/comentadas

Obs: As regras que não estão no conf não estão ativas. Nesse caso deverá disparar um evento para ativar as regras do grupo no server.

Desativar todas as regras de um grupo

--disable-group <grupo>

  • Adiciona comentários nas linhas das regras

Obs: Se mandar desativar uma regra que estiver no conf terá que disparar um evento para desabilitar as regras do grupo no server.

Verificar se as regras do grupo estão ativas

--status-group <grupo>

  • Verifica comentários no grupo.

Obs: Acredito que nesse caso  se o grupo de regra não estiver no conf está desativada, o contrário está ativa.

Não reinicia o openvpn ao tomar uma ação

--no-vpn-restart

  • Seta flag para não reiniciar o openvpn

Não executa atualizações de DNS

--no-dns

  • Seta flag para não executar atualizações de DNS

Deleção das regras de marcação

Utiliza o campo mark (em hexadecimal) e a interface para:

  • Converte o mark para hexadecimal
  • Lista as regras da tablema mancle e filtra pelo mark (hex) e pela interface. Deleta as regras da tabela mangle do iptables: "iptables -t mangle -D $RULE_DEL"

Reload do openvpn

Dar mais atenção para esta lógica. Acredito que no motor do server basta utilizar o systemctl.

  • Verifica se está na inicialização ou heartbeat
  • Faz um restart dos servers
  • Faz um reload dos clients