Faire un don ! | | style | statistiques | contactez-nous | plan | lettre d'information

Retourner aux forums || Retourner au forum general.general

general.general : masquerading et wifi

Posté par Marc () le 10 février 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

> Lire le message (5 commentaires, moyenne: 2,2).  

Cette discussion est archivée, il n'est plus possible de laisser des commentaires.

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

Filtre sur l'interface d'entrée

Posté par Gabriel () le 11/02/2006 à 02:55. (lien). É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

--
|| Gabriel
|| aka SynthGab
\\=============
  • [^]Re: Filtre sur l'interface d'entrée

    Posté par Marc () le 11/02/2006 à 08:12. (lien). Évalué à 2.

    merci je vais essayer cela.

  • [^]Re: Filtre sur l'interface d'entrée

    Posté par Marc () le 11/02/2006 à 08:19. (lien). É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 Marc () le 11/02/2006 à 13:56. (lien). É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 Marc () le 11/02/2006 à 08:36. (lien). É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


Revenir en haut de page || Retourner aux forums || Retourner au forum general.general