Bloqueio de sites por dias e horas usando o Iptables no OpenWRT

3

Eu quero bloquear o Facebook o dia todo, com exceção da noite. Eu quero implementar isso no meu roteador baseado em Linux OpenWRT. O arquivo que eu preciso modificar é /etc/firewall.user (ou pelo menos é o que eu acho) e o comando que eu preciso adicionar é algo como

iptables RULE -m time --timestart TIME --timestop TIME --days DAYS -j ACTION

onde regra deve ser algo como a regra normal que você usa para bloquear o facebook ou qualquer outro site

iptables -t nat -I INPUT --sport 443 -m string \ --string www.facebook.com --algo bm -j REJECT

mas por uma razão continuo sendo capaz de ir ao Facebook. Você tem alguma ideia? Estou escrevendo alguns comandos errado? O código que adicionei é:

iptables -t nat -I INPUT --sport 443 -m string \ --string www.facebook.com --algo bm -m time --timestart 1:00 --timestop 20:00 --days Mon,Tue,Wed,Thu,Fri,Sat,Sun -j REJECT

e não funciona ...

Normalmente, para bloquear sites, uso o OpenDNS, mas com ele não posso permitir que pessoas passem certas horas do dia no Facebook, portanto usá-lo não é uma boa opção. Eu realmente apreciaria qualquer sugere.  Obrigado antecipadamente e por se preocupar em ler a minha pergunta

    
por Delfin 22.02.2016 / 04:05

4 respostas

2

Provavelmente, você está tentando usar o relógio local e o kernel, quando usar o módulo time do iptables, assume que as datas e horas são dadas em UTC.

Citando minha página de manual iptables sobre -m time :

   time
       This matches if the packet arrival time/date is within a given range.
       All options are optional, but are ANDed when specified. All times are
       interpreted as UTC by default.
    
por 22.02.2016 / 05:04
2

Suponho que você esteja se referindo a este e essa pergunta quando se trata de bloquear o Facebook.

Há duas coisas que não são discutidas aqui.

  1. É uma hipótese remota assumir que todos os pacotes que se dirigem para o Facebook contêm a string www.facebook.com . Observe que nas perguntas vinculadas apenas a string facebook.com é usada. Não é a mais strong das abordagens, mas isso parece o método publicamente aceitável de bloquear o facebook, então você está bem fazendo isso.

  2. Depois de resolver o nome de domínio, que sua regra não bloqueia, o computador avança e abre uma conexão TCP com o Facebook. O handshake TCP não contém a string www.facebook.com e, portanto, sua regra não impede isso. Depois disso, o tráfego é aceito apenas por alguma regra -m state --state related,established -j ACCEPT , o que é muito provável que você tenha.

    O sceenshot a seguir mostra minha tabela de filtros OpenWRT (padrão), onde você pode ver claramente que, para qualquer cadeia, a segunda regra é a regra related,established mencionada. Em combinação com o sucesso do handshake TCP, sua regra nunca é avaliada para qualquer tráfego de dados de e para o Facebook.

    Você teria que injetar sua regra antes deste genérico -j ACCEPT .

por 22.02.2016 / 09:16
1

Você pode criar alguns scripts .sh, que serão executados com o crontab. em crontab:

00 9 * * *  /somedir/blockfun.sh
00 18 * * * /somedir/unblockfun.sh

e adicione ao blockfun.sh algo assim: iptables -A INPUT -m string --string "facebook.com" --algo kmp --to 65535 -j DROP , ou como você prefere bloquear URLs

e de causa excluir esta regra em unblock.sh

    
por 22.02.2016 / 05:58
0

Com base no seu exemplo e em algumas pesquisas, eu acabei trabalhando para mim:

for website in facebook.com youtube.com; do

iptables -I FORWARD -p tcp --dport 80 -m string --string "$website"  --algo bm  -m time --timestart 00:00 --timestop 17:30 -j REJECT
iptables -I FORWARD -p tcp --dport 443 -m string --string "$website"  --algo bm  -m time --timestart 00:00 --timestop 17:30 -j REJECT

iptables -I FORWARD -p tcp --dport 80 -m string --string "$website"  --algo bm  -m time --timestart 18:30 --timestop 23:59 -j REJECT
iptables -I FORWARD -p tcp --dport 443 -m string --string "$website"  --algo bm  -m time --timestart 18:30 --timestop 23:59 -j REJECT

done

Houve alguns problemas com o que foi sugerido pela @Delfin:

  • Eu não tinha instalado alguns módulos iptables no meu openwrt

    atualização do opkg; opkg install iptables-mod-filter

  • usando * filter em vez de * nat caso contrário, estava reclamando: (omitir -t nat coloca as regras diretamente no filtro *)

The "nat" table is not intended for filtering, the use of DROP is therefore inhibited
  • usando o FORWARD em vez da fila INPUT
por 06.01.2018 / 23:30