[ipv6only] Modifications pour pettre des machines sans ipv4 et pare feu pour nat64

This commit is contained in:
Valentin Samir 2013-11-05 13:24:15 +01:00
parent d04d51a2c3
commit a2369dadf4
9 changed files with 67 additions and 21 deletions

View file

@ -249,6 +249,7 @@ prefix = { 'subnet' : [ '2a01:240:fe3d::/48' ],
'evenementiel' : [ '2a01:240:fe3d:d2::/64' ], 'evenementiel' : [ '2a01:240:fe3d:d2::/64' ],
'bornes' : [ '2a01:240:fe3d:c04::/64' ], 'bornes' : [ '2a01:240:fe3d:c04::/64' ],
'wifi-adh' : [ '2a01:240:fe3d:c04::/64' ], 'wifi-adh' : [ '2a01:240:fe3d:c04::/64' ],
'v6only' : [ '2001:470:c8b9:a4::/64' ],
} }
# Domaines dans lesquels les machines sont placées suivant leur type # Domaines dans lesquels les machines sont placées suivant leur type

View file

@ -2,8 +2,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Généré par gestion/extractionbcfg2.py sur bcfg2, à partir de Metadata/groups.xml # Généré par gestion/extractionbcfg2.py sur bcfg2, à partir de Metadata/groups.xml
# Fichier obsolète (backward comp ftw)
adm_only = [] adm_only = []
role = {'zamok': ['adherents-server'], 'dyson': ['sniffer'], 'titanic': ['failover-proxy'], 'komaz': ['wifi-router', 'appt-proxy', 'main-router'], 'dhcp': ['appt-proxy'], 'ovh': ['externe'], 'routeur': ['appt-proxy']} role = {'zamok': ['adherents-server'], 'nat64': ['routeur-nat64'], 'komaz': ['wifi-router', 'appt-proxy', 'main-router'], 'dyson': ['sniffer'], 'isc': ['appt-proxy'], 'dhcp': ['appt-proxy'], 'ovh': ['externe'], 'routeur': ['appt-proxy']}

View file

