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
estart
.
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
Habilitar as regras da politica de roteamento do iptables para o link
-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 parayes
e executa-se o reload do iptables. - Escrever 1 no arquivo
/var/itflex/multilinks/ativo/{policy_name}
Desabilitar as regras de policy-routing do iptables para o link
-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
parano
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.
Setar o gateway padrão 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
eroute 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
Setar o servidor openvpn para o link
-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
Limpa as marcações das conexões do link
-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