给Apache增加x-forwarded-for支持

细心的读者可能发现了,本站是建立在K8S之上,并使用了CloudFlare CDN进行加速。而且这个博客是我build的第一个Project,所以相关的Yaml文件写的也是很low。

昨天在Trace log的时候发现,Wordpress 默认的docker image居然没有增加X-forward-for support,也就是说,我根本无法通过log确认哪个IP访问过我的网站。log里记录但所有CIP都是我的Ingress IP。

由于docke hub上并没有提供比较直接的获取真实客户IP地址方案(比如提供一个环境变量作为开关),故想使用比较传统的启动remoteip 模块然后修改logFormat字段的方案。毕竟这个方案其实是最常用的方案。

在apache2.conf中或虚拟主机的配置文件中添加以下内容:

<IfModule remoteip_module> RemoteIPHeader CF-Connecting-IP RemoteIPInternalProxy 127.0.0.1/24 </IfModule> 

修改apache access log格式(在/etc/apache2/site-enable/*.conf中添加或修改)

LogFormat "%{CF-Connecting-IP}i %l %u %t "%r" %>s %O "%{Referer}i" "%{User-Agent}i"" proxied CustomLog ${APACHE_LOG_DIR}/access-example.com.log proxied

参考链接:https://www.centos.bz/2017/07/apache-get-real-client-ip/ 中的方案一

但是这样存在三个问题:
1. 需要修改两个配置文件,其中包括Wordpress docker image中自带的apache主配置文件,然而主配置文件我希望尽可能不要去动,毕竟我希望Wordpress docker image能随着docker生命周期的结束而自动更新。而强制指定apache的配置文件可能会导致在某些极端情况下无法apache运行失败。
2. 从k8s和docker的ops思想出发,docker image里的内容应该是一个black box,ops尽可能少的去干预,black box的可用性由owner去管(wordpress)就好了,我们只需要对实际的线上环境进行适配就好了
3. 正如前文所说,我的Yaml写的比较早,把所有的资源配置都写在了同一个Yaml文件里,包括Deployment, Secret, PV, PVC, Service…如果只是增加了一个ConfigMap,也许还好,如果增加的内容过多(一整个Apache主配置文件),这个Yaml就更没法看了,虽然可以单独写一个Yaml文件或者将所有的内容都拆分成多个Yaml,但是考虑到这需要一些时间成本,且优先级很低,所以还是决定先往后放一放。

通过在网上搜索,发现了https://www.centos.bz/2017/07/apache-get-real-client-ip/
可以说,这个方法是大学时学Linux系统管理时,教材里从没有讲过的Apache配置方法:

直接在/etc/apache2/site-enable/下创建一个新的realip.conf文件就可以解决这个问题。

<IfModule remoteip_module>
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 127.0.0.1/24
#CloudFlare IP Ranges
RemoteIPInternalProxy 103.21.244.0/22
RemoteIPInternalProxy 103.22.200.0/22
RemoteIPInternalProxy 103.31.4.0/22
RemoteIPInternalProxy 104.16.0.0/12
RemoteIPInternalProxy 108.162.192.0/18
RemoteIPInternalProxy 131.0.72.0/22
RemoteIPInternalProxy 141.101.64.0/18
RemoteIPInternalProxy 162.158.0.0/15
RemoteIPInternalProxy 172.64.0.0/13
RemoteIPInternalProxy 173.245.48.0/20
RemoteIPInternalProxy 188.114.96.0/20
RemoteIPInternalProxy 190.93.240.0/20
RemoteIPInternalProxy 197.234.240.0/22
RemoteIPInternalProxy 198.41.128.0/17
</IfModule>

应用到K8S上,其实更简单:
1. 先创建一个ConfigMap文件:

2. 在之前的WordPress deployment 配置文件中增加新的volume:

3. 在之前的WordPress deployment 配置文件中增加新的volumeMount:

然后要做的就是使用kubectl apply以下这个Yaml文件,最后再次查看日志,就可以看到这所有的CIP都变成真实的访问IP了。

此条目发表在httpd, Kubernetes, Platform, WebServer分类目录,贴了, , , , , , , , 标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用*标注