====== Bridge... ====== Liens: http://people.via.ecp.fr/~alexis/formation-linux/bridge.htmlhttp://www.cgsecurity.org/Articles/netfilter.html Un bridge est un pont :o) C'est un pont entre 2 liens Ethernet (par exemple) qui est totalement invisible vis a vis de l'exterieur: ce bridge est une sorte de cable ethernet virtuel. ===== Creer un bridge ===== D'abord, il faut installer les outils necessaire: # apt-get install bridge-utils On va creer un bridge entre l'interface **eth1** et **eth2** ==== La methode simple: ==== Modifier **/etc/network/interfaces** pour avoir un truc comme ça: auto br0 iface br0 inet manual bridge_ports eth1 eth2 bridge_stp off # bridge_hello 1 # bridge_maxage 4 bridge_fd 2 bridge_maxwait 0 Et enfin # ifup br0 J'ai mis en commentaire ce qui a fait partie de mes tests, sans comprendre quel etait leurs fonctions... mais ca marche aussi en les commentant. **manual** permet, il me semble, de ne pas preciser d'adresse IP. On peut specifier une adresse IP aussi ! Exemple: auto br0 iface br0 inet static address 192.168.0.65 network 192.168.0.0 netmask 255.255.255.0 broadcast 192.168.0.255 bridge_ports eth1 eth2 bridge_stp off # bridge_hello 1 # bridge_maxage 4 # bridge_fd 4 bridge_maxwait 0 Ainsi, on peut acceder a la machine qui sert de bridge sans besoin d'une 3 ieme carte reseau. ... Il faut savoir que le bridge peut mettre plusieurs longues secondes avant d'être fonctionnel. (une sorte de decouverte du réseau ...) ==== Methode compliqué... ==== (Methode vu et revu maintes fois... mais elle est chiiiiiiiiiante) #!/bin/sh -x IFA="eth1" IFB="eth2" ifconfig $IFA 0.0.0.0 promisc ifconfig $IFB 0.0.0.0 promisc brctl addbr br0 brctl addif br0 $IFA brctl addif br0 $IFB brctl sethello br0 1 brctl setmaxage br0 4 brctl setfd br0 4 ifconfig br0 up Ca marche un peu... mais ce n'est pas le methode que je comprend le mieux. Interessant quand même de faire **brctl show** pour voir les bridges existant. # brctl show bridge name bridge id STP enabled interfaces br0 8000.0000b452eff6 no eth1 eth2 ===== bridge et iptables ===== C'est assez limité en fait, car le veritable outils pour les bridges, c'est **ebtables** qui manipulent les trames Ethernet... ce qui n'est pas mon but. Le **bridge** ne passe que par le filtre **FORWARD**. (y parait que c'est logique) Donc, on peut autoriser ou non des echanges au niveau du filtre **FORWARD**. **iptables** ne semble voir a priori que **br0**, et pas les interfaces bridgé que sont **eth1** et **eth2**. Je ne vois pas bien l'utilité de jouer avec **br0** vu que je ne comprend pas le sens de deplacement des trames ! Le seul usage que j'en ai vu, c'est pour simplement faire: # iptables -A FORWARD -i br0 -j ACCEPT # iptables -A FORWARD -o br0 -j ACCEPT Pour designer les interfaces physiques, il faut utiliser le module **physdev**... ouf Exemple, on suppose que **eth1** est le reseau de nos serveurs et **eth2** est le WAN... # autorisons d'abord ce qui est legitime # Le wan ne peut pas initier de connexion et se limite au sous reseau designé iptables -A FORWARD -m physdev --physdev-in eth2 --physdev-out eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT # notre reseau oui iptables -A FORWARD -m physdev --physdev-in eth1 --physdev-out eth2 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT # autoriser le WAN a acceder au port 80 des serveurs iptables -A FORWARD -m physdev --physdev-in eth2 --physdev-out eth1 -p tcp --dport www -m state --state NEW -j ACCEPT # a SSH iptables -A FORWARD -m physdev --physdev-in eth2 --physdev-out eth1 -p tcp --dport ssh -m state --state NEW -j ACCEPT # autoriser tout au reseau de confiance... iptables -A FORWARD -m physdev --physdev-in eth2 -s 212.7.3.0/24 -m state --state NEW -j ACCEPT # et finalement iptables -A FORWARD -m physdev --physdev-in eth2 -j DROP Et voila, un putain de reseau protege... Par contre, impossible de faire du **NAT** ! Ca doit être normal mais c'est dommage. J'aurai voulu modifier les IP a la volé, mais ca ne semble pas possible. ==== Piste ==== On peut faire une sorte de "nat" et beaucoup d'autres choses au niveau des trames Ethernet avec un outil comme **ebtables**. ====== Dummy ====== Liens: * http://linax.wordpress.com/2009/09/12/linux-dummy-network-device/ * http://blogs.simc.be/simc/index.php/post/2010/12/08/Xen-%3A-dummy-un-r%C3%A9seau-interne-haut-d%C3%A9bit-pour-vos-VM Le but: avoir une pseudo interface reseau supplémentaire... L'interet que j'ai vu: créer une pseudo DMZ pour Xen. L'autre interet, c'est que c'est super plus rapide... Dom0 -> dummy0 -> Bridge -> DomU ... Exemple: Dans **''/etc/modules''** : dummy Et sans devoir rebooter, appliquer: # modprobe dummy0 Dans **''/etc/sysctl.conf''** : # Les requetes ARP ne traversent pas net.ipv4.conf.all.arp_ignore=1 Et sans devoir rebooter, appliquer: # sysctl -p Préparer le bridge sous Xen 4/Debian: auto dummy0 iface dummy0 inet manual auto xenbr1 iface xenbr1 inet manual bridge_ports dummy0 bridge_stp off bridge_maxwait 0 Monter le bridge: # ifup dummy0 # ifup xenbr1 Ensuite, on peut créer des DomU, avec par exemple dans la conf: vif = [ 'mac=00:16:3E:4A:19:BC,bridge=xenbr1' ] Libre a vous de définir un network IP qui va bien... ====== Tweaks ====== ===== min_free_kbytes ==== Liens: * http://www.acc.umu.se/~maswan/linux-netperf.txt * http://openvpn.net/index.php/open-source/faq.html Xen + un trafic TCP élévé donne ça: Dans les logs: ... kernel: [896480.440273] __ratelimit: 190 callbacks suppressed ... kernel: [896480.440276] swapper: page allocation failure. order:0, mode:0x4020 ... kernel: [896480.440279] Pid: 0, comm: swapper Not tainted 2.6.32-5-xen-amd64 #1 ... kernel: [896480.440282] Call Trace: ... kernel: [896480.440284] [] ? __alloc_pages_nodemask+0x592/0x5f5 ... kernel: [896480.440295] [] ? new_slab+0x5b/0x1ca ... ... On me pointe ça: $ cat /proc/sys/vm/min_free_kbytes 5746 Et j'essaye: # echo 16384 > /proc/sys/vm/min_free_kbytes