家里換了一個光貓, 故重新配置了下端口映射, 但發(fā)現不再那么順利.
和往常一樣, 在打電信電話申請了公網IP 并且 給路由器添加了 端口轉發(fā)之后, 本以為大功告成, 可發(fā)現了一個奇怪的現象. 如下圖

用關鍵字"內網無法通過外網Ip訪問內網" Google, 發(fā)現以下文章:
得知這是IP協議本身的限制, 需要支持 NAT loopback的設備才能支持這種情況的訪問.
可光貓不支持呀, 刷固件啥的我怕弄壞了, 故另想辦法.
搜出來的文章有使用iptables解決此問題的, 但我測試之后沒生效, 由于我不熟悉iptables, 所以無法深入研究了.
如果我們無法解決"通過外網訪問不了"的問題, 那就只有讓域名指向內網IP了.
故問題變?yōu)榱?
如何在內網中將域名解析為內網IP
方案1. 修改hosts文件
最簡單的方案是在你的電腦上配置hosts文件
vim /etc/hosts
添加如下代碼
192.168.31.2 yourdomain.com
現在 在你的電腦上就可以訪問yourdomain.com了.
但如果你的電腦上有Docker, 在Docker容器中, 這個方案行不通.
我的服務器上有Docker和Drone, 所以進化出了方案2
方案2. 在你的路由器上添加hosts + 配置Docker + 修改drone.yaml.
得看你的路由器支不支持配置hosts, 我用的小米路由器, 幸好小米正好支持, 讓我少一點折騰, 使用小米WIFI 安卓APP即可完成設置.

現在, 所有內網ping yourdomain.com的時候便是內網IP, 訪問它當然不成問題.
不過別高興太早, 在Docker中依然行不通.
好在解決這個問題不難: 我們需要配置Docker的DNS服務器為路由器.
搜索 "Docker 配置 DNS" 并結合官方文檔"https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file".
配置如下:
? ~ cat /etc/docker/daemon.json
{
... // other config
"dns": ["192.168.31.1"] // 192.168.31.1 為路由器地址
}
接下來重啟docker
sudo service docker restart
等待docker啟動, 然后在docker容器中ping yourdomain.com就是內網地址了.
不過不過, 如果你正在使用Drone做CI, 你會發(fā)現Drone在構建過程中啟動的docker容器依然無法訪問yourdomain.com, 可以使用docker exec -it ID sh進入容器命令行, ping yourdomain.com得到的卻是外網地址.
搜索"drone dns"能找到這個Issue: DNS should default to local Docker host settings #193
查閱發(fā)現docker-in-docker模式中, DNS配置不會繼承父容器配置, 所以就沒使用到192.168.31.1作為DNS服務器.
解決方案也在上面的Issue中, 作者提到了可以使用network_mode: bridge來達到目的.
如下:
steps:
- name: test
image: golang
commands:
- go build
- go test
network_mode: bridge
將network_mode: bridge添加到需要訪問yourdomain.com的每一步, 至此, 問題解決.