#1 Le 23/01/2020, à 11:20
- ginotator
[résolu]problème pour lancer un script iptables en dehors du démarrage
Bonjour,
Mon problème :
Je n'arrive pas à ajouter et enlever des lignes dans iptables grâce à un script pendant le fonctionnement de mon serveur
Explications :
J'ai configuré un service systemd pour démarrer mon script iptables au démarrage.
Celui-ci accepte certaines ip dynamiques à se connecter au serveur.
J'ai un script qui va régulièrement inscrire l'adresse ip dynamique des différents machines dans différents fichiers texte.
Et j'ai un autre script qui va mettre à jour l'iptables en fonction des ip trouvés dans ces fichiers textes : lorsque l'ip d'un fichier texte à changé, la ligne correspondante dans iptables est supprimé, et une nouvelle règle est ajouter avec la nouvelle ip
Mais ce dernier script (exécuté par cron en root grâce à sudo crontab -e) ne permet pas de modifier de nouvelles lignes iptables.
J'ai vérifié que le script était bien lancé. Pas de soucis. J'ai aussi rendu le script exécutable avec un chmod +x. C'est vraiment les lignes iptables qui bloquent.
Voici le script :
# !/bin/bash
dyndnsxps=$(ping -c 1 monurl.com | grep PING | cut -d" " -f3 | sed -e "s/(//g" | sed -e "s/)//g" | awk '{ print $1 }')
ipxps=$(cat /home/moi/bin/ipxps.txt)
if [ $dyndnsxps != $ipxps ]
then
iptables -t filter -D INPUT -p tcp -s $ipxps --dport 22 -j ACCEPT
iptables -t filter -D OUTPUT -p tcp -d $ipxps --dport 22 -j ACCEPT
echo $dyndnsxps > /home/moi/bin/ipxps.txt
iptables -t filter -A INPUT -p tcp -s $dyndnsxps --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp -d $dyndnsxps --dport 22 -j ACCEPT
fi
Ma config : ubuntu server 18.04.3 (https://jamesachambers.com/raspberry-pi … nofficial/) sur un raspberry pi 4 2gb avec carte mémoire 16gb
Est ce que quelqu'un aurait une idée pour régler mon problème svp ?
Merci
Dernière modification par ginotator (Le 23/01/2020, à 15:51)
Hors ligne
#2 Le 23/01/2020, à 15:51
- ginotator
Re : [résolu]problème pour lancer un script iptables en dehors du démarrage
J'ai trouvé comment faire, mais ce ne fut pas aisé...
J'ai suivi le 4.4 de la doc https://doc.ubuntu-fr.org/creer_un_service_avec_systemd que j'ai remanié en fonction de mes besoins :
A la ligne
ExecStart=apt-get update && apt-get upgrade
du fichier service, j'ai pointé vers mon script que j'ai fourré dans /etc/network/if-pre-up.d/ au lieu d'exécuter une commande comme dans l'exemple.
Et il ne faut pas oublié de mettre root propriétaire des fichiers .timer et .service avec chown root.root, et de rendre exécutable le script avec chmod +x
Si vous trouvez qqch qui cloche, n'hésitez pas à intervenir.
Hors ligne
#3 Le 23/01/2020, à 17:32
- lynn
Re : [résolu]problème pour lancer un script iptables en dehors du démarrage
Bonjour,
Pour iptables, je ne sais pas mais pour pour le code, tu peux réduire cette ligne
ping -c 1 monurl.com | grep PING | cut -d" " -f3 | sed -e "s/(//g" | sed -e "s/)//g" | awk '{ print $1 }'
par
ping -c 1 monurl.com | awk -F '[()]' '/PING/{print $2}'
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#4 Le 23/01/2020, à 18:18
- nany
Re : [résolu]problème pour lancer un script iptables en dehors du démarrage
Bonjour,
ping -c 1 monurl.com | awk -F '[()]' '/PING/{print $2}'
Ça ne marche pas sur google.fr par exemple.
┏[ jeudi 23 janvier 2020 ]
┣ nany@stupidcomputer :
┗▶ ~$ ping -c 1 google.fr | awk -F '[()]' '/PING/{print $2}'
par10s38-in-x03.1e100.net
┏[ jeudi 23 janvier 2020 ]
┣ nany@stupidcomputer :
┗▶ ~$
En revanche, la commande suivante devrait marcher quel que soit le site :
ping -c 1 monurl.com | awk '/PING/{gsub(/\(|\)/,"",$3);print $3}'
┏[ jeudi 23 janvier 2020 ]
┣ nany@stupidcomputer :
┗▶ ~$ ping -c 1 ubuntu-fr.org | awk '/PING/{gsub(/\(|\)/,"",$3);print $3}'
86.65.39.13
┏[ jeudi 23 janvier 2020 ]
┣ nany@stupidcomputer :
┗▶ ~$ ping -c 1 google.fr | awk '/PING/{gsub(/\(|\)/,"",$3);print $3}'
2a00:1450:4007:805::2003
┏[ jeudi 23 janvier 2020 ]
┣ nany@stupidcomputer :
┗▶ ~$
De plus, puisqu’on est à parler du script, il faudrait mettre les variables entre doubles quotes et le shebang doit être sans espace. Pour t’en assurer, passe ton script à la moulinette de ShellCheck.
Quant à ta résolution, je n’ai pas compris. Tu a créer un service à la place de ta ligne de crontab, c’est bien ça ?
Par curiosité, j’aimerais bien voir cette ligne car, j’ai quelques doutes sur sa bonne exécution.
Quoi qu’il en soit, un service, c’est mieux.
Hors ligne
#5 Le 23/01/2020, à 18:36
- lynn
Re : [résolu]problème pour lancer un script iptables en dehors du démarrage
Bonjour nany,
Ça ne marche pas sur google.fr par exemple.
C'est curieux, ça fonctionne bien chez moi... Avec google.fr mais aussi avec ubuntu-fr.org ou april.org.
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#6 Le 23/01/2020, à 18:48
- nany
Re : [résolu]problème pour lancer un script iptables en dehors du démarrage
Ah tiens, bizarre !
Tu as l’ip v6 ?
Hors ligne
#7 Le 23/01/2020, à 18:49
- lynn
Re : [résolu]problème pour lancer un script iptables en dehors du démarrage
Non, pas d'ipv6...
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#8 Le 23/01/2020, à 18:51
- nany
Re : [résolu]problème pour lancer un script iptables en dehors du démarrage
L’explication est donc peut-être là.
Hors ligne
#9 Le 23/01/2020, à 19:09
- lynn
Re : [résolu]problème pour lancer un script iptables en dehors du démarrage
L’explication est donc peut-être là.
Apparemment non... j'ai essayé sur un autre système avec ipv6 actif et le résultat est le même ; ça affiche l'I.P.
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#10 Le 23/01/2020, à 19:13
- nany
Re : [résolu]problème pour lancer un script iptables en dehors du démarrage
Ah ! Le mystère persiste alors.
Peut-être la version de ping ?
Hors ligne
#11 Le 23/01/2020, à 21:54
- ginotator
Re : [résolu]problème pour lancer un script iptables en dehors du démarrage
Merci à tous les 2 !
Je ne connaissais pas ShellCheck c'est parfait pour un débutant.
Quant à ta résolution, je n’ai pas compris. Tu a créer un service à la place de ta ligne de crontab, c’est bien ça ?
Par curiosité, j’aimerais bien voir cette ligne car, j’ai quelques doutes sur sa bonne exécution.Quoi qu’il en soit, un service, c’est mieux.
Effectivement, impossible de modifier l'iptables à partir d'un script lancer par crontab. J'ai donc tenté le service... Et ça fonctionne apparemment.
Voici le contenu de mon fichier .service
[Unit]
Description=Service de mise a jour
After=network.target
[Service]
ExecStart=/etc/network/if-pre-up.d/accept_ipxps
Type=oneshot
Et voici le contenu de mon fichier .timer
[Unit]
Description=Lance une
[Timer]
OnBootSec=60seconds
# le service démarrera 60s après le démarrage de la machine
OnUnitActiveSec=2minutes
Persistent=true
# le service démarrera toutes les 2 minutes après la dernière activation du timer
### voir toutes les possibilités de choix dans ce document http://man7.org/linux/man-pages/man7/systemd.time.7.html
[Install]
WantedBy=timers.target
Et le contenu de /etc/network/if-pre-up.d/accept_ipxps
#!/bin/bash
dyndnsxps="$(ping -c 1 monurl.com | awk '/PING/{gsub(/\(|\)/,"",$3);print $3}')"
ipxps="$(cat /home/moi/bin/ipxps.txt)"
if [ "$dyndnsxps" != "$ipxps" ]
then
iptables -t filter -D INPUT -p tcp -s "$ipxps" --dport 22 -j ACCEPT
iptables -t filter -D OUTPUT -p tcp -d "$ipxps" --dport 22 -j ACCEPT
echo "$dyndnsxps" > /home/moi/bin/ipxps.txt
iptables -t filter -A INPUT -p tcp -s "$dyndnsxps" --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp -d "$dyndnsxps" --dport 22 -j ACCEPT
fi
Je suis preneur de toutes les remarques si vous en avez
Dernière modification par ginotator (Le 23/01/2020, à 22:37)
Hors ligne