Forum général.général masquerading et wifi

Posté par  .
Étiquettes : aucune
0
10
fév.
2006
bonsoir,

je suis en train de monter un réseau communautaire sans fil basé sur openwrt et OLSR. Ca marche de mieux en mieux. Mais seulement je viens de m'apercevoir que non seulement je fais du NAT (masquerading) lan->wifi, mais aussi wifi->wifi lorsque l'AP sert uniquement de relais, ce qui est tout de meme l'objectif premier du protocole OLSR (c'est a dire relayer le trafic réseau de proche en proche au gré des routes détectées et mesurées).

Voici le contenu de mon script iptables ; la section NAT est a la fin. C'est inspiré d'une version un peu ancienne d'openwrt avec quelque modifs perso. A l'origine ca faisait du NAT sur l'interface WLAN. Est-ce qu'il est possible de dissocier le forwarding lan-wifi du forwarding wifi-wifi et donc de ne plus faire de NAT sur le second ?



root@ap100:~# cat S45firewall
#!/bin/sh
. /etc/functions.sh

WAN=$(nvram get wan_ifname)
LAN=$(nvram get lan_ifname)
WIFI=$(nvram get wifi_ifname)

IPT=/usr/sbin/iptables

drop_ip_olsr () {
ip=$1
$IPT -A INPUT --source $ip -p udp --dport 698 -j DROP
$IPT -A INPUT --destination $ip -p udp --dport 698 -j DROP
}

accept_port(){
port=$1

$IPT -A INPUT -p tcp --dport $port -j ACCEPT
$IPT -A INPUT -p udp --dport $port -j ACCEPT
}

# ex : forward_port 8080 192.168.10.80 80 tcp
forward_port(){
sport=$1
dport=$3
daddr=$2
proto=$4
$IPT -t nat -A PREROUTING -p $proto --dport $sport -j DNAT --to $daddr
$IPT -A FORWARD -p $proto -d $daddr --dport $dport -j ACCEPT
}


for T in filter nat mangle ; do
$IPT -t $T -F
$IPT -t $T -X
done


# log errors : http://lea-linux.org/reseau/secu/iptables.html

for T in DROP ACCEPT REJECT ; do
$IPT -N LOG_${T}
$IPT -A LOG_${T} -j LOG --log-prefix "[IPTABLES $T] : "
$IPT -A LOG_${T} -j $T
done

$IPT -N LOG_P2P_DROP
$IPT -A LOG_P2P_DROP -j LOG --log-prefix "[IPTABLES P2P_DROP] : "
$IPT -A LOG_P2P_DROP -j DROP

# filter p2p forwarding.
if [ -f /lib/modules/2.4.29/ipt_ipp2p.o ] ; then
(lsmod | grep ipt_ipp2p > /dev/null)|| insmod /lib/modules/2.4.29/ipt_ipp2p.o
$IPT -A FORWARD -p udp -m ipp2p --ipp2p -j LOG_P2P_DROP
$IPT -A FORWARD -p tcp -m ipp2p --ipp2p -j LOG_P2P_DROP
fi

drop_ip_olsr 169.254.0.51


# accept OLSR protocol
$IPT -A INPUT -p tcp --dport 698 -j ACCEPT
$IPT -A INPUT -p udp --dport 698 -j ACCEPT
$IPT -A FORWARD -p tcp --dport 698 -j ACCEPT
$IPT -A FORWARD -p udp --dport 698 -j ACCEPT


# forward port :
# forward_port 8888 192.168.10.80 80 tcp
# forward_port 80 192.168.10.80 8080 tcp

$IPT -t filter -A INPUT -m state --state INVALID -j LOG_DROP
$IPT -t filter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPT -t filter -A INPUT -p icmp -j ACCEPT
$IPT -t filter -A INPUT -p tcp --dport 22 -j ACCEPT # ssh
$IPT -t filter -A INPUT -p 47 -j ACCEPT # allow GRE
$IPT -t filter -A INPUT -p 53 -j ACCEPT # allow domain (DNS)
$IPT -t filter -A INPUT -i $WAN -p tcp -j REJECT --reject-with tcp-reset
$IPT -t filter -A INPUT -i $WAN -j REJECT --reject-with icmp-port-unreachable

