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