PDA

Bekijk Volledige Versie : haproxy & stunnel & ipv6 voor cp's en legacy



Mikey
23/10/10, 22:57
Ik wil in deze thread een opzetje/duwtje geven voor een simpele ipv6 implementatie voor op zijn minst web services. Ik ben niet van plan om alles tot in de treuren voor te kouwen, ben wel bereid bij tonen eigen initiatief hulp te bieden.

We hebben voor wat legacy spul inmiddels ipv6 geimplementeerd en wil dit dan ook delen met jullie ;) Ik zal hierbij directadmin configs als voorbeeld pakken aangezien die voor de meeste inmiddels wel te begrijpen zijn. En misschien heb je wel een server waarbij nu al vaststaat dat er de aankomende tijd nog steeds niet getest gaat worden met ipv6 of de implementatie om wat voor reden achter loopt. Onderstaand werkt ook uitstekend voor oudere plesk servers waar de baten niet opwegen tegen de lasten voor het upgraden.

Een opstakel waar je al snel tegen aan zult lopen is dat bij het proxy'n van ipv6 -> ipv4 er nog maar een ipv4 adres opgepakt zal worden in de logfiles / statistieken. Namelijk het ipv4 adres van de proxy server. Haproxy heeft de mogelijkheid om X-forward headers toe te voegen aan de request. Dit kun je doen door "forwardfor" als option mee te geven in je haproxy configuratie.

Nu dit gedaan is kun je met phpinfo() controlleren of dit gebeurt. Echter zul je zien dat in je access log nog steeds het bekende ipv4 adres terugkomt.

Ik pak hieronder directadmin configuratie, met een beetje inbeelding past dit in elke gewenste situatie.

httpd.conf
Voeg onder:
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined

Toe:
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined_ipv6
SetEnvIfNoCase X-Forwarded-For "." from_ipv6_proxy=1

Open nu de httpd.conf file van een domein waar je het eerst op wilt testen (/usr/local/directadmin/data/users/USER/httpd.conf

Edit de de volgende line onder poort 80
CustomLog /var/log/httpd/domains/domein.nl.log combined
als volgt
CustomLog /var/log/httpd/domains/domein.nl.log combined env=!from_ipv6_proxy
en voeg daaronder deze toe
CustomLog /var/log/httpd/domains/domein.nl.log combined_ipv6 env=from_ipv6_proxy

Herstart nu apache, en visit nogmaals het betreffende domein over ipv6, bekijk nu de access log. Als alles goed gegaan is zie je het juiste ipv6 adres en is het voorgaande ipv4 adres komen te vervallen.

Vergeet overigens niet voor directadmin als je webalizer gebruikt deze opnieuw te compilen. Mocht je dit niet doen dan zal er in de stats de stats geen juiste ipv6 adres komen te staan.

Voor diegene die gebruik maken van access control op ip basis of weet ik veel wat dan ook. Mocht het ipv4 adres het ip van de proxy zijn, check dan de x-forward header in bijvoorbeeld php.

Ssl kan getunneld worden met stunnel, voor haproxy hebben we een change aangevraagd voor de forwardfor except optie. Deze kan nu enkel ipv4 excepten. Als je stunnel compiled met de patch die te vinden is op de haproxy website kun je via stunnel ook al een x-forward header toe voegen. Deze is nodig! Wat je nu doet is haproxy op 127.0.0.1:random poort laten luisteren en daar stunnel heen laten connecten. Dan kan er op ipv4 niveau de x-forward van 127.0.0.1 eruit gefilterd worden met except. Echter om de configs schoon te houden prefereren wij er in ieder geval in haproxy voor zowel 80 als 443 een single entry te houden. Iets wat nu nog niet mogelijk is maar er wel aan zit te komen, hier ben ik al mee bezig geweest:


Wow. That's all. I have not done the IPv6 version of the "forwardfor except"
that was discussed a few days ago because I realized that it required some
primitives to perform IPv6 mask matches and such things, which would have
delayed the release further. All that was already too much work for a stable
release (especially due to the ECV patch), next time I'll be more careful.

bron: http://www.formilux.org/archives/haproxy/1010/3948.html


Ik hoop hiermee toch her en der een aanzetje te geven voor ook de oudere spullen ipv6 compatible te maken. Er zijn 1001 beren op de weg maar pak nou net de goede.

Bovenstaand is eveneens goed toe te passen op plesk. Hier zit nog wel wat custom script werk aanvast. Voorkouwen was niet de bedoeling maar wie weet heeft de creatieve geest nu genoeg voer gehad om ook voor jullie situaties iets te gaan verzinnen :whistling:

maxnet
25/10/10, 19:02
httpd.conf
Voeg onder:
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined

Toe:
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined_ipv6
SetEnvIfNoCase X-Forwarded-For "." from_ipv6_proxy=1




Voor diegene die gebruik maken van access control op ip basis of weet ik veel wat dan ook. Mocht het ipv4 adres het ip van de proxy zijn, check dan de x-forward header in bijvoorbeeld php.


Niet makkelijker en veiliger om mod_rpaf (http://stderr.net/apache/rpaf/) te installeren?

Die vereist geen aanpassingen in je PHP code en gebruikt verder alleen de X-forwarded-for header als de verbinding daadwerkelijk van het IP-adres van de proxy server afkomstig is.
Daar checkt jouw logformat constructie niet voor. (geen probleem als Apache alleen naar 127.0.0.1 of een private IP zou luisteren, maar dat moet je er dan wel bij vermelden).




Als je stunnel compiled met de patch die te vinden is op de haproxy website kun je via stunnel ook al een x-forward header toe voegen.


Probleem waar ik een tijdje terug met die patch tegenaan liep is dat ie niet werkt als je keep-alive aan hebt staan. :(
Voorziet alleen het eerste request van de X-forwarded-for header, en niet de requests die erna komen.

Mikey
25/10/10, 20:11
Ik kende die apache module niet, als die ipv6 ondersteund zou dat een betere oplossing zijn dan twee log rules :)