# $IPT -t filter -A FORWARD -m state --state INVALID -j LOG_DROP
# $IPT -t filter -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
# $IPT -t filter -A FORWARD -i $WAN -m state --state NEW,INVALID -j LOG_DROP
# $IPT -t filter -A FORWARD -o $WAN -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

$IPT -A FORWARD -i $WIFI -o $LAN -m state --state NEW,INVALID -j LOG_ACCEPT
$IPT -A FORWARD -j ACCEPT

# $IPT -t nat -A POSTROUTING -o $WAN -j MASQUERADE
$IPT -t nat -A POSTROUTING -o $LAN -j MASQUERADE
$IPT -t nat -A POSTROUTING -o $WIFI -j MASQUERADE

root@ap100:~#
root@ap100:~#
root@ap100:~#
root@ap100:~# ls
S45firewall ap nfs ping.awk ping.sh rc-reconfigure rc-reconfigure~
root@ap100:~#
root@ap100:~#
root@ap100:~# cat /etc/init.d/S45firewall
#!/bin/sh
. /etc/functions.sh

WAN=$(nvram get wan_ifname)
LAN=$(nvram get lan_ifname)
WIFI=$(nvram get wifi_ifname)

IPT=/usr/sbin/iptables

drop_ip_olsr () {
ip=$1
$IPT -A INPUT --source $ip -p udp --dport 698 -j DROP
$IPT -A INPUT --destination $ip -p udp --dport 698 -j DROP
}

accept_port(){
port=$1

$IPT -A INPUT -p tcp --dport $port -j ACCEPT
$IPT -A INPUT -p udp --dport $port -j ACCEPT
}

# ex : forward_port 8080 192.168.10.80 80 tcp
forward_port(){
sport=$1
dport=$3
daddr=$2
proto=$4
$IPT -t nat -A PREROUTING -p $proto --dport $sport -j DNAT --to $daddr
$IPT -A FORWARD -p $proto -d $daddr --dport $dport -j ACCEPT
}


for T in filter nat mangle ; do
$IPT -t $T -F
$IPT -t $T -X
done


# log errors : http://lea-linux.org/reseau/secu/iptables.html

for T in DROP ACCEPT REJECT ; do
$IPT -N LOG_${T}
$IPT -A LOG_${T} -j LOG --log-prefix "[IPTABLES $T] : "
$IPT -A LOG_${T} -j $T
done

$IPT -N LOG_P2P_DROP
$IPT -A LOG_P2P_DROP -j LOG --log-prefix "[IPTABLES P2P_DROP] : "
$IPT -A LOG_P2P_DROP -j DROP

# filter p2p forwarding.
if [ -f /lib/modules/2.4.29/ipt_ipp2p.o ] ; then
(lsmod | grep ipt_ipp2p > /dev/null)|| insmod /lib/modules/2.4.29/ipt_ipp2p.o
$IPT -A FORWARD -m ipp2p --ipp2p --bit --apple --winmx --soul --ares -j LOG_P2P_DROP
# $IPT -A FORWARD -p udp -m ipp2p --ipp2p -j LOG_P2P_DROP
# $IPT -A FORWARD -p tcp -m ipp2p --ipp2p -j LOG_P2P_DROP
fi


# accept OLSR protocol
$IPT -A INPUT -p tcp --dport 698 -j ACCEPT
$IPT -A INPUT -p udp --dport 698 -j ACCEPT
$IPT -A FORWARD -p tcp --dport 698 -j ACCEPT
$IPT -A FORWARD -p udp --dport 698 -j ACCEPT


# forward port :
# forward_port 8888 192.168.10.80 80 tcp
# forward_port 80 192.168.10.80 8080 tcp

$IPT -t filter -A INPUT -m state --state INVALID -j LOG_DROP
$IPT -t filter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPT -t filter -A INPUT -p icmp -j ACCEPT
$IPT -t filter -A INPUT -p tcp --dport 22 -j ACCEPT # ssh
$IPT -t filter -A INPUT -p 47 -j ACCEPT # allow GRE
$IPT -t filter -A INPUT -p 53 -j ACCEPT # allow domain (DNS)
$IPT -t filter -A INPUT -i $WAN -p tcp -j REJECT --reject-with tcp-reset
$IPT -t filter -A INPUT -i $WAN -j REJECT --reject-with icmp-port-unreachable

