175 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			175 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
title: How to enable IPv6 in applications
 | 
						|
---
 | 
						|
pub_date: 2019-09-26
 | 
						|
---
 | 
						|
author: ungleich
 | 
						|
---
 | 
						|
twitter_handle: ungleich
 | 
						|
---
 | 
						|
abstract:
 | 
						|
New to IPv6? Wondering how to enable IPv6 in your favorite
 | 
						|
application? Then this blog entry is for you.
 | 
						|
---
 | 
						|
body:
 | 
						|
 | 
						|
In this blog article you'll find some hints on how to enable IPv6 for
 | 
						|
various applications.
 | 
						|
 | 
						|
## How to enable IPv6 in nginx
 | 
						|
 | 
						|
The web server [nginx](https://nginx.org/) by default only listens to IPv4 if you use
 | 
						|
the standard `listen *:80;` directive. To enable IPv6, use
 | 
						|
`listen [::]:80;`. So for a dual stack server, your configuration
 | 
						|
could look as follows:
 | 
						|
 | 
						|
 | 
						|
```
 | 
						|
server {
 | 
						|
    listen *:80;
 | 
						|
    listen [::]:80;
 | 
						|
 | 
						|
    ...
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
```
 | 
						|
 | 
						|
## How to enable IPv6 in HAProxy
 | 
						|
 | 
						|
There are various interesting configuration options in
 | 
						|
[HAProxy](https://www.haproxy.org/) related
 | 
						|
to IPv6. Let's have a look at each of them!
 | 
						|
 | 
						|
To enable IPv6 transport for the local logging, use `log [::1]` in the
 | 
						|
global section:
 | 
						|
 | 
						|
```
 | 
						|
global
 | 
						|
    log      [::1] local2
 | 
						|
    ...
 | 
						|
 | 
						|
```
 | 
						|
 | 
						|
If you want a frontend to listen to either IPv6 or IPv4 only, you can
 | 
						|
use the `ipv6@` prefix as follows:
 | 
						|
 | 
						|
```
 | 
						|
# IPv6 http frontend
 | 
						|
frontend httpipv6
 | 
						|
    bind ipv6@:80
 | 
						|
    mode http
 | 
						|
 | 
						|
 | 
						|
# IPv4 http frontend
 | 
						|
frontend httpipv4
 | 
						|
    bind ipv4@:80
 | 
						|
    mode http
 | 
						|
    ...
 | 
						|
 | 
						|
```
 | 
						|
 | 
						|
If you want to connect to the backends only via a specific protocol,
 | 
						|
we can use the prefix syntax there as well:
 | 
						|
 | 
						|
```
 | 
						|
backend httpipv4
 | 
						|
    mode http
 | 
						|
    use-server ungleich.ch if { hdr(host) -i ungleich.ch }
 | 
						|
    server ungleich.ch ipv6@ungleich.ch
 | 
						|
    ...
 | 
						|
```
 | 
						|
 | 
						|
To proxy IPv6 requests to IPv4 only [twitter](https://twitter.com), you could
 | 
						|
use the following configuration:
 | 
						|
 | 
						|
```
 | 
						|
# ipv6 https
 | 
						|
frontend httpsipv6
 | 
						|
    bind ipv6@:443
 | 
						|
    mode tcp
 | 
						|
    option tcplog
 | 
						|
    tcp-request inspect-delay 5s
 | 
						|
    tcp-request content accept if { req_ssl_hello_type 1 }
 | 
						|
    default_backend httpsipv6
 | 
						|
 | 
						|
backend httpsipv6
 | 
						|
    mode tcp
 | 
						|
    use-server twitter.com if { req_ssl_sni -i twitter.com }
 | 
						|
    server twitter.com ipv4@twitter.com
 | 
						|
```
 | 
						|
 | 
						|
## How to enable IPv6 in Lektor
 | 
						|
 | 
						|
The static CMS [lektor](https://www.getlektor.com/)
 | 
						|
by default serves on IPv4. To serve on IPv6
 | 
						|
localhost use `-h ::1`, to be globally reachable use `-h ::`.
 | 
						|
 | 
						|
```
 | 
						|
# Serve on IPv6 localhost
 | 
						|
% lektor serve -h ::1
 | 
						|
 | 
						|
# Serve on IPv6 (globally reachable)
 | 
						|
% lektor serve -h ::
 | 
						|
```
 | 
						|
 | 
						|
## How to use IPv6 in keepalived
 | 
						|
 | 
						|
[Keepalived](https://keepalived.org/), the VRRP daemon for Linux,
 | 
						|
supports IPv6 for a while. However newer versions (wikipedia: citation
 | 
						|
needed) of keepalived require to have two different instances, if you
 | 
						|
are running dual stack VRRP messages. So your keepalived.conf for use
 | 
						|
with IPv6 might look as follows:
 | 
						|
 | 
						|
```
 | 
						|
vrrp_instance router_internal {
 | 
						|
    state BACKUP
 | 
						|
    interface bond0.10
 | 
						|
    virtual_router_id 1
 | 
						|
 | 
						|
    virtual_ipaddress {
 | 
						|
        2a0a:e5c0:2:0::7/64  dev bond0.10
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
vrrp_instance router_internal_ipv4 {
 | 
						|
    state BACKUP
 | 
						|
    interface bond0.10
 | 
						|
    virtual_router_id 2
 | 
						|
 | 
						|
    virtual_ipaddress {
 | 
						|
        10.3.0.7/22 dev bond0.10
 | 
						|
    }
 | 
						|
}
 | 
						|
```
 | 
						|
 | 
						|
## How to enable IPv6 in the Python HTTP Server
 | 
						|
 | 
						|
If you are coding in python and you want your HTTP server to listen on
 | 
						|
IPv6, you can inherit from HTTPServer and set the address family to
 | 
						|
*AF_INET6* as follows:
 | 
						|
 | 
						|
```
 | 
						|
class HTTPServerV6(HTTPServer):
 | 
						|
      address_family = socket.AF_INET6
 | 
						|
```
 | 
						|
 | 
						|
For more details on how to use the HTTPServer in general,
 | 
						|
checkout
 | 
						|
[this stackoverflow post](https://stackoverflow.com/questions/23264569/python-3-x-basehttpserver-or-http-server).
 | 
						|
 | 
						|
Thanks to cvmiller for this hint!
 | 
						|
 | 
						|
## How to enable IPv6 in Redhat Linux
 | 
						|
 | 
						|
While Red Hat is not specifically an application, we still wanted
 | 
						|
to list [the article from  Valentin
 | 
						|
Bajrami](https://www.redhat.com/sysadmin/configuring-ipv6-rhel-7-8)
 | 
						|
which describes how to configure IPv6 on Red Hat. Thanks for the
 | 
						|
pointer to [IndieLab](https://twitter.com/omnidelic)!
 | 
						|
 | 
						|
## Other applications
 | 
						|
 | 
						|
If you know about other applications or want to enhance one of our
 | 
						|
configuration, we invite you to join the [IPv6
 | 
						|
chat](https://IPv6.chat) or [write to us on
 | 
						|
Twitter](https://twitter.com/ungleich).
 |