------> 課程視頻同步分享在今日頭條和B站
大家好,我是博哥愛(ài)運(yùn)維。
這節(jié)課帶大家探索并分享最全面的解決在使用Kubernetes(K8s)和Ingress-Nginx-Controller中無(wú)法獲取客戶(hù)端真實(shí)IP問(wèn)題的視頻教程,幫助你快速理解并解決這一問(wèn)題。
如果我們按下面網(wǎng)絡(luò)架構(gòu)圖,暴露我們服務(wù)到公網(wǎng)上提供訪問(wèn),那么此時(shí)我們后端的業(yè)務(wù)服務(wù)POD獲取真實(shí)IP是沒(méi)什么問(wèn)題的,但種形式的網(wǎng)絡(luò)架構(gòu)直接暴露出我們?cè)凑镜墓W(wǎng)IP信息到互聯(lián)網(wǎng)上,無(wú)疑于是在公網(wǎng)上裸奔,一旦遭受攻擊,對(duì)我們的業(yè)務(wù)服務(wù)將是毀滅性的打擊。
那么我們會(huì)去尋求一些大型提供公網(wǎng)網(wǎng)絡(luò)防護(hù)的企業(yè)的幫助,購(gòu)買(mǎi)他們的安全服務(wù),如動(dòng)態(tài)加速線(xiàn)路、WAF、或者高防線(xiàn)路,這個(gè)時(shí)候,我們的業(yè)務(wù)在公網(wǎng)上提供由于可以相對(duì)更安全了,但此時(shí)會(huì)帶來(lái)另外一個(gè)問(wèn)題,就是我們后端服務(wù)獲取的客戶(hù)端IP,都是安全服務(wù)提供商的代理IP了。
那么我們?cè)趺唇鉀Q這個(gè)問(wèn)題,獲取到真實(shí)CLIENT客戶(hù)端的IP地址呢,在ingress-nginx控制器上配置其實(shí)也不難,加入下面三行配置即可解決:
# kubectl -n kube-system edit configmaps nginx-configuration
apiVersion: v1
data:
......
compute-full-forwarded-for: "true"
forwarded-for-header: "X-Forwarded-For"
use-forwarded-headers: "true"
我們來(lái)看看這三行配置的詳細(xì)含義:
compute-full-forwarded-for
: 將 remote address 附加到 X-Forwarded-For Header而不是替換它。當(dāng)啟用此選項(xiàng)后端應(yīng)用程序負(fù)責(zé)根據(jù)自己的受信任代理列表排除并提取客戶(hù)端 IP。
forwarded-for-header
: 設(shè)置用于標(biāo)識(shí)客戶(hù)端的原始 IP 地址的 Header 字段。默認(rèn)值X-Forwarded-For
,此處由于A10帶入的是自定義記錄IP的Header,所以此處填入是X_FORWARDED_FOR
use-forwarded-headers
: 如果設(shè)置為T(mén)rue時(shí),則將設(shè)定的X-Forwarded-*
Header傳遞給后端, 當(dāng)Ingress在L7 代理/負(fù)載均衡器
之后使用此選項(xiàng)。如果設(shè)置為 false 時(shí),則會(huì)忽略傳入的X-Forwarded-*
Header, 當(dāng) Ingress 直接暴露在互聯(lián)網(wǎng)或者 L3/數(shù)據(jù)包的負(fù)載均衡器后面,并且不會(huì)更改數(shù)據(jù)包中的源 IP請(qǐng)使用此選項(xiàng)。
OK,到這里,大家是不是以為萬(wàn)事大吉了,NONONO,這個(gè)時(shí)候,其實(shí)還存在一個(gè)安全隱患是我們必須要提前知道的。
我們先來(lái)準(zhǔn)備部署一個(gè)測(cè)試服務(wù),用來(lái)模擬后端服務(wù)POD,并且能獲取ingress-nginx傳回來(lái)的請(qǐng)求頭部信息打印出來(lái),以便我們更直觀的觀察測(cè)試的詳細(xì)情況
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: whoami
namespace: default
labels:
app: whoami
spec:
replicas: 1
selector:
matchLabels:
app: whoami
template:
metadata:
labels:
app: whoami
spec:
containers:
- image: traefik/whoami:v1.10
imagePullPolicy: Always
name: whoami
ports:
- containerPort: 80
name: 80tcp02
protocol: TCP
dnsPolicy: ClusterFirst
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
labels:
app: whoami
name: whoami
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: whoami
sessionAffinity: None
type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
nginx.ingress.kubernetes.io/whitelist-source-range: 10.0.1.201/32 # 只允許信任IP訪問(wèn),其他返回403
nginx.ingress.kubernetes.io/configuration-snippet: | # 加入自定義頭部,保存remote_addr信息
proxy_set_header X-Custom-Real-IP $remote_addr;
name: whoami
spec:
rules:
- host: whoami.boge.com
http:
paths:
- backend:
service:
name: whoami
port:
number: 80
path: /
pathType: ImplementationSpecific
tls:
- hosts:
- whoami.boge.com
secretName: boge-com-tls
上面可以看到,我們對(duì)于whoami加入了訪問(wèn)限制,只允許出口IP為10.0.1.201這個(gè)地址來(lái)訪問(wèn),其他全部拒絕返回403
curl -H "Host: whoami.boge.com" -s http://10.0.1.201
在201這臺(tái)節(jié)點(diǎn)上請(qǐng)求是正常的
root@node-1:~# curl -H "Host: whoami.boge.com" -s http://10.0.1.201
Hostname: whoami-6cf6989d4c-7hrxz
IP: 127.0.0.1
IP: ::1
IP: 172.20.217.124
IP: fe80::383a:48ff:fe1e:e1e5
RemoteAddr: 172.20.84.128:5110
GET / HTTP/1.1
Host: whoami.boge.com
User-Agent: curl/7.81.0
Accept: */*
X-Custom-Real-Ip: 10.0.1.201
X-Forwarded-For: 10.0.1.201
X-Forwarded-Host: whoami.boge.com
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Scheme: http
X-Real-Ip: 10.0.1.201
X-Request-Id: 5b90653f94b45c1fa20ab038ff294534
X-Scheme: http
我們來(lái)到202這臺(tái)節(jié)點(diǎn)請(qǐng)求看看,正常是會(huì)返回403拒絕請(qǐng)求的
root@node-2:~# curl -H "Host: whoami.boge.com" -s http://10.0.1.201
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx</center>
</body>
</html>
但這個(gè)時(shí)候,我們?cè)谡?qǐng)求頭部傳入偽造的XFF信息,再看結(jié)果呢
curl -H "X-Forwarded-For: 10.0.1.201" " -H "Host: whoami.boge.com" -s http://10.0.1.201
這里我們可以看到我們通過(guò)偽造XFF,成功繞過(guò)了服務(wù)的安全訪問(wèn)限制。
root@node-2:~# curl -H "X-Forwarded-For: 10.0.1.201" -H "boge: test" -H "Host: whoami.boge.com" -s http://10.0.1.201
Hostname: whoami-6cf6989d4c-7hrxz
IP: 127.0.0.1
IP: ::1
IP: 172.20.217.124
IP: fe80::383a:48ff:fe1e:e1e5
RemoteAddr: 172.20.84.128:5110
GET / HTTP/1.1
Host: whoami.boge.com
User-Agent: curl/7.81.0
Accept: */*
Boge: test
X-Custom-Real-Ip: 10.0.1.201
X-Forwarded-For: 10.0.1.201, 10.0.1.202
X-Forwarded-Host: whoami.boge.com
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Scheme: http
X-Original-Forwarded-For: 10.0.1.201
X-Real-Ip: 10.0.1.201
X-Request-Id: 81ce680afd34390c7936b72ac0e5c105
X-Scheme: http
解決這個(gè)也不復(fù)雜,就是我們就對(duì)請(qǐng)求到ingress-nginx控制器的來(lái)源IP作信任加白處理,只允許信任的IP段傳來(lái)的XFF等信息。
但要注意的是,對(duì)于提供安全的廠商來(lái)說(shuō),他們的出口IP信息會(huì)經(jīng)常變化的,意味著一旦變化,那么獲取客戶(hù)端真實(shí)IP又會(huì)存在問(wèn)題。我們?cè)诩舆@個(gè)信任配置的時(shí)候,需要根據(jù)實(shí)際情況來(lái)作考量要不要添加,其實(shí)只要我們不暴露限制的IP信息,通常情況下還是相對(duì)安全的文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-771181.html
proxy-real-ip-cidr: 10.0.1.201/32,10.0.1.203/32
加了信任IP配置后,再請(qǐng)求就沒(méi)有安全問(wèn)題了文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-771181.html
root@node-2:~# curl -H "X-Forwarded-For: 10.0.1.201" -H "boge: test" -H "Host: whoami.boge.com" -s http://10.0.1.201
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx</center>
</body>
</html>
到了這里,關(guān)于第13關(guān) 解決K8s中Ingress Nginx控制器無(wú)法獲取真實(shí)客戶(hù)端IP的問(wèn)題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!