@ -53,7 +53,7 @@ recursiv = {
'wifi' : ['138.231.136.98', '138.231.136.152'], 'wifi' : ['138.231.136.98', '138.231.136.152'],
'evenementiel' : ['138.231.136.98', '138.231.136.152'], 'evenementiel' : ['138.231.136.98', '138.231.136.152'],
'adm' : ['10.231.136.98', '10.231.136.152'], 'adm' : ['10.231.136.98', '10.231.136.152'],
'gratuit' : ['10.42.0.10'], 'gratuit' : ['10.42.0.164'],
'accueil' : ['10.51.0.10'], 'accueil' : ['10.51.0.10'],
'isolement' : ['10.52.0.10'], 'isolement' : ['10.52.0.10'],
'personnel-ens' : ['10.2.9.10', '138.231.136.98', '138.231.136.152'], 'personnel-ens' : ['10.2.9.10', '138.231.136.98', '138.231.136.152'],

View file

@ -18,20 +18,22 @@ role = %(role_dict)s
srvDict = { 'external' : [], srvDict = { 'external' : [],
'connection-main' : [], 'connection-main' : [],
'failover-proxy-server' : [], # 'failover-proxy-server' : [],
'vlan-ens' : [], 'vlan-ens' : [],
'users' : [], 'users' : [],
'sniffer' : [], 'sniffer' : [],
'router-wifi' : [] 'router-wifi' : [],
'routeur-nat64' : [],
} }
tr = { 'external' : 'externe', tr = { 'external' : 'externe',
'connection-main' : 'main-router', 'connection-main' : 'main-router',
'vlan-ens' : 'appt-proxy', 'vlan-ens' : 'appt-proxy',
'failover-proxy-server' : 'failover-proxy', # 'failover-proxy-server' : 'failover-proxy',
'router-wifi' : 'wifi-router', 'router-wifi' : 'wifi-router',
'users' : 'adherents-server', 'users' : 'adherents-server',
'sniffer' : 'sniffer' 'sniffer' : 'sniffer',
'routeur-nat64' : 'routeur-nat64',
} }
fin = open('/var/lib/bcfg2/Metadata/groups.xml') fin = open('/var/lib/bcfg2/Metadata/groups.xml')
@ -46,7 +48,6 @@ for key in srvDict.keys():
print "Erreur, il n'y a pas de serveur associé à l'attribut %s" % key print "Erreur, il n'y a pas de serveur associé à l'attribut %s" % key
exit(1) exit(1)
# On cherche les serveurs qui sont seulement sur le vlan adm # On cherche les serveurs qui sont seulement sur le vlan adm
admOnly = parsedGroups.xpath('//Group[@name="adm-only"]/../@name') admOnly = parsedGroups.xpath('//Group[@name="adm-only"]/../@name')
@ -60,8 +61,9 @@ for key, values in srvDict.items():
else: else:
out[value] = [tr[key]] out[value] = [tr[key]]
fout = open('/usr/scripts/gestion/config_srv.py', 'w') fout = open('/usr/scripts/gestion/config/config_srv.py', 'w')
fout.write(template % {'adm_list': admOnly.__str__(), 'role_dict' : out.__str__()}) fout.write(template % {'adm_list': admOnly.__str__(), 'role_dict' : out.__str__()})
fout.close() fout.close()

View file

@ -356,7 +356,9 @@ zone "%(NOM_zone)s" {
# Le direct # Le direct
if zone in self.zones_direct : if zone in self.zones_direct :
ligne = "%s\tIN\tA\t%s\n" % ( nom, machine.ip() ) ligne=''
if machine.ip() != '<automatique>':
ligne += "%s\tIN\tA\t%s\n" % ( nom, machine.ip() )
# Si la machine est une borne wifi, on ajoute la position # Si la machine est une borne wifi, on ajoute la position
if isinstance(machine,ldap_crans.BorneWifi) and machine.position(): if isinstance(machine,ldap_crans.BorneWifi) and machine.position():
ligne +="%s\tIN\tTXT\t\"LOC %s,%s \"\n" % (nom,machine.position()[0],machine.position()[1]) ligne +="%s\tIN\tTXT\t\"LOC %s,%s \"\n" % (nom,machine.position()[0],machine.position()[1])
@ -402,9 +404,10 @@ zone "%(NOM_zone)s" {
alias = alias.encode('utf-8') alias = alias.encode('utf-8')
# Cas particulier : nom de l'alias = nom de la zone # Cas particulier : nom de l'alias = nom de la zone
if alias in self.zones_direct : if alias in self.zones_direct :
ligne = "@\tIN\tA\t%s\n" % machine.ip() if machine.ip() != '<automatique>':
ligne = ligne.encode('utf-8') ligne = "@\tIN\tA\t%s\n" % machine.ip()
direct[alias] = direct.get(alias, "") + ligne ligne = ligne.encode('utf-8')
direct[alias] = direct.get(alias, "") + ligne
if machine.dnsIpv6(): if machine.dnsIpv6():
ligne = "@\tIN\tAAAA\t%s\n" % machine.ipv6() ligne = "@\tIN\tAAAA\t%s\n" % machine.ipv6()
ligne = ligne.encode('utf-8') ligne = ligne.encode('utf-8')
@ -441,7 +444,10 @@ zone "%(NOM_zone)s" {
# Le reverse # Le reverse
ip = machine.ip() ip = machine.ip()
net = AddrInNets(ip, self.zones_reverse) if ip == '<automatique>':
net=False
else:
net = AddrInNets(ip, self.zones_reverse)
if net: if net:
base_ip = ip.split('.') base_ip = ip.split('.')
base_ip.reverse() base_ip.reverse()

View file

@ -145,7 +145,7 @@ class dhcp(gen_config) :
for machine in self.machines : for machine in self.machines :
self.anim.cycle() self.anim.cycle()
for net in self.reseaux.keys() : for net in self.reseaux.keys() :
if AddrInNet(machine.ip(), net) : if machine.ip() != '<automatique>' and AddrInNet(machine.ip(), net) :
host_template = self.host_template host_template = self.host_template
# variable pour remplir le template # variable pour remplir le template
#d = { 'nom' : machine.nom().split('.')[0] , 'mac' : machine.mac() , 'ip' : machine.ip() } #d = { 'nom' : machine.nom().split('.')[0] , 'mac' : machine.mac() , 'ip' : machine.ip() }

View file

@ -480,6 +480,7 @@ class firewall_komaz(firewall_base_routeur):
'filtrage_ports' : self.filtrage_ports, 'filtrage_ports' : self.filtrage_ports,
'limitation_debit' : self.limitation_debit, 'limitation_debit' : self.limitation_debit,
'limit_ssh_connexion' : self.limit_ssh_connexion, 'limit_ssh_connexion' : self.limit_ssh_connexion,
'tunnel_6in4' : self.tunnel_6in4,
}) })
self.use_ipset.extend([self.blacklist_soft, self.blacklist_upload, self.reseaux_non_routable]) self.use_ipset.extend([self.blacklist_soft, self.blacklist_upload, self.reseaux_non_routable])
@ -569,7 +570,7 @@ class firewall_komaz(firewall_base_routeur):
def tunnel_6in4(self, table=None, apply=False): def tunnel_6in4(self, table=None, apply=False):
chain = 'TUNNEL_IPV6' chain = 'TUNNEL_IPV6'
tunnels_ipv6 = [ ('216.66.84.42', '138.231.136.12') ] tunnels_ipv6 = [ ('216.66.84.42', '138.231.136.12'), ('216.66.84.42','138.231.136.164') ]
if table == 'filter': if table == 'filter':
pretty_print(table, chain) pretty_print(table, chain)

