记一次golang服务外网无法访问的问题
TCP6导致的外网无法访问
golang 代码如下:
golang
package main
import (
"io"
"log"
"net/http"
"time"
)
func HelloServer(w http.ResponseWriter, req *http.Request) {
io.WriteString(w, time.Now().String())
}
func main() {
http.HandleFunc("/", HelloServer)
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}发现 用域名访问信息 https://xxxx:8080 无法显示
发现 用ip访问信息 {ip}:8080 无法显示
使用 netstat -antlp 之后发现 仅仅开了tcp6的端口而没有tcp的端口, 因此猜测是tcp6 导致的

解决方案1 修改tcp6为tcp4
参考, 修改代码如下:
golang
package main
import (
"io"
"log"
"net"
"net/http"
"time"
)
func HelloServer(w http.ResponseWriter, req *http.Request) {
io.WriteString(w, time.Now().String())
}
func main() {
http.HandleFunc("/", HelloServer)
l, err := net.Listen("tcp4", ":8080")
err = http.Serve(l, nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}就可发现 tcp6的端口而没有tcp的端口(ps: 修改为 tcp 没有效果)
解决方案2 centos设置tcp4转发tcp6
上面的办法不是很好, 正确的方式应该是 开启ipv4端口转发
临时设置(重启网卡或服务器后会丢失配置)
- 检查是否开启ipv4端口转发
sysctl net.ipv4.ip_forward- 若指令返回结果为net.ipv4.ip_forward = 0,执行如下指令
echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl -w net.ipv4.ip_forward=1永久设置
修改/etc/sysctl.conf文件
添加或修改:
sh
net.ipv4.ip_forward=1加载配置
sh
sysctl -p /etc/sysctl.conf检查
完成后通过netstat -antlpu 仍旧显示只有tcp6,但是此时通过ipv4地址是可以访问了。
cloudflare 导致的https 无法访问的问题
但是 https 是无法访问的, 原因是 经过了cloudflare的CDN
只允许80 443 过 https, 不用cloudflare做ssl, 或者不用https 即可