{"id":17683,"date":"2013-12-22T00:23:33","date_gmt":"2013-12-22T05:23:33","guid":{"rendered":"https:\/\/nuxx.net\/blog\/?p=17683"},"modified":"2013-12-22T14:07:10","modified_gmt":"2013-12-22T19:07:10","slug":"apple-airport-extreme-7-6-4-bridged-but-not-really","status":"publish","type":"post","link":"https:\/\/nuxx.net\/blog\/2013\/12\/22\/apple-airport-extreme-7-6-4-bridged-but-not-really\/","title":{"rendered":"Apple AirPort Extreme 7.6.4: Bridged, but Not Really"},"content":{"rendered":"<p><a href=\"https:\/\/nuxx.net\/gallery\/v\/computers\/screenshots\/AirPort_Utility_Bridged_Mode_Lie.png.html?g2_imageViewsIndex=1\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" title=\"Apple AirPort Utility 6.3.2 showing the Router Mode on an AirPort Extreme with firmware 7.6.4 to be in bridged mode. This is a lie, as it is not completely bridged.\" alt=\"\" src=\"https:\/\/nuxx.net\/gallery\/d\/105397-2\/AirPort_Utility_Bridged_Mode_Lie.png\" width=\"640\" height=\"613\" \/><\/a><\/p>\n<p>I like having an <a href=\"https:\/\/en.wikipedia.org\/wiki\/IPv6\">IPv6<\/a> connection at home, but after running into some weirdness with <a href=\"http:\/\/www.pfsense.org\/\">pfSense 2.1-RELEASE<\/a>\u00a0that seems correlated with having the pfSense box as the GIF endpoint \/ IPv6 router (things would kinda get slow, then eventually sort-of fail) I started looking for other options. I have an <a href=\"https:\/\/en.wikipedia.org\/wiki\/AirPort_Extreme\">Apple AirPort Extreme<\/a>\u00a0running in bridged mode which I use to provide wireless access to the LAN, and it has the ability to tunnel out to an IPv6 network, so I decided to set that up\u2020.<\/p>\n<p>However, in the midst of getting this setup I ran into a very frustrating problem: only wireless clients connecting via the AirPort could use IPv6; wired clients wouldn&#8217;t work. The problem was my previous observation (and expectation), that turning the AirPort into a bridge would make all ports on the back of the device equal. It does not, and thus I needed to move the wired network connection from the <em>WAN Internet port<\/em> to one of the three <em>Ethernet<\/em> ports to have IPv6 work on the wired side.<\/p>\n<p>Contrary to what it says, turning\u00a0<em>Router Mode<\/em> to\u00a0<em>Off (Bridge Mode)<\/em> doesn&#8217;t actually fully bridge; the <em>WAN Internet<\/em>\u00a0port remains different from the internal ports. Specifically, the AirPort won&#8217;t service <a href=\"https:\/\/en.wikipedia.org\/wiki\/Neighbor_Discovery_Protocol\">Neighbor Discovery Protocol<\/a>\u00a0(NDP) requests on the <em>WAN Internet<\/em> port when in bridged mode. Thus when I had the switch connected to this port wired clients couldn&#8217;t get an IPv6 address, couldn&#8217;t find the router, and wouldn&#8217;t configure IPv6 stack. I suspect that when Apple addressed\u00a0<a href=\"https:\/\/web.nvd.nist.gov\/view\/vuln\/detail?vulnId=CVE-2008-2476\">CVE-2008-2476<\/a>\u00a0via <a href=\"http:\/\/support.apple.com\/kb\/ht3467\">7.4.1<\/a>\u00a0they did so by wholly blocking NDP on the <em>WAN Internet<\/em> port and didn&#8217;t take <em>Bridge Mode<\/em> into account.<\/p>\n<p>For reference, here&#8217;s the ipconfig output from a Windows 7 client on wired vs. wireless when the wired side was connected to the <em>WAN Internet<\/em> port:<\/p>\n<p><span style=\"font-family: 'courier new', courier;\">Ethernet adapter Local Area Connection:<\/span><\/p>\n<p><span style=\"font-family: 'courier new', courier;\">\u00a0 \u00a0Connection-specific DNS Suffix \u00a0. : home.nuxx.net<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\">\u00a0 \u00a0Link-local IPv6 Address . . . . . : fe80::3d96:1dd5:728c:fde3%12<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\">\u00a0 \u00a0IPv4 Address. . . . . . . . . . . : 192.168.0.162<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\">\u00a0 \u00a0Subnet Mask . . . . . . . . . . . : 255.255.255.0<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\">\u00a0 \u00a0Default Gateway . . . . . . . . . : 192.168.0.1<\/span><\/p>\n<p><span style=\"line-height: 1.5em; font-family: 'courier new', courier;\">Wireless LAN adapter Wireless Network Connection:<\/span><\/p>\n<p><span style=\"font-family: 'courier new', courier;\">\u00a0 \u00a0Connection-specific DNS Suffix \u00a0. : home.nuxx.net<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\">\u00a0 \u00a0IPv6 Address. . . . . . . . . . . : 2001:470:1f11:d43:ddca:22b9:af55:639e<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\">\u00a0 \u00a0Temporary IPv6 Address. . . . . . : 2001:470:1f11:d43:e82f:53dc:7af4:940b<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\">\u00a0 \u00a0Link-local IPv6 Address . . . . . : fe80::ddca:22b9:af55:639e%13<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\">\u00a0 \u00a0IPv4 Address. . . . . . . . . . . : 192.168.0.147<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\">\u00a0 \u00a0Subnet Mask . . . . . . . . . . . : 255.255.255.0<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\">\u00a0 \u00a0Default Gateway . . . . . . . . . : fe80::216:cbff:fec5:162f%13<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0192.168.0.1<\/span><\/p>\n<p><span style=\"line-height: 1.5em;\">This can be seen in these two network captures: <a href=\"https:\/\/nuxx.net\/files\/airport_bridged_lie_wired.pcap\">airport_bridged_lie_wired.pcap<\/a> and <a href=\"https:\/\/nuxx.net\/files\/airport_bridged_lie_wireless.pcap\">airport_bridged_lie_wireless.pcap<\/a>. These were recorded on OS X using <a href=\"http:\/\/www.tcpdump.org\/\">tcpdump<\/a> when the respective interfaces were down (either unplugged or with the internal wireless disabled), then brought up, then the capture stopped. Captures were then filtered with\u00a0<span style=\"font-family: 'courier new', courier;\">icmpv6.type == 133 || icmpv6.type == 134<\/span> to show only Router Solicitations (133) and Router Advertisement (134) then exported to these <a href=\"http:\/\/wiki.wireshark.org\/Development\/LibpcapFileFormat\">libpcap-format<\/a> files.<\/span><\/p>\n<p><span style=\"line-height: 1.5em;\">In these captures one can clearly see that the wired connection (c4:2c:03:2e:5d:cf) makes some Router Solicitation requests but doesn&#8217;t receive a reply, while the wireless connection (d8:30:62:64:f4:ff) receives a Router Advertisement reply to its Solicitation.<\/span><\/p>\n<p>After digging into all of this and initially declaring the problem to be wholly with the wired side I thought maybe there&#8217;d be a differentiation between the <em>WAN Internet<\/em> and\u00a0<em>Ethernet<\/em> ports. I then tried moving the wired connection to one of the internal \/\u00a0<em>Ethernet<\/em> ports I was able to get IPv6 NDP responses to wired clients. Thus, <em>Bridge Mode<\/em> on the AirPort Extreme isn&#8217;t quite as bridged as the selection would imply: the bridge is a lie.<\/p>\n<p>A bug (15716120)\u00a0has been submitted to Apple on this issue.<\/p>\n<p><span style=\"line-height: 1.5em;\">&#8212;<\/span><\/p>\n<p><span style=\"line-height: 1.5em;\">\u2020 With an AirPort Extreme serving as an IPv6 tunnel endpoint behind a pfSense NAT device two settings need to be changed in pfSense to get it working. First,\u00a0<\/span><em style=\"line-height: 1.5em;\">System<\/em><span style=\"line-height: 1.5em;\"> \u2192\u00a0<\/span><em style=\"line-height: 1.5em;\">Advanced<\/em><span style=\"line-height: 1.5em;\">\u00a0\u2192\u00a0<\/span><em style=\"line-height: 1.5em;\">Networking<\/em><span style=\"line-height: 1.5em;\"> and check\u00a0<\/span><em style=\"line-height: 1.5em;\">Enable IPv4 NAT encapsulation of IPv6 packets<\/em><span style=\"line-height: 1.5em;\"> and set the IPv6 router&#8217;s IP address. This is needed because it&#8217;s not possible to add a NAT forward for <\/span><a style=\"line-height: 1.5em;\" href=\"https:\/\/en.wikipedia.org\/wiki\/List_of_IP_protocol_numbers\">IP protocol 41<\/a><span style=\"line-height: 1.5em;\">. Second, add an inbound firewall rule allowing <\/span><em style=\"line-height: 1.5em;\">TCP\/IP Version IPv4<\/em><span style=\"line-height: 1.5em;\"> and\u00a0<\/span><em style=\"line-height: 1.5em;\">Protocol IPV6<\/em><span style=\"line-height: 1.5em;\">. This will allow the tunnel on the AirPort to work.<\/span><\/p>\n<p>The IPv6 tunnel is then configured as per the tunnel provider&#8217;s directions, which is well-documented elsewhere.<\/p>\n<p>I don&#8217;t like opening up all the IPv6 wireless clients on my network to direct connections from the outside, and Apple seems to have figured that others don&#8217;t want this as well. By going into the AirPort Extreme configuration in <em>AirPort Utility<\/em>, selecting\u00a0<em>Network<\/em> then\u00a0<em>Network Options&#8230;<\/em> and checking\u00a0<em>Block incoming IPv6 connections<\/em>, all inbound IPv6 connections are blocked and a\u00a0<em>Port Settings<\/em> option becomes available allowing individual ports to be unblocked.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I like having an IPv6 connection at home, but after running into some weirdness with pfSense 2.1-RELEASE\u00a0that seems correlated with having the pfSense box as&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/nuxx.net\/blog\/2013\/12\/22\/apple-airport-extreme-7-6-4-bridged-but-not-really\/\">Continue reading<span class=\"screen-reader-text\">Apple AirPort Extreme 7.6.4: Bridged, but Not Really<\/span><\/a><\/div>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[],"class_list":["post-17683","post","type-post","status-publish","format-standard","hentry","category-computers","entry"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/nuxx.net\/blog\/wp-json\/wp\/v2\/posts\/17683","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nuxx.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nuxx.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nuxx.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nuxx.net\/blog\/wp-json\/wp\/v2\/comments?post=17683"}],"version-history":[{"count":12,"href":"https:\/\/nuxx.net\/blog\/wp-json\/wp\/v2\/posts\/17683\/revisions"}],"predecessor-version":[{"id":17695,"href":"https:\/\/nuxx.net\/blog\/wp-json\/wp\/v2\/posts\/17683\/revisions\/17695"}],"wp:attachment":[{"href":"https:\/\/nuxx.net\/blog\/wp-json\/wp\/v2\/media?parent=17683"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nuxx.net\/blog\/wp-json\/wp\/v2\/categories?post=17683"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nuxx.net\/blog\/wp-json\/wp\/v2\/tags?post=17683"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}