View file

@ -200,6 +200,40 @@ def main_router():
# On met en place le forwarding # On met en place le forwarding
enable_forwarding(6) enable_forwarding(6)
def routeur_nat64():
''' Firewall pour le nat64 '''
dev_crans = iface6('fil')
dev_adm = iface6('adm')
dev_v6only = iface6('v6only')
# Les blacklistes
# Si on les met après la règle conntrack, une connexion existante ne sera
# pas sevrée et dinc avec un tunnel ssh idoine, la blacklist aurait aucun
# effet.
# Alternative : flusher la table conntrack des entrées concernant cette
# machine.
blacklist(ip6tables)
ip6tables.filter.forward('-i %s -j BLACKLIST_SRC' % dev_v6only)
ip6tables.filter.forward('-i %s -j BLACKLIST_DST' % dev_crans)
ip6tables.filter.forward('-m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT')
# Pour les autres connections
for type_m in [i for i in ['fil', 'adherents-v6', 'wifi', 'wifi-adh-v6'] if not 'v6' in i]:
ip6tables.filter.mac('-s %s -j %s' % (prefix[type_m][0], 'MAC' +
type_m.upper()))
ip6tables.filter.forward('-i %s -j MAC' % dev_crans)
# Rien ne passe vers adm
# est ce que du local est gêné par le règle ?
ip6tables.filter.forward('-d %s -j REJECT --reject-with icmp6-addr-unreachable' % (prefix['adm'][0]))
# On met en place le forwarding
enable_forwarding(6)
def wifi_router(): def wifi_router():
''' Firewall pour le router du wifi ''' ''' Firewall pour le router du wifi '''
# Le wifi est maintenant routé directement sur komaz. # Le wifi est maintenant routé directement sur komaz.

View file

@ -19,7 +19,7 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import sys
import os, re, syslog, cPickle, socket import os, re, syslog, cPickle, socket
from ldap_crans import crans_ldap, hostname from ldap_crans import crans_ldap, hostname
@ -801,10 +801,13 @@ def mac_ip(ipt, machines, types_machines):
macips(ipt, machines, types_machines) macips(ipt, machines, types_machines)
for type_m in types_machines: for type_m in types_machines:
if not '-v6' in type_m and not type_m in tab.keys(): if not '-v6' in type_m and not type_m in tab.keys():
dev = iface6(type_m) try:
ipt.filter.input('-i %s -s %s -j %s' % (dev, prefix[type_m][0], dev = iface6(type_m)
'MAC' + type_m.upper())) ipt.filter.input('-i %s -s %s -j %s' % (dev, prefix[type_m][0],
ipt.filter.input('-i %s -j IEUI64' % dev) 'MAC' + type_m.upper()))
ipt.filter.input('-i %s -j IEUI64' % dev)
except NoIface as e:
sys.stderr.write("NoIface: %s" % e)
# On active les extensions de vie privée # On active les extensions de vie privée
for net in prefix['subnet']: for net in prefix['subnet']: