事情的起因是发现halo后台系统的自动备份功能,一直同步数据失败,提示数据存储服务不可用,接入的是阿里云的OSS,之前还好好的,突然最近不能用。
通过查看存储策略,进行对象存储验证时,发现对象存储访问时,突然出现Received a ConnectTimeoutException, please check if the endpoint is entered correctly, and make sure your object storage service is working properly.
的问题。
Halo是基于K8S使用的Containerd进行容器化部署的,我们进入到容器使用AWS S3的本地客户端去连接阿里云OSS,发现确实是一直超时。
# 安装awscli命令行客户端
apt install awscli
# 配置aws
aws configure
# 访问阿里云服务
aws s3 ls --endpoint-url https://oss-cn-beijing.aliyuncs.com
通过ping和curl命令,都能正常返回数据包,看着DNS层面是没什么问题的。
ping oss-cn-beijing.aliyuncs.com
curl oss-cn-beijing.aliyuncs.com
curl http没问题
curl http://oss-cn-beijing.aliyuncs.com
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>AccessDenied</Code>
<Message>Anonymous access is forbidden for this operation.</Message>
<RequestId>677169F86290B23336D6B0A9</RequestId>
<HostId>oss-cn-beijing.aliyuncs.com</HostId>
<EC>0003-00001201</EC>
<RecommendDoc>https://api.aliyun.com/troubleshoot?q=0003-00001201</RecommendDoc>
</Error>
curl https时有问题,直接超时,HTTP访问没问题,HTTPS访问有问题。
curl https://oss-cn-beijing.aliyuncs.com
使用telnet连接阿里云OSS的域名发现443端口不通:
# telnet oss-cn-beijing.aliyuncs.com 443
Trying 59.110.190.79...
尝试http协议的方式去连接,能正常连接。
# aws s3 ls --endpoint-url http://oss-cn-beijing.aliyuncs.com
2021-08-05 21:54:04 aaa
2024-11-21 04:43:24 bbb
所以是HTTPS的问题?为什么是这样的问题?
试了一下HTTPS访问baidu.com,也一样超时,HTTP访问是能正常访问的。
# curl https://www.baidu.com
^C
# curl http:///www.baidu.com
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn"></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>©2017 Baidu <a href=http://www.baidu.com/duty/>使用百度前必读</a> <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a> 京ICP证030173号 <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>
怀疑是不是halo这个容器的问题,切换到这个K8S集群下的其他namespace下的容器也一样,无法访问外部的HTTPS。
对于HTTPS的443端口,突然想到,是不是前两天加了一条iptables规则,为了访问K8S集群不用加端口号,我们尝试让443端口重定向到30777端口,导致出现的问题。
iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 30777
尝试删除之前添加的iptables规则后,发现确实已经恢复。
iptables -t nat -D PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 30777
使用curl命令请求,使用https的方式去访问baidu均正常。
/etc/nginx $ curl https://www.baidu.com
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=https://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');
</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>©2017 Baidu <a href=http://www.baidu.com/duty/>使用百度前必读</a> <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a> 京ICP证030173号 <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>
使用aws s3客户端连接阿里云OSS,发现也能正常访问。
# aws s3 ls --endpoint-url http://oss-cn-beijing.aliyuncs.com
2021-08-05 21:54:04 aaa
2024-11-21 04:43:24 bbb
解决方式:可以指定ip/网卡的流量进行添加规则,不应该不指定-d和-i参数添加规则,因为会影响到其他的网卡端口。
# 指定访问的目标ip
iptables -t nat -A PREROUTING -p tcp -d 10.0.0.166 --dport 443 -j REDIRECT --to-port 30777
# 指定网卡
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 443 -j REDIRECT --to-port 30777