我在 Azure 上有一个正在运行的 VM 实例,具有静态 IP。我需要知道有什么简单的方法可以让我托管在 Raspberry Pi 上的网站可供任何人来自 Azure VM 的静态 IP 而不是我的家庭 IP 地址?
即,我通常在线提供网站服务的方式是使用 Nginx 反向代理指向具有指向我家庭 IP 地址的 A 记录的域。我如何才能将虚拟机的 IP 地址用作我域的 DNS 区域中的 A 记录,并以某种方式从我的家庭 IP 地址获取连接?
答案1
视情况而定:
假设家庭 IP 为 1.1.1.1,Azure IP 为 2.2.2.2
家庭 IP 是完全全局 IP 并且家庭 IP 是静态的 → 然后创建两个记录
azure.domain.com A 2.2.2.2
并home.domain.com A 1.1.1.1
添加重定向规则(azure.domain.com → home.domain.com
)到 Nginx※ 注意:如果您能够在 Raspberry PI 上部署所有页面和服务,那么您实际上根本不需要 Azure 托管。只需
home.domain.com
直接发布和共享 URL。如果某些服务应该使用 Azure 托管,您需要使用我之前提到的重定向或 Nginx 的反向代理功能(它能够直接使用 IP 地址作为代理端点,因此您不需要注册域名1.1.1.1
)Home IP 是一个完全全局的 IP,Home IP 是动态的 → 并不完美……Azure 服务器必须知道每次 Home 全局 IP 的更改。以下是几个可能的解决方案:
- 在主端创建脚本并将其添加到 cron 任务。这将获取自己的全局 IP 并
home.domain.com
在每次 IP 更改时更新记录。您也可以使用动态域名系统服务用于这些目的(如果路由器支持此功能,DynDNS 是最简单的解决方案)。在这种情况下,home.domain.com
通常可以全局访问(除非 IP 已更改但域记录仍未更新或旧值缓存在客户端)。 - 在主端创建脚本并将其添加到 cron 任务。这将获取自己的全局 IP 并更新 Azure Nginx 的反向代理 IP。在这种情况下,您只能使用原始全局 IP 地址而无需设置
home.domain.com
。此外,这种方式还可以避免域记录更新时间滞后。 - 在 Azure 端创建 VPN 服务器,并通过 VPN 内网传递反向代理连接。不要忘记在 Home 的 ISP 会话更新时自动重新连接 VPN。
- 在主端创建脚本并将其添加到 cron 任务。这将获取自己的全局 IP 并
家庭 IP 是 ISP NAT 后面的一个不太全局的 IP,并且家庭 IP 可能是动态的 → 休斯顿,我们遇到了一个问题……即使 Azure 服务器知道当前的家庭 IP 地址,也无法从外部连接到它。您必须从内部(家庭的 Raspberry PI)启动到外部(Azure 服务器)的连接。例如,您可以使用从 Raspberry PI 启动的 SSH 隧道来实现这些目的。但更简单的方法是 VPN 连接,正如我在 2.3 中描述的
如果你打算使用第一种场景的反向代理方式,Nginx 的配置应该是这样的:
# set home server global IP
upstream home_server{
server 1.1.1.1:80;
}
server {
listen 80;
server_name azure.domain.com;
# set proxy endpoint (home server)
# all azure.domain.com/home* urls will be redirected to home server
location ~* ^/home {
proxy_pass http://home_server;
proxy_intercept_errors on;
proxy_connect_timeout 3600;
proxy_send_timeout 3600;
proxy_read_timeout 3600;
proxy_pass_request_headers on;
}
}
添加:
回答
我想指向 Azure IP,因为我不希望我的网站 IP 地址与我的大致位置相关联
Nginx 反向代理将有助于隐藏实际 IP。azure.domain.com
客户端只能看到(或与其关联的)位置。(但是实际 IP 可能存储在 http 标头中,不要忘记也重写它)
第二种简单的方法是使用iptables
(如果 Azure 托管是 Linux)前向流量(2)从 Azure IP 到您的家庭 IP:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 1.1.1.1:80
iptables -t nat -A POSTROUTING -j MASQUERADE
将所有 http(端口 80)流量重定向至1.1.1.1:80