Asterisk + Sipgate + IPv6

My internet provider force-migrated me to Dual-Stack Light the other day, so now I have IPv6 at home. It did cost me my IPv4 address though, so I’m not sure yet if I should be stoked or not. But anyway, now that I have it, I wanted to at least try it out.

I was surprised to find that, using IPv4, my Asterisk setup just continued to work. When I switched it over to IPv6, I couldn’t receive calls anymore. I had expected this to be exactly the other way around, but meh.

Using tcpdump I found out that Asterisk was receiving calls from a different IP than the one it was registered to, which seems to have inspired it to reject the call because “those aren’t the droids we’re looking for”. Switching back to IPv4, I noticed calls were always coming from the address I was registered to. And DNS checks out - here’s sipgate.de for IPv4:

;; QUESTION SECTION:
;sipgate.de.                    IN      A

;; ANSWER SECTION:
sipgate.de.             6382    IN      A       217.10.79.9

And the same query for IPv6:

;; QUESTION SECTION:
;sipgate.de.                    IN      AAAA

;; ANSWER SECTION:
sipgate.de.             7437    IN      AAAA    2001:ab7::2
sipgate.de.             7437    IN      AAAA    2001:ab7::4
sipgate.de.             7437    IN      AAAA    2001:ab7::1
sipgate.de.             7437    IN      AAAA    2001:ab7::3

So, they’re exposing four addresses via IPv6 and only one via IPv4. So I guess I need to tell Asterisk to accept calls from all four of them. It seems that using templates in sip.conf, this is even fairly easy. My configuration changed from:

[general]
bindaddr    = 0.0.0.0
# ...

[sipgate]
nat         = yes
description = sipgate
type        = friend
host        = sipgate.de
# ...

To:

[general]
bindaddr    = ::
# ...

[sipgate](!)
description = sipgate
type        = friend
outboundproxy = v6.sipgate.de
# ...

[sipgate-out](sipgate)
host        = sipgate.de

[sipgate-1](sipgate)
host        = 2001:ab7::1

[sipgate-2](sipgate)
host        = 2001:ab7::2

[sipgate-3](sipgate)
host        = 2001:ab7::3

[sipgate-4](sipgate)
host        = 2001:ab7::4

It seems that I can now receive calls again, and sip show peers now shows four five sipgate peers instead of one. (I had not added the sipgate-out peer initially. While it’s technically duplicate, sipgate won’t accept SIP invites that go to somenumber@2001:ab7::2, so I had to add it for placing outgoing calls. Adding this extra peer makes sure I send the correct SIP invites. Not sure if it also gives me failover.)

Btw: A word on codecs

When setting up Asterisk initially, I experienced problems with random one-way audio. It seems those were due to my asterisk preferring different codecs than the Sipgate servers do. Adding the following section to sip.conf fixed that for me::

[general]
disallow       = all
allow          = alaw
allow          = ulaw
allow          = speex
allow          = g729
allow          = gsm