How to enable IPv6 in applications

Posted on 2019-09-26 by ungleich

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 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 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, 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 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, 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.

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 which describes how to configure IPv6 on Red Hat. Thanks for the pointer to IndieLab!

Other applications

If you know about other applications or want to enhance one of our configuration, we invite you to join the IPv6 chat or write to us on Twitter.