使用ingress-nginx时后端 获取客户端真实IP

发布于:
kubernetes

我用的 ingress-nginx-controller 0.44.0

kubectl patch svc ingress-nginx-controller -n ingress-nginx -p '{"spec":{"externalTrafficPolicy":"Local"}}'

 

cat > ConfigMap.yaml << EOF
apiVersion: v1
kind: ConfigMap
metadata:
  name: ingress-nginx-controller
data:
  compute-full-forwarded-for: "true"
  # X-Forwarded-For 本来就是默认值
  forwarded-for-header: "X-Forwarded-For"
  use-forwarded-headers: "true"
EOF
kubectl apply -f ConfigMap.yaml
kubectl rollout restart deploy/ingress-nginx-controller -n ingress-nginx

IP地址与整数的互换算法[转]

发布于:
Microsoft.Net

由于常规的IP地址(IPV4),是点分十进制表示的,是由4段 0 ~255 之间的10进制数表示的。所以,很明显的可以得出 IP地址实际上是一个32位正整数 。在C#中,uint的取值范围是 0 ~ 4,294,967,295,所以,可以完全胜任了。

但是,由于数据库中的数据类型和C#的数据类型的对应关系,有所差异,如果要考虑到存储到数据库中,那么需要考虑使用bigint的方式(特指SQL SERVER),对应于C#中,我们使用long类型。

/// <summary>
/// 将IP地址转为数值形式
/// </summary>
/// <returns>长整数</returns>
public static long ToDigit(IPAddress ip)
{
    int x = 3;
    long l = 0;
    foreach (byte b in ip.GetAddressBytes())
    {
        l += (long)b << 8 * x--;
    }
    return l;
}

/// <summary>
/// 将数值转换为IP地址
/// </summary>
/// <returns>IP地址</returns>
public static IPAddress ToIP(long l)
{
    var bt = new byte[4];
    for (int i = 0; i < 4; i++)
    {
        bt[3 - i] = (byte)(l >> 8 * i);
    }
    return new IPAddress(bt);
}