Forum Linux.général iptables+portail captif

Posté par  .
Étiquettes : aucune
0
8
oct.
2009
Bonsoir à tous,

J'expliquais dans un billet précédent mon désir de mettre en place un portail captif, j'ai essayé des logiciels tels coovachilli et alcasar. J'ai finalement retenu alacasar de par sa simplicité d'utilisation(basé aussi sur coovachilli). cependant j'ai rencontré quelques soucis du fait que mes clients viennent de différentes plages d'adresses ce qui crée un souci au niveau de la table arp de coova. j'ai alors décidé de simplifier les choses en utilisant juste iptables et apache, vu que je veux juste rediriger tous mes clients demandant n'importe quelle page web vers la page de mon serveur.
J'ai adapté alors les deux scripts ci dessous que j'ai lancé sur une machine me servant de test, ensuite j'ai utlisé une autre machine cliente avec comme passerelle l'IP de mon serveur.
Mais voilà avec le second script quand je lance une requête vers yahoo par exemple, je n'ai aucun résultat, mais par contre sur l'IP du serveur j'ai la page d'accueil d'apache. Avec le premier script rien ne fonctionne.
Je vous laisse les scripts en espérant que vous y verrez plus clair que moi.

============ Script 1 ======================

#!/bin/sh

IPTABLES="/sbin/iptables"

INTIF="eth0"
NETWORK="192.168.1.0/24"
NETWORK_BROADCAST="192.168.1.255"
PRIVATE_IP="192.168.1.2"

# On vide (flush) toutes les règles existantes
$IPTABLES -F
$IPTABLES -t nat -F
$IPTABLES -F INPUT
$IPTABLES -F FORWARD
$IPTABLES -F OUTPUT

# On indique les politiques par défaut
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -t nat -P PREROUTING ACCEPT
$IPTABLES -t nat -P POSTROUTING ACCEPT
$IPTABLES -t nat -P OUTPUT ACCEPT

# On efface toutes les chaines qui ne sont pas par défaut dans les tables filter et nat
$IPTABLES -X
$IPTABLES -t nat -X

# On autorise tout sur loopback
$IPTABLES -A INPUT -i lo -j ACCEPT

# on autorise les requêtes dhcp
$IPTABLES -A INPUT -i $INTIF -p udp -m udp --sport bootpc --dport bootps -j ACCEPT

# On autorise icmp sur INTIF
$IPTABLES -A INPUT -i $INTIF -s $NETWORK -p icmp -j ACCEPT

# Règles d'antispoofing
#$IPTABLES -A INPUT -i $INTIF -s ! $NETWORK -j ULOG --ulog-prefix "RULE Antispoof1 -- DENY "
#$IPTABLES -A INPUT -i $INTIF -s ! $NETWORK -j DROP

# On drop les broadcast sur l'interface (sans Log)
#$IPTABLES -A INPUT -i $INTIF -d $PRIVATE_BROADCAST -j DROP


# On autorise le tranfert des requtes DNS (sans LOG)
$IPTABLES -A FORWARD -i $INTIF -p udp --dport domain -j ACCEPT

# On log les requêtes HTTP vers Internet (demande de connexion seulement)
#$IPTABLES -A PREROUTING -t nat -i $INTIF -p tcp -d ! $PRIVATE_IP --dport http -m state --state NEW -j ULOG --ulog-prefix "RULE Transfert2 -- ACCEPT "
# On redirige les requête http pour Internet vers notre machine.
#$IPTABLES -A PREROUTING -t nat -i $INTIF -p tcp -d ! $PRIVATE_IP --dport http -j REDIRECT --to-port 80

/etc/init.d/iptables save


======= Script 2==========================


#!/bin/sh

IPTABLES=/sbin/iptables

INTIF="eth0"
NETWORK="192.168.1.0/24"
NETWORK_BROADCAST="192.168.1.255"
PRIVATE_IP="192.168.1.2"

# On vide (flush) toutes les règles existantes
$IPTABLES -F
$IPTABLES -t nat -F
$IPTABLES -F INPUT
$IPTABLES -F FORWARD
$IPTABLES -F OUTPUT

# Set the default policy to drop all forwarded packets
$IPTABLES -P FORWARD DROP

# Create internet chain
# This is used to authenticate users who have already signed up
$IPTABLES -N internet -t nat


# Accept all local traffic
$IPTABLES -t nat -A PREROUTING -i $INTIF --destination $NETWORK -j ACCEPT

# First send all traffic via newly created internet chain
# At the prerouting NAT stage this will DNAT them to the local
# webserver for them to signup if they aren't authorised
# Packets for unauthorised users are marked for dropping later
$IPTABLES -t nat -A PREROUTING -j internet


# Now that we've got to the forward filter, drop all packets
# marked 99 - these are unknown users. We can't drop them earlier
# as there's no filter table
$IPTABLES -t filter -A FORWARD -m mark --mark 99 -j DROP

###### INTERNET CHAIN ##########
# Allow authorised clients in, redirect all others to login webserver
# Add known users to the NAT table to stop their dest being rewritten
# Ignore MAC address with a * - these users are blocked
# This awk script goes through the /var/lib/users flat file line by line
awk 'BEGIN { FS="\t"; } { system("$IPTABLES -t nat -A internet -m mac --mac-source "$2" -j RETURN"); }' /var/lib/users

# MAC address not found. Mark the packet 99
$IPTABLES -t nat -A internet -j MARK --set-mark 99
# Redirects web requests from Unauthorised users to logon Web Page
$IPTABLES -t nat -A internet -m mark --mark 99 -p tcp --dport 80 -j DNAT --to-destination $PRIVATE_IP
################################


Merci pour les retours éventuels!!
  • # ce que je vois...

    Posté par  . Évalué à 2.

    dans le premier c'est normal que ca ne fonctionne pas car tu rediriges, ok, mais vers quoi ?

    # On log les requêtes HTTP vers Internet (demande de connexion seulement)
    #$IPTABLES -A PREROUTING -t nat -i $INTIF -p tcp -d ! $PRIVATE_IP --dport http -m state --state NEW -j ULOG --ulog-prefix "RULE Transfert2 -- ACCEPT "
    # On redirige les requête http pour Internet vers notre machine.
    #$IPTABLES -A PREROUTING -t nat -i $INTIF -p tcp -d ! $PRIVATE_IP --dport http -j REDIRECT --to-port 80


    dans le deuxieme cas :
    soit c'est le --mark 99 -j DROP qui te shoote

    soit apache qui n'est pas configuré pour repondre avec le domaine yahoo.fr
    il te voit arriver mais n'a pas de configuration pour ce domaine, et donc ne renvoie rien
    (les logs apaches devraient te renseigner sur ce qui se passe)
  • # Pas captif.

    Posté par  . Évalué à 4.

    On peut utiliser ton portail sans se connecter:
    # On autorise le tranfert des requtes DNS (sans LOG)
    $IPTABLES -A FORWARD -i $INTIF -p udp --dport domain -j ACCEPT


    http://geekfault.org/2009/09/26/ip-over-dns/

    THIS IS JUST A PLACEHOLDER. YOU SHOULD NEVER SEE THIS STRING.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.