<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Emile "iMil" Heitor 's home &#187; iptables</title>
	<atom:link href="http://imil.net/wp/tag/iptables/feed/" rel="self" type="application/rss+xml" />
	<link>http://imil.net/wp</link>
	<description>life, unix and stuff</description>
	<lastBuildDate>Wed, 08 Feb 2012 22:31:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>mmmmm les bons spaghettis</title>
		<link>http://imil.net/wp/2011/12/03/mmmmm-les-bons-spaghettis/</link>
		<comments>http://imil.net/wp/2011/12/03/mmmmm-les-bons-spaghettis/#comments</comments>
		<pubDate>Sat, 03 Dec 2011 13:39:05 +0000</pubDate>
		<dc:creator>iMil</dc:creator>
				<category><![CDATA[Blogroll]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[IPv6]]></category>
		<category><![CDATA[NAT]]></category>
		<category><![CDATA[NetBSD]]></category>
		<category><![CDATA[pf]]></category>
		<category><![CDATA[route-to]]></category>

		<guid isPermaLink="false">http://imil.net/wp/?p=668</guid>
		<description><![CDATA[Ça commence à sentir le vieux sac de lacets sur ma routing box.
Pour rappel, j&#8217;utilise un domU NetBSD hébergé quelque part pour différencier mon traffic sortant. Ce domU est controllé par un dom0 Debian Squeeze, et a ceci de particulier que sa route par défaut part vers la suède. Seuls quelques services répondent directement sur [...]]]></description>
			<content:encoded><![CDATA[<p>Ça commence à sentir le vieux sac de lacets sur ma <a href="http://imil.net/wp/2011/08/07/mais-tu-tu-tennuies-dans-la-vie-en-fait/">routing box</a>.<br />
Pour rappel, j&#8217;utilise un domU NetBSD hébergé <i>quelque part</i> pour différencier mon traffic sortant. Ce domU est controllé par un dom0 Debian Squeeze, et a ceci de particulier que sa route par défaut part vers la suède. Seuls quelques services répondent directement sur l&#8217;IP publique &#8220;réelle&#8221;, sur laquelle j&#8217;opère du <a href="http://www.netfilter.org/documentation/HOWTO/NAT-HOWTO-6.html">SNAT et du DNAT</a>.</p>
<p>Tout ceci manquait cruellement d&#8217;un soupçon d&#8217;IPv6. Ainsi, après m&#8217;être frotté à SixXs et son système de <a href="http://www.sixxs.net/faq/account/?faq=credits">crédits</a> aussi ingénieux que pénible, j&#8217;ai finalement opté pour <a href="http://tunnelbroker.net">Hurricane Electric</a> qui a en plus le bon goût de posséder un <i>endpoint</i> à <a href="http://en.wikipedia.org/wiki/Coruscant">Paris</a>.</p>
<p>Si la configuration d&#8217;un tunnel v4/v6 se réalise le plus simplement du monde depuis plus de 10 ans via des <a href="http://www.netbsd.org/docs/network/ipv6/">tunnels gif</a>, l&#8217;opération n&#8217;est pas complètement triviale lorsque le endpoint se trouve être NATté et qu&#8217;en plus ce dernier utilise une route par défaut différente de l&#8217;IP publique officielle du dom0.</p>
<p>Ainsi, après avoir souscrit à un <i>endpoint</i> IPv6 chez <i>HE</i>, quelques opérations sont nécessaires au bon fonctionnement du routage. Nous considèrerons que l&#8217;ip du <i>endpoint gif IPv4</i> chez Hurricane est <code>1.2.3.4</code> et que notre IPv4 publique, sur le dom0 donc, est <code>5.6.7.8</code>.</p>
<p>La première chose à faire sur notre dom0 est de rediriger tout le traffic en provenance de HE vers notre domU, dont nous considèrerons que l&#8217;IPv4 privée est <code>192.168.0.1</code>.</p>
<pre># iptables -t nat -A PREROUTING -i eth0 -s 1.2.3.4 -j DNAT --to-destination 192.168.0.1</pre>
<p>Il faudra évidemment, si cela n&#8217;est pas déjà fait, appliquer du <i>SNAT</i> afin que votre domU puisse &#8220;sortir&#8221; et se présenter avec notre IPv4 publique au monde. Par exemple:</p>
<pre># iptables -t nat -A POSTROUTING -s 192.168.0.1/32 -o eth0 -j SNAT --to-source 5.6.7.8</pre>
<p>C&#8217;est l&#8217;unique configuration à effectuer sur le dom0. Jusqu&#8217;ici tout va bien.</p>
<p>Sur notre domU NetBSD, nous créons l&#8217;interface de <i>tunneling</i> comme ceci:</p>
<pre>
# ifconfig gif0 create
# ifconfig gif0 tunnel 192.168.0.1 1.2.3.4
# ifconfig gif0 inet6 2001:470:1e31:b2c::2 2001:470:1e31:b2c::1 prefixlen 128
</pre>
<p>Notez que c&#8217;est bien l&#8217;IPv4 <strong>privée</strong> que nous utilisons pour monter le tunnel <code>gif</code>, le <i>SNAT</i> du dom0 s&#8217;occuppera de transformer cette IP au vol.<br />
Cette seule configuration, compte tenu du <a href="http://imil.net/wp/2011/07/24/jouons-a-cache-cache/">routage particulier</a> de notre domU, ne suffira pas au bon fonctionnement du tunnel. Deux opérations sont nécessaires:</p>
<ul>
<li>Ajouter une route explicite vers le <i>endpoint HE</i></li>
<li>Forcer la sortie vers l&#8217;interface réelle du dom0 lorsqu&#8217;on essaye de joindre une adresse IPv6</li>
</ul>
<p>Execution:</p>
<pre># route add -host 1.2.3.4 192.168.0.254</pre>
<p>Ici, 192.168.0.254 est l&#8217;adresse passerelle du dom0.</p>
<pre># grep he_tunnel /etc/pf.conf-ovpn
he_tunnel="1.2.3.4/32"
pass out quick route-to ($real_if $gateway) from any to $he_tunnel
</pre>
<p><code>$real_if</code> représente l&#8217;interface <code>xennet0</code>, et <code>$gateway</code> l&#8217;adresse de notre passerelle coté dom0, à savoir <code>192.168.0.254</code>.<br />
Reste à appliquer une route par défaut pour les adresses IPv6:</p>
<pre>
route -n add -inet6 default 2001:470:1e31:b2c::1
</pre>
<p>Et nous y sommes. Enfin, il faut evidemment automatiser toutes ces manipulations afin de retrouver notre état fonctionnel à chaque <i>reboot</i>, cela est réalisé en créant le fichier <code>/etc/ifconfig.gif0</code> avec ce contenu:</p>
<pre>create
tunnel 192.168.0.1 1.2.3.4
inet6 2001:470:1e31:b2c::2 2001:470:1e31:b2c::1 prefixlen 128
!route add -host 1.2.3.4 192.168.0.254
!route -n add -inet6 default 2001:470:1e31:b2c::1
</pre>
<p>And voila, Danse petite tortue, danse !</p>
]]></content:encoded>
			<wfw:commentRss>http://imil.net/wp/2011/12/03/mmmmm-les-bons-spaghettis/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Au feu, tournez à gauche</title>
		<link>http://imil.net/wp/2010/03/20/au-feu-tournez-a-gauche/</link>
		<comments>http://imil.net/wp/2010/03/20/au-feu-tournez-a-gauche/#comments</comments>
		<pubDate>Sat, 20 Mar 2010 13:22:19 +0000</pubDate>
		<dc:creator>iMil</dc:creator>
				<category><![CDATA[Blogroll]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[NetBSD]]></category>
		<category><![CDATA[OpenVPN]]></category>
		<category><![CDATA[pf]]></category>

		<guid isPermaLink="false">http://imil.net/wp/?p=443</guid>
		<description><![CDATA[Pour des raisons évidentes, j&#8217;ai décidé de rendre un peu moins aisée (i.e. pas immédiate) la découverte de mon IP. Plus précisemment, pour certains protocoles et pour certaines machines, je veux que l&#8217;IP vue par mon/mes peers ne soit pas directement l&#8217;IP que mon fournisseur d&#8217;accès m&#8217;affecte.
J&#8217;ajoute, mais cela n&#8217;a evidemment aucun rapport avec cet [...]]]></description>
			<content:encoded><![CDATA[<p>Pour des <a href="http://fr.wikipedia.org/wiki/Loi_Création_et_Internet">raisons</a> <a href="http://fr.wikipedia.org/wiki/Loppsi">évidentes</a>, j&#8217;ai décidé de rendre un peu moins aisée (i.e. pas immédiate) la découverte de mon IP. Plus précisemment, pour certains protocoles et pour certaines machines, je veux que l&#8217;IP vue par mon/mes peers ne soit pas directement l&#8217;IP que mon fournisseur d&#8217;accès m&#8217;affecte.</p>
<p>J&#8217;ajoute, mais cela n&#8217;a evidemment aucun rapport avec cet article, que certains pays intellectuellement plus développés ont recemment <a href="http://www.numerama.com/magazine/15265-la-justice-espagnole-confirme-la-legalite-du-p2p-en-espagne.html">confirmé que le partage de fichiers sur le réseau n&#8217;était pas illégal sur leur sol</a>.</p>
<p>Le postulat est donc le suivant: seules certaines machines de mon réseau privé devront &#8220;sortir&#8221; sur une passerelle differente, et uniquement pour certains ports et protocoles.</p>
<p>Pour réaliser cette petite tambouille, j&#8217;ai à ma disposition :</p>
<ul>
<li>Un serveur dédié ou virtuel hébergé &#8220;ailleurs&#8221;, possédant une interface sur une <a href="http://fr.wikipedia.org/wiki/Zone_démilitarisée">DMZ</a></li>
<li>Le serveur en question fonctionne sous GNU/Linux, on gère donc le NAT et le <i>firewalling</i> grâce à iptables</li>
<li>Une passerelle qui me relie à l&#8217;Internet par le biais de mon fournisseur d&#8217;accès</li>
<li>Cette passerelle fonctionne sous NetBSD 5.0.2, on gère le NAT et le <i>firewalling</i> grâce à <a href="http://fr.wikipedia.org/wiki/Packet_Filter">pf</a> (notez qu&#8217;<a href="http://fr.wikipedia.org/wiki/IPFilter">ipf</a> ne permettrait pas, à ma connaissance, d&#8217;utiliser les fonctions qui nous seront nécessaires)</li>
</ul>
<p>La première étape consiste à établir un lien VPN entre la passerelle et le serveur dédié. J&#8217;ai utilisé <a href="http://openvpn.net/">OpenVPN</a>, solution de choix de par sa simplicité, sa souplesse et sa grande stabilité. Étant donné qu&#8217;il existe un nombre incalculable de documentations sur cet outil, je colle ici mes configurations client et serveur sans plus de détails :</p>
<p>Sur le serveur :</p>
<pre>
tls-server

port 4444
dev tun
proto udp
local mon.serveur.dedie

cd /home/imil/etc/openvpn
ca keys/ca.crt
cert keys/dedie.crt
key keys/dedie.key
dh keys/dh1024.pem

client-config-dir ccd

server 10.20.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt

client-to-client
route 192.168.1.0 255.255.255.0

comp-lzo

keepalive 10 60
ping-timer-rem
persist-tun
persist-key

status openvpn-status.log

verb 3
</pre>
<p>Sur le client :</p>
<pre>
tls-client

proto udp
dev tun0

remote mon.serveur.dedie 4444

nobind

cd /usr/pkg/etc/openvpn/dedie-keys
ca ca.crt
cert monhost.crt
key monhost.key

comp-lzo

keepalive 10 60
ping-timer-rem
persist-tun
persist-key

pull

verb 3
log /var/log/openvpn.log
</pre>
<p>Une fois OpenVPN démarré sur chaque point, une interface <code>tun0</code> monte, avec coté serveur une IP du type <i>10.20.0.1</i> et côté client, <i>10.20.0.6</i>.<br />
Notez que, coté serveur dédié, on verra arriver une machine depuis la passerelle avec son IP réelle sur le réseau domestique, soit ici <i>192.168.1.0/24</i>. Ainsi, c&#8217;est ce sous-réseau que nous devons <i>NATer</i> sur le dédié GNU/Linux.</p>
<p>Une particularité de mon montage est que je ne souhaite pas utiliser l&#8217;IP publique principale de mon serveur public car celle-ci possède un <i>reverse</i> sur mon domaine et est facilement identifiable. Par chance, mon hébergeur me donne la possibilité d&#8217;ajouter des alias IP routés sur l&#8217;interface publique. En l&#8217;occurence, c&#8217;est précisemment sur cet alias que j&#8217;effectue un <i>source NAT</i> plutot que du <i>MASQUERADING</i> :</p>
<pre>
### règles INPUT
# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # j'autorise en entrée les connexions établies et connexes
# iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT # j'autorise l'echo-request
# iptables -A INPUT -p udp -m udp --dport 4444 -j ACCEPT # j'autorise la connexion vers OpenVPN
# iptables -A INPUT -i eth0 -j REJECT --reject-with icmp-port-unreachable # et je rejette tout le reste sur l'interface eth0
### règles de NAT
# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source mon.alias.ip.public
</pre>
<p>Désormais, si sur ma passerelle je plaçais une route par defaut sur <i>10.20.0.1</i> (le boût du tunnel sur le serveur dédié), les machines de mon réseau <i>192.168.1.0/24</i> apparaîtraient avec l&#8217;IP <i>mon.alias.ip.public</i>.<br />
Cependant, seulement certaines machines, et surtout certains protocoles devront être soumis à cette politique, et c&#8217;est grâce à <code>pf</code>, et en particulier la directive <code>route-to</code>, que nous allons mettre en place ce routage conditionnel. Voici les lignes corresponsantes du fichier <code>pf.conf</code> de notre passerelle NetBSD :</p>
<pre>
int_if="xennet0"

[...]

pass in on $int_if route-to (tun0 10.20.0.1) proto tcp from 192.168.1.10 \
        to any port 80
pass in on $int_if route-to (tun0 10.20.0.1) proto udp from 192.168.1.10 \
        to any port > 10000
</pre>
<p>Décodage: Concernant le traffic qui arrive sur l&#8217;interface interne <code>$int_if</code>, toute demande en provenance de l&#8217;IP <i>192.168.1.10</i> à destination du protocole HTTP devra être routée vers l&#8217;interface <code>tun0</code> en utilisant l&#8217;adresse de passerelle <i>10.20.0.1</i>.<br />
toute demande en provenance de l&#8217;IP <i>192.168.1.10</i> à destination de ports UDP supérieurs à 10000 devra être routée vers l&#8217;interface <code>tun0</code> en utilisant l&#8217;adresse de passerelle <i>10.20.0.1</i>.</p>
<p>J&#8217;utilise ce routage depuis hier soir, l&#8217;<i>overhead</i> du lien VPN est minimal et l&#8217;ensemble se comporte correctement. Je ne prétend pas, avec ce système, bénéficier d&#8217;un anonymat hors du commun, mais il me permet au moins de ne pas exposer mon IP publique.</p>
]]></content:encoded>
			<wfw:commentRss>http://imil.net/wp/2010/03/20/au-feu-tournez-a-gauche/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Asterisk et NetBSD, une affaire qui roule</title>
		<link>http://imil.net/wp/2010/03/07/asterisk-et-netbsd-une-affaire-qui-roule/</link>
		<comments>http://imil.net/wp/2010/03/07/asterisk-et-netbsd-une-affaire-qui-roule/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 11:47:25 +0000</pubDate>
		<dc:creator>iMil</dc:creator>
				<category><![CDATA[Blogroll]]></category>
		<category><![CDATA[Ma vie, mon oeuvre]]></category>
		<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[NAT]]></category>
		<category><![CDATA[NetBSD]]></category>

		<guid isPermaLink="false">http://imil.net/wp/?p=421</guid>
		<description><![CDATA[Contre toute attente, la migration de mon IPBX perso a été parfaitement sans douleur. Après l&#8217;installation de la toute dernière version d&#8217;Asterisk sur mon domU NetBSD à l&#8217;aide de pkgin (puisqu&#8217;aucune option particulière ne m&#8217;était nécessaire), je me suis souvenu d&#8217;un article que j&#8217;avais initialement écrit sur le site Freephonie.org, dans lequel j&#8217;expliquais les diverses [...]]]></description>
			<content:encoded><![CDATA[<p>Contre toute attente, la migration de mon <a href="http://fr.wikipedia.org/wiki/IPBX">IPBX</a> perso a été parfaitement sans douleur. Après l&#8217;installation de la toute dernière version d&#8217;<a href="http://www.asterisk.org/">Asterisk</a> sur mon domU NetBSD à l&#8217;aide de <a href="http://imil.net/pkgin">pkgin</a> (puisqu&#8217;aucune option particulière ne m&#8217;était nécessaire), je me suis souvenu <a href="http://www.freephonie.org/doku/tutoriel:asterisk">d&#8217;un article que j&#8217;avais initialement écrit</a> sur le site <a href="http://www.freephonie.org/">Freephonie.org</a>, dans lequel j&#8217;expliquais les diverses manipulations pour monter un Asterisk fonctionnel derrière du NAT.<br />
Comme souvent, l&#8217;article a été peaufiné par quelques contributeurs, et son contenu est tout à fait valide pour la configuration d&#8217;un Asterisk 1.6.</p>
<p>Ainsi, mon dom0 GNU/Linux possède les règles suivantes :</p>
<pre>
# on accepte le traffic SIP et une plage destinée au RTP
-A INPUT -p udp -m udp --dport 5060 -j ACCEPT
-A INPUT -p udp -m udp --dport 10000:10100 -j ACCEPT
# On accepte le forward pour ces memes ports vers le domU qui accueille le PBX
-A FORWARD -d 10.20.30.1/32 -i eth0 -p udp -m udp --dport 5060 -j ACCEPT
-A FORWARD -d 10.20.30.1/32 -i eth0 -p udp -m udp --dport 10000:10100 -j ACCEPT
# On reroute le traffic vers ces ports sur le domU adéquat
-A PREROUTING -i eth0 -p udp -m udp --dport 5060 -j DNAT --to-destination 10.20.30.1
-A PREROUTING -i eth0 -p udp -m udp --dport 10000:10100 -j DNAT --to-destination 10.20.30.1
</pre>
<p>Sur le domU en question, ma configuration n&#8217;a guère changé, si ce n&#8217;est que j&#8217;ai réduit le <i>pool</i> de ports RTP dans le fichier <code>rtp.conf</code> :</p>
<pre>
; ces ports correspondent aux ports reroutés par iptables sur le dom0
rtpstart=10000
rtpend=10100
</pre>
<p>Le reste de la configuration est strictement identique à la <a href="http://www.freephonie.org/doku/tutoriel:asterisk">documentation</a> visible sur Freephonie.org.<br />
Notez qu&#8217;afin de pouvoir débugger tranquillement avec votre utilisateur, grace à la commande <code>asterisk -r</code>, et pour pouvoir éditer les fichiers de configuration d&#8217;Asterisk sans peine, pensez à vous ajouter au groupe &#8220;asterisk&#8221;, autoriser l&#8217;ecriture pour le groupe dans <code>/usr/pkg/etc/asterisk</code>, et modifier les champs suivants dans le fichier <code>asterisk.conf</code> :</p>
<pre>
runuser = asterisk ; The user to run as
rungroup = asterisk ; The group to run as

[files]
astctlpermissions = 0660
astctlowner = asterisk
astctlgroup = asterisk
astctl = asterisk.ctl
</pre>
<p>Et enfin: &#8220;Allo Bob ? c&#8217;est Paul !&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://imil.net/wp/2010/03/07/asterisk-et-netbsd-une-affaire-qui-roule/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

<!-- Served from: imil.net @ 2012-02-09 10:12:14 by W3 Total Cache -->
