F5 源地址转换模式 后端server查看client地址的三种方式

背景:解决SNAT带来的地址审计问题


一. 基于http协议的解决方案

​实现方式:在http头部插入源地址。

在新建http profile并开启Insert X-Forward-For功能,其余选项保持不变。再在vs里调用该http profile。

抓包如下所示,可以看到在http头部 X-Forward-For字段插入了客户端源地址。

snat_1.png

注意:要求经过F5的流量是明文的,密文的需要解密。

二、基于tcp协议解决方案

​实现方式,在tcp option 中插入源地址。

1、tcp option简介

  • 常见option

snat_5.png

  • 字段格式

snat_2.png

(1)EOL和NOP Option(Kind 0、Kind 1)只占1 Byte,没有Length和Value字段;

(2)NOP用于 将TCP Header的长度补齐至32bit的倍数(由于Header Length字段以32bit为单位,因此TCP Header的长度一定是32bit的倍数);

(3)SACK-Premitted Option占2 Byte,没有Value字段;

(4)其余Option都以1 Byte的“Kind”开头,指明Option的类型;Length指明Option的总长度(包括Kind和Length)

(5)对于收到“不能理解”的Option,TCP会无视掉,并不影响该TCP Segment的其它内容;

2、在F5上进行tcp option插入操作

(1)命令行创建tcp profile,通过在tcp选项28中嵌入版本号(一个字节)和IPv4地址(四个字节)作为覆盖路径功能的一部分来支持客户端IP可见性。

格式:
create ltm profile tcp PROFILE_NAME tcp-options "{option } {option}" 
   
示例:
tmsh create ltm profile tcp tcp_opt tcp-options "{28 first}"
   
解释: 
第一个 option 填写 2 到 255(含)之间的数字,表示要收集的 TCP 选项类型.
第二个 option 填写 first | last 指示系统是保留指定选项种类的第一个实例,还是最后的实例。  

(2)创建irule

when SERVER_CONNECTED {
scan [IP::client_addr] {%d.%d.%d.%d} a b c d
TCP::option set 28 [binary format cccc $a $b $c $d] all
}

(3)在vs中调用http profile和irule。

(4)抓包测试如下所示,当建立完握手之后,snat地址与后台建立连接时会在tcp option中携带客户端IP地址(这是16进制的字符,转换为10进制便是客户端真实地址)。

snat_3.png

三、通过syslog进行源地址审计的方案

实现方式:通过syslog发送客户端信息到syslog服务器实现对源地址审计,适用于TCP,UDP。

1、创建日志pool

此处步骤省略

2、配置irule

when CLIENT_ACCEPTED {
    set hsl [HSL::open -proto UDP -pool POOL_log]
}
when SERVER_CONNECTED {
    HSL::send $hsl "client { [IP::client_addr]:[TCP::client_port] -> [clientside {IP::local_addr}]:[clientside {TCP::local_port}] } server {[IP::local_addr]:[TCP::local_port] -> [IP::server_addr]:[TCP::server_port]} \n" 
}

3.抓包测试,通过抓包可以发现F5把客户端信息发给了syslog服务器。

snat_4.png

打赏
文章目录