É porque o cron forçosamente define PATH
para /usr/bin:/bin
. Você precisa invocar iptables
as /sbin/iptables
ou adicionar PATH=/usr/sbin:/sbin:/usr/bin:/bin
no seu script ou crontab. Veja crontab (5) para detalhes.
Eu sei que este é um título bastante amplo, mas eu não sabia com o que começar.
De qualquer forma, direto ao ponto. Eu tenho um pequeno VPS eu corro apache e um servidor Minecraft. Eu nunca o desativo, mas devo reiniciá-lo por algum motivo, IPTables bloqueia a maioria das minhas portas, incluindo a porta 80. Eu tentei tantas sugestões diferentes para consertar isso, mas sem sorte. Além disso, uma vez que o provedor é OVH, o suporte é ... falta.
Então, criei uma solução alternativa com a qual estou feliz. Eu criei um arquivo de script de shell simples para abrir certas portas que eu preciso abrir na reinicialização (80 e 25565 por enquanto). Os mais importantes, como 21 e 22, não são afetados no reinício.
O script é assim:
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p udp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 25565 -j ACCEPT
iptables -I INPUT -p udp --dport 25565 -j ACCEPT
/sbin/service iptables save
Quando eu o executo manualmente digitando /iptdef.sh
, ele roda bem, as portas se abrem e tudo fica bem.
Claro, não é prático ter que lembrar de executá-lo toda vez que eu reiniciar o servidor, então adicionei um crontab. O problema é que não funciona / corre. Este é o meu arquivo crontab:
*/5 * * * * /backup2.sh
*/55 * * * * /backup3.sh
@reboot /iptdef.sh
* * * * * /iptdef.sh
As primeiras duas linhas funcionam. Eles são apenas scripts simples que fazem um backup de uma pasta para mim. As duas segundas linhas são o que não está funcionando.
Existe uma chance de que talvez não seja possível executar comandos do iptables a partir de um cron? Parece bobo, mas não vejo outra razão para não funcionar. Os scripts têm as permissões corretas.
Isso parece estar bem aqui: o @reboot do crontab só funciona para root? basicamente a resposta depende muito do que você usa para o Cron e sua distribuição Linux.
Eu tive que adicionar isso a /etc/hosts
para que as mensagens para qualquer pessoa no FQDN do meu servidor fossem resolvidas:
127.0.0.1 mydomain.com.
Observe o ponto no final. No meu caso, estou enviando e-mail essencialmente para root @ localhost com MAILTO=root
, que é traduzido para [email protected].
Tags cron