# $IPT -t filter -A FORWARD -m state --state INVALID -j LOG_DROP
# $IPT -t filter -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
# $IPT -t filter -A FORWARD -i $WAN -m state --state NEW,INVALID -j LOG_DROP
# $IPT -t filter -A FORWARD -o $WAN -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

$IPT -A FORWARD -i $WIFI -o $LAN -m state --state NEW,INVALID -j LOG_ACCEPT
$IPT -A FORWARD -j ACCEPT

# $IPT -t nat -A POSTROUTING -o $WAN -j MASQUERADE
# $IPT -t nat -A POSTROUTING -o $LAN -j MASQUERADE
$IPT -t nat -A POSTROUTING -o $WIFI -j MASQUERADE
  • # Filtre sur l'interface d'entrée

    Posté par  . Évalué à 2.

    Pour moi, il suffirait de filtrer la règle de NAT en fonction de l'interface d'entrée:

    tu remplaces ta dernière ligne par:
    $IPT -t nat -A POSTROUTING -i $LAN -o $WIFI -j MASQUERADE

    et normalement, le trafic wifi->wifi sera routé de manière classique grâce à ta règle
    $IPT -A FORWARD -j ACCEPT
    • [^] # Re: Filtre sur l'interface d'entrée

      Posté par  . Évalué à 2.

      merci je vais essayer cela.
    • [^] # Re: Filtre sur l'interface d'entrée

      Posté par  . Évalué à 2.

      non ca ne passe pas. On ne peut pas assigner -i et -o sur le POSTROUTING. Il me semble que j'avais deja essayer et c'est la que mes competences iptables s'arretent. Je ne vois pas tres bien comment aller plus en avant.

      Est-ce qu'on pourrait creer plusieurs chaines en fonction de la source (-i) et sur l'une faire du simple forwarding et sur l'autre du MASQUERADE.




      cat S45firewall
      ....
      # $IPT -t nat -A POSTROUTING -o $WAN -j MASQUERADE
      $IPT -t nat -A POSTROUTING -o $LAN -j MASQUERADE
      $IPT -t nat -A POSTROUTING -i $LAN -o $WIFI -j MASQUERADE
      $IPT -A FORWARD -j ACCEPT


      root@ap100:~# ./S45firewall
      iptables v1.3.0: Can't use -i with POSTROUTING
    • [^] # Re: Filtre sur l'interface d'entrée

      Posté par  . Évalué à 3.

      j'ai peut-etre une solution trouvé sur le firmware Freifunk :

      iptables -t nat -A POSTROUTING -o eth1 -s 10.0.0.0/8 -j MASQUERADE

      c'est a dire donner un mask -s qui doit je suppose correspondre a la source.
  • # second script pitables

    Posté par  . Évalué à 2.

    ici j'ai un second script iptables issu d'une version plus recente de openwrt, un peu modifié par mes soins. Mes modifs sont annotés #MQ.


    wk ping.sh rc-reconfigure rc-reconfigure~
    root@ap94:~# cat S45firewall-wr-rc4
    #!/bin/sh

    ## Please make changes in /etc/firewall.user
    ${FAILSAFE:+exit}

    export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/sbin

    . /etc/functions.sh
    WAN=$(nvram get wan_ifname)
    LAN=$(nvram get lan_ifname)
    WIFI=$(nvram get wifi_ifname)

    IPT=/usr/sbin/iptables




    drop_ip_olsr () {
    ip=$1
    iptables -A INPUT --source $ip -p udp --dport 698 -j DROP
    iptables -A INPUT --destination $ip -p udp --dport 698 -j DROP
    }


    ## CLEAR TABLES
    for T in filter nat; do
    iptables -t $T -F
    iptables -t $T -X
    done

    iptables -N input_rule
    iptables -N output_rule
    iptables -N forwarding_rule

    iptables -t nat -N prerouting_rule
    iptables -t nat -N postrouting_rule

    # MQ
    for T in DROP ACCEPT REJECT ; do
    $IPT -N LOG_${T}
    $IPT -A LOG_${T} -j LOG --log-prefix "[IPTABLES $T] : "
    $IPT -A LOG_${T} -j $T
    done

    $IPT -N LOG_P2P_DROP
    $IPT -A LOG_P2P_DROP -j LOG --log-prefix "[IPTABLES P2P_DROP] : "
    $IPT -A LOG_P2P_DROP -j DROP

    # /MQ

    ### INPUT
    ### (connections with the router as destination)

    # base case
    iptables -P INPUT DROP
    iptables -A INPUT -m state --state INVALID -j LOG_DROP
    iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    iptables -A INPUT -p tcp --tcp-flags SYN SYN --tcp-option \! 2 -j DROP

    #
    # insert accept rule or to jump to new accept-check table here
    #
    iptables -A INPUT -j input_rule

    # drop_ip_olsr 169.254.0.51 # MQ pour test

    # allow
    iptables -A INPUT -i \! $WAN -j ACCEPT # allow from lan/wifi interfaces
    iptables -A INPUT -p icmp -j ACCEPT # allow ICMP
    # iptables -A INPUT -p gre -j ACCEPT # allow GRE # not supported

    # reject (what to do with anything not allowed earlier)
    iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset
    iptables -A INPUT -j REJECT --reject-with icmp-port-unreachable

    ### OUTPUT
    ### (connections with the router as source)

    # base case
    iptables -P OUTPUT DROP
    iptables -A OUTPUT -m state --state INVALID -j LOG_DROP
    iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

    #
    # insert accept rule or to jump to new accept-check table here
    #
    iptables -A OUTPUT -j output_rule

    # allow
    iptables -A OUTPUT -j ACCEPT #allow everything out

    # reject (what to do with anything not allowed earlier)
    iptables -A OUTPUT -p tcp -j REJECT --reject-with tcp-reset
    iptables -A OUTPUT -j REJECT --reject-with icmp-port-unreachable

    ### FORWARDING
    ### (connections routed through the router)

    # base case
    iptables -P FORWARD DROP
    iptables -A FORWARD -m state --state INVALID -j DROP
    iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
    iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

    #
    # insert accept rule or to jump to new accept-check table here
    #
    iptables -A FORWARD -j forwarding_rule

    # allow
    iptables -A FORWARD -i br0 -o br0 -j ACCEPT
    iptables -A FORWARD -i $LAN -o $WAN -j LOG_ACCEPT
    iptables -A FORWARD -i $LAN -o $WIFI -j LOG_ACCEPT # MQ
    iptables -A FORWARD -i $WIFI -o $WIFI -j LOG_ACCEPT # MQ

    # reject (what to do with anything not allowed earlier)
    # uses the default -P DROP

    ### MASQ
    iptables -t nat -A PREROUTING -j prerouting_rule
    iptables -t nat -A POSTROUTING -j postrouting_rule
    iptables -t nat -A POSTROUTING -o $WAN -j MASQUERADE
    iptables -t nat -A POSTROUTING -o $WIFI -j MASQUERADE # MQ

    ## USER RULES
    # [ -f /etc/firewall.user ] && . /etc/firewall.user


    iptables -F input_rule
    iptables -F output_rule
    iptables -F forwarding_rule
    iptables -t nat -F prerouting_rule
    iptables -t nat -F postrouting_rule

    ### BIG FAT DISCLAIMER
    ### The "-i $WAN" literally means packets that came in over the $WAN interface;
    ### this WILL NOT MATCH packets sent from the LAN to the WAN address.

    ### Allow SSH on the WAN interface
    # iptables -t nat -A prerouting_rule -i $WAN -p tcp --dport 22 -j ACCEPT
    # iptables -A input_rule -i $WAN -p tcp --dport 22 -j ACCEPT

    ### Port forwarding
    # iptables -t nat -A prerouting_rule -i $WAN -p tcp --dport 22 -j DNAT --to 192.168.1.2
    # iptables -A forwarding_rule -i $WAN -p tcp --dport 22 -d 192.168.1.2 -j ACCEPT

    ### DMZ (should be placed after port forwarding / accept rules)
    # iptables -t nat -A prerouting_rule -i $WAN -j DNAT --to 192.168.1.2
    # iptables -A forwarding_rule -i $WAN -d 192.168.1.2 -j ACCEPT


Suivre le flux des commentaires

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