Como restringir o acesso do usuário à Internet por intervalos de tempo?

12

Desejo que um dos usuários (que não esteja na lista de sudoers) tenha acesso à Internet das 14:00 às 16:00 e das 17:00 às 18:30. É possível? Posso definir intervalos de tempo diferentes para diferentes dias da semana?

cupakob
fonte
É melhor fazer isso no nível de controle de roteador ou gateway, e não no próprio sistema ... até onde eu sei, não existe um sistema fácil no Ubuntu para restringir o acesso à Internet no nível do usuário.
Thomas Ward
Quando eu fazê-lo em nível do roteador, em seguida, todos os usuários serão restritos ...
cupakob
Afaik (e estou procurando uma solução para isso desde 9.04), não há soluções de software para isso. É verdade que, nas minhas redes, há apenas um usuário por computador, e todos eles se conectam através de uma caixa de servidor que atua como gateway. Essa caixa possui um crontab que bloqueia todo o acesso à Internet nesse sistema e o remove posteriormente; posteriormente, também é executado em horários diferentes a cada dia. Por curiosidade, por que você precisa restringir o acesso a esse período estrito e por que precisa fazer isso pelo usuário?
Thomas Ward
eu preciso dele pelo usuário, porque um pc é usado por dois usuários. e eu quero restringir o acesso, porque o segundo usuário deve aprender muito mais e não ficar no facebook :) mas sua ideia com o crontab é boa .... o que você está usando para bloquear o acesso? Eu posso fazer o mesmo para o usuário, quando eu bloquear o roteador :)
cupakob
Meu roteador e minha caixa de gateway são separados - como a caixa de gateway atribui um endereço estático (e, portanto, manipula os dados) das outras caixas, eu uso o iptables para bloquear o endereço IP privado atribuído à estática de enviar dados de entrada ou de saída, o que bloqueia TODO o tráfego da Internet na caixa. Cada crontabs usa seu próprio comando iptables para remover itens em uma programação. É um sistema imperfeito, porque eu poderia comprar um roteador que funcionasse melhor: P
Thomas Ward

Respostas:

7

Você pode usar a ownerextensão do iptables para impedir que um usuário acesse a rede, como

 sudo iptables -A OUTPUT -m owner --uid-owner user_you_want_to_block -j REJECT

Agora você pode usar o cron para adicionar ou remover essas regras (que podem precisar de um pouco de script de shell se você já possui algumas regras de iptable ou deseja isso para usuários diferentes em momentos diferentes).

Florian Diesch
fonte
Ooh, eu não sabia que existia: P @Florian: (a) quais módulos do kernel precisam ser carregados para isso? (b) isso funciona -j REJECT --reject-with <argument>?
Thomas Ward
(a) xt_owner é carregado automaticamente. (b) Não vejo razão para que --reject-with não deva funcionar com isso, mas nunca tentei.
Florian Diesch
Vou testar isso mais tarde: P O módulo proprietário existe nas páginas de manual do iptables, para detalhar seu uso? (Observação: perguntei qual módulo do kernel, porque meu kernel é compilado de forma personalizada: /)
Thomas Ward
parece exatamente o que eu estou procurando .... i deve experimentar :)
cupakob
@EvilPhoenix: Sim, ele está documentado no iptables manpage
Florian Diesch
8
  1. faça login como root:

    sudo su

  2. verifique o status do seu firewall:

    ufw status
    

    se o firewall estiver inativo , emita:

    ufw enable
    
  3. para restringir o acesso à Internet do usuário wilhelm aos domingos, terças, quartas e sextas-feiras nos intervalos de tempo permitidos (14: 00-16: 00 e 17: 00-18: 30):

    iptables -I OUTPUT -p tcp -m owner --uid-owner wilhelm -m time --weekdays Su,Tu,We,Fr --timestart 00:00:01 --timestop 14:00:00 -j DROP 
    iptables -I OUTPUT -p tcp -m owner --uid-owner wilhelm -m time --weekdays Su,Tu,We,Fr --timestart 16:00:00 --timestop 17:00:00 -j DROP 
    iptables -I OUTPUT -p tcp -m owner --uid-owner wilhelm -m time --weekdays Su,Tu,We,Fr --timestart 18:30:00 --timestop 23:59:59 -j DROP 
    

    nota lateral : * observe o uso do -Iswitch em vez do -Aswitch do iptablescomando. o -Icomutador insere as regras mencionadas (3.) acima, no início (topo) da cadeia de regras OUTPUT, e não na parte inferior da cadeia. é importante colocar as regras anexadas manualmente sobre as políticas regulares de firewall, pois as regras são processadas de cima para baixo. se as regras mais comuns ACEITARem um pacote, a cadeia OUTPUT não será mais verificada pelas seguintes regras que podem ter deixado o pacote cair.

  4. verifique se as regras foram realmente inseridas corretamente:

    iptables -L OUTPUT
    

    a fim de excluir uma regra inapropriada, dizem (contagem de 1-based da parte superior da regra número 1, iptables -v -L OUTPUT) questão: iptables -D OUTPUT 1.

  5. salve iptables para restaurar na próxima inicialização:

    iptables-save > /etc/iptables.rules
    
  6. em /etc/rc.localacrescentar a linha:

    iptables-restore < /etc/iptables.rules
    

feito

-

testado no Ubuntu 11.10 (oneiric), locale: ele

user56231
fonte
1
Ótima resposta com uma solução perfeita! Mas observe que todos os horários são interpretados como UTC , portanto, pode ser necessário compensá-los manualmente para o horário local - no meu caso central european summer time -2 hours.
Precise Penguin
Eu fiz todas as etapas e elas funcionaram (o acesso à Internet era limitado), mas após reiniciar, a Internet voltou a funcionar. Eu verifiquei iptables -L OUTPUT e não encontrou as regras I adicionados ...
Lawand
1
Qual o motivo pelo qual você está ativando, ufwmesmo depois de usá-lo iptables?
balu
@PrecisePenguin que pode ser corrigido com a --kerneltzopção ("Usar o fuso horário do kernel em vez do UTC")
waldyrious