How to Bypass Chromecast's Hardcoded DNS (and Access Netflix US in Canada)
Google released the Chromecast last year, but it was only made available to Canadian users last week. As soon as it hit the Play Store and Amazon, I purchased one. I already own a Roku 3, but for $39, Chromecast is a steal.
I love watching movies and TV series on Netflix, but I find the selection on the Canadian version of Netflix to be not as good as the one south of the border. This is why I use Unblock-Us.com. For $5 a month, I get access to various Netflix (and other streaming services) regions. For ease of use, I set their DNS directly on my router. This way, all the devices that connect to my network, have access to this "unblocked" content.
When I got back from work and discovered my newly delivered Chromecast, I was really excited to try it out. The setup was quick and easy, and within minutes, I was browsing my Netflix queue on my phone and casting it to my TV. But... When I tried casting US-only movies or series to the Chromecast, it wouldn't work.
After googling and searching Reddit, I found out the Chromecast has hardcoded DNS settings. It uses Google's DNS, and bypasses the Unblock-Us DNS settings from my router. After a bit more search, I found a few solutions to get access to my beloved Netflix US content.
EDIT: With a recent update, the Roku 3 Netflix app started using the same hardcoded DNS as the Chromecast. You can use the same steps described below to circumvent this problem.
If you own a DD-WRT-compatible router (or can send commands to your router), you're in luck! As I found on XDA, you only need two lines of code to fix the problem.
If you're like me and don't have a DD-WRT router (I have a D-Link DIR-645), another fix is possible. Log in to your router to set a static route. Now, redirect all of Google's DNS traffic to your own router. The Chromecast won't be able to resolve Google's DNS and will fallback on your router's default DNS. For a detailed guide, you can check this article from Unblock-Us' Technical Guide. It's for the PS3, but Method Two uses the same "exploit" for Chromecast.
Go to advanced routing or find where you can setup a static route.
Create a new route called Chromecast1.
Subnet Mask: 255.255.255.255 or 255.255.255.252
Gateway: Any valid local IP other than the router itself.
Interface: LAN & Wireless
Repeat steps 3 to 7 for the IPs of 8.8.4.4, 208.67.222.222 and 209.244.0.3.
You might also want to add you ISP's DNS servers to the list, just in case... (This info should be easily found with a little Google search)
Another problem arises...
As I found out when trying to solve my problem, the D-Link DIR-645 does not offer a static route option for LAN. It was available for previous firmwares, but not in the updated one.
To get access to the LAN option, you'll have to right-click on the WAN option at the right, and click Inspect Element.
Then, right click in the source code and Edit HTML. Add a new option to the dropdown menu. The option value is "LAN-1". You can copy-paste the following line as seen in the screenshot below.
<option value="LAN-1">LAN</option>
Make sure LAN is selected and that your four new static routes are checked. Now, hit Save settings. To make sure everything works fine, open up cmd (Windows) or Terminal (Mac) and type:
If you can't get a ping from 8.8.8.8 (Google's DNS), you're fine and you now have access to all your region-restricted content!
Head to Chromecast's subreddit on Reddit or check XDA threads, they might be able to give you the help you need.
UPDATE 2014/11/18: Even after Chromecast firmware updates, this solution still works for me.
I noticed that when I'm trying to cast Netflix, I sometimes get an error message saying the content is not available in my country. Pressing the Cast button on your phone before pressing play seems to prevent this.
UPDATE 2015/01/04: Netflix seems to start blocking VPNs (virtual private networks) for users who bypass region locks. So far, DNS services like Unblock-Us don't seem to be blocked (and should be harder to block than VPNs).