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 Gabriel . Évalué à 2.
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 Marc Quinton . Évalué à 2.
[^] # Re: Filtre sur l'interface d'entrée
Posté par Marc Quinton . Évalué à 2.
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 Quinton . Évalué à 3.
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 Quinton . Évalué à 2.
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.