背景
在 HDFS 使用过程中,有时会需要一个类似代理的机制,即:通过一台或多台代理服务器,来代理某一批机器的 HDFS 访问。需要注意的是,大部分情况下,代理服务器只需要代理 NameNode 流量即可,不需要代理 DataNode 流量,因为认证、鉴权等关键操作只涉及到 NameNode。
方案一: iptables 方案
linux 的 iptables 是一个非常强大的工具,在本场景下,混合使用 iptables 的 SNAT 和 DNAT 功能就可以满足需求,方案概览如下:
前提:
- 需要确保所有内部机器都能够连接到代理服务器, 且代理服务器能够连接到所有 HDFS NameNode。
- 代理服务器上不需要安装 HDFS 客户端,只需要做单纯的网络代理即可。
要点:
- 首先,在内部机器上,使用 iptables 对 HDFS NameNode 流量配置 DNAT,destination 为代理服务器。
- 其次,在代理服务器上,使用 iptables 对 HDFS NameNode 流量组合配置 DNAT + SNAT,作为路由器使用。
优点:
- 部署简单,不需要引入任何额外的软件,仅仅使用 iptables 就可以满足需求。
- iptables 实际上是操作了 linux 内核中的 netfilter 组件,netfilter 组件整体运行在内核态,效率很高。
缺点:
- 配置复杂,在每个内部机器上,都需要对所有 NameNode 配置 DNAT(如果有多个目标集群的话)。
- 同样,在代理服务器上,也需要对所有 NameNode 组合配置 DNAT + SNAT.
- 不过,iptable 配置可以通过脚本来批量完成,因此问题不大。
详细步骤
以下面这个场景为例:
- HDFS 集群为 ns1,三个 NameNode 分别为:172.16.1.1,172.16.1.2,172.16.1.3
- 代理服务器为:172.31.100.100
- 内部机器为:192.168.1.5
配置步骤
- 在内部机器 192.168.1.5 上,针对三个 NameNode 分别配置 DNAT,destination 统一为代理服务器,如果存在多个代理服务器,则可以任选一个。注意这里使用了三个中转端口(50000、50001、50002):
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A OUTPUT -d 172.16.1.1 -p tcp --dport 9000 -j DNAT --to-destination 172.31.100.100:50000
iptables -t nat -A OUTPUT -d 172.16.1.2 -p tcp --dport 9000 -j DNAT --to-destination 172.31.100.100:50001
iptables -t nat -A OUTPUT -d 172.16.1.3 -p tcp --dport 9000 -j DNAT --to-destination 172.31.100.100:50002
- 在代理服务器 172.31.100.100 上,针对三个 NameNode 组合配置 DNAT + SNAT,作为路由器使用:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --dport 50000 -j DNAT --to-destination 172.16.1.1:9000
iptables -t nat -A POSTROUTING -d 172.16.1.1 -p tcp --dport 9000 -j SNAT --to 172.31.100.100
iptables -t nat -A PREROUTING -p tcp --dport 50001 -j DNAT --to-destination 172.16.1.2:9000
iptables -t nat -A POSTROUTING -d 172.16.1.2 -p tcp --dport 9000 -j SNAT --to 172.31.100.100
iptables -t nat -A PREROUTING -p tcp --dport 50002 -j DNAT --to-destination 172.16.1.3:9000
iptables -t nat -A POSTROUTING -d 172.16.1.3 -p tcp --dport 9000 -j SNAT --to 172.31.100.100
其它
- 通过代理服务器访问 HDFS NameNode 时,NameNode 的审计日志中将无法记录准确的客户端 IP 地址,而是统一记录为代理服务器的 IP 地址。
- 可以设置多个代理服务器,此时,在内部机器的 iptables DNAT 配置中,可以选择合适的 server 作为 destination.
- iptables 支持域名,可以使用域名代替 IP,更方便一点。
- iptables 中配置中转端口的时候,一些 HDFS 的内部端口需要避开,免得混淆(比如 9000、8020 等),最好找一些不常用的端口范围来配置(例如50000-60000)。
方案二:socks5 代理软件方案
socks5 代理比 http 更加底层,效率也更高,是比 http 代理更好的选择,该方案概览如下。这种方式比较复杂,另外也涉及一些关于代理上网的敏感内容,因此不再详述。