大概几个星期前,在把YYeTs Bot迁移到香港时,发现在容器里竟然无法访问外部网络。
由于之前看到有报道称香港的某些ISP对某域名进行了污染,因此此时就立刻想到了,是不是aws的上游也对 api.telegram.org 进行了污染?
容器里没法curl
。apk update
了一下,发现竟然无法update,难道是alpine挂了吗?Ubuntu也是,这俩一起炸?概率太低了吧。新加坡的那台机器也是同样的问题,但是日本就没问题。同样都在亚洲,大家有什么差别吗?难道是整个东南亚的海底光缆全炸了?可是没见到有人说东南亚的机房炸了啊,况且就算炸了,那也应该会找别的路由出去啊,就算丢包也不会直接炸光啊。
就算你是柯蒂斯·李梅,手里有着一百架B-2轰炸机,也不能炸的这么彻底啊。
试了一下,宿主机能够访问啊,那就是没问题的。一定是某些配置不对。重新安装了docker engine,结果也还一样,香港和新加坡的机器就是不好用,但是日本可用。
搜了一下,可能是没开ipv4.forward
?但是我一般是开启这个的呀,而且我开了啊……
后来在网上翻到这样一篇文章,《Docker容器无法连接外部网络原因排查》,了解到bridge网络docker是通过iptables转发流量的。
此时,我突然意识到,我的这两台服务器似乎都设置了大量的本地端口转发,恰巧也覆盖了80和443这两个端口……把这个规则删掉,重启docker engine。好的,村通网了。
罪魁祸首的这条命令
iptables -t nat -A PREROUTING -p tcp --dport 23:1000 -j REDIRECT --to-ports 16698
事实证明,是我的想象力太丰富了。来一拳就好了。