打开不安全端口的问题
注意:这是一个普遍的问题,并不局限于 Hadoop。
当前开放端口的解决方案不是一个好主意,因为 Hadoop 状态页面是通过 HTTP(不是 HTTPS)提供的,这意味着它们以纯文本形式提供,因此,互联网上的任何人也可以访问您的实例并查看或控制您的 Hadoop 作业或集群或它们包含的数据。
解决方案备选方案
相反,您应该通过加密通道(HTTPS/SSL 或使用 SSH 隧道)发送所有流量,并通过该通道发送您的浏览器流量。
据我所知,Hadoop 目前不提供 HTTPS,因此您可以创建一个 SSH 隧道并通过该安全隧道进行浏览。
此解决方案的好处是:
- 它是安全的:您的浏览器和虚拟机实例之间的所有通信都是通过您的 SSH 连接进行的,因此即使连接使用的是 HTTP 而不是 HTTPS,它对外部用户仍然是安全的
- 您可以连接到主机名(即直接连接您的 VM 名称),就好像它们在您的本地网络上一样,例如,
http://my-host:5392
- 您可以连接到任何主机上的任何端口,而无需单独打开每个端口
安全连接到 GCE 虚拟机的完整指南
请参阅“Securely Connecting to VM Instances”指南了解以下 SOCKS 代理指南之外的更多详细信息,包括防火墙、HTTPS 和 SSL、SSH 端口转发、SSH SOCKS 代理、堡垒主机、VPN、NAT 等。
通过 SSH 隧道 + SOCKS 代理安全连接
这样做的方法是设置一个SOCKS proxy,它将使用 SSH 隧道来保护您与 GCE 上的 Hadoop 集群的通信。您可以使用full script 或创建您自己的,如下所示:
#!/bin/bash
# Modify these variables to match your deployment.
export PROJECT="curious-lemming-42" # Google Cloud Platform Project
export ZONE="us-central-1" # zone of Hadoop cluster
export PORT="9000" # port on local machine to run proxy;
# just choose an open port
export SERVER="my-instance" # any VM instance in the cluster
# This command starts the SOCKS proxy on $PORT.
gcloud compute ssh \
--project="${PROJECT}" \
--zone="${ZONE}" \
--ssh-flag="-D" \
--ssh-flag="${PORT}" \
--ssh-flag="-N" \
"${SERVER}"
在您的本地机器(不是 GCE 虚拟机)上打开一个新终端并在那里运行此脚本。当此脚本运行时,您将通过 SSH 为您的 Hadoop 集群设置一个安全代理。
然后,假设您使用的是 Google Chrome,您也可以在本地机器上(而不是在 GCE 虚拟机上)使用此脚本来安全地连接到您的 Hadoop 集群:
#!/bin/bash
# This port must match the port in the other script above.
declare -r PORT="9000"
# Create a directory for the proxy profile to separate it from the others.
# You can change this directory if you wish.
declare -r CHROME_PROXY_PROFILE="${HOME}/chrome-proxy-profile"
if ! [ -d "${CHROME_PROXY_PROFILE}" ]; then
mkdir -p "${CHROME_PROXY_PROFILE}"
fi
# Run a new instance of Chrome using the custom proxy profile.
declare -r OS_NAME="$(uname -s)"
if [[ "${OS_NAME}" == "Linux" ]]; then
/usr/bin/google-chrome \
--user-data-dir="${CHROME_PROXY_PROFILE}" \
--proxy-server="socks5://localhost:${PORT}"
elif [[ "${OS_NAME}" == "Darwin" ]]; then
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
--user-data-dir="${CHROME_PROXY_PROFILE}" \
--proxy-server="socks5://localhost:${PORT}"
else
echo "Unrecognized OS: ${OS_NAME}" >&2
exit 1
fi
如果您想设置 Firefox,请参阅 these directions,此时无法编写脚本。
有关其运作方式和原因的背景和详细信息
您可以从以下来源阅读更多关于 SSH 隧道、它是什么以及它如何工作的信息: