如何阻止Nomad将服务暴露至公网?
问题分析
当前Nomad任务的端口默认绑定到了VPS的公网IP接口,导致只能通过公网IP访问容器,本地回环地址无法访问;而你需要实现仅允许VPS内部访问、禁止公网访问的效果。
解决方案
修改任务文件中的network配置,给指定端口添加bind_address = "127.0.0.1",让Nomad仅将端口转发到本地回环接口:
job "echo-app" { datacenters = ["dc1"] group "web" { count = 1 network { port "appHttp" { to = 8080 bind_address = "127.0.0.1" # 新增此行,限制端口绑定到回环接口 } } service { provider = "nomad" port = "appHttp" name = "echo-web-http" } task "echo-server" { driver = "docker" config { image = "mendhak/http-https-echo:26" ports = [ "appHttp" ] } resources { cpu = 100 memory = 200 } } } }
原理说明
- 配置
bind_address = "127.0.0.1"后,Nomad会将容器的8080端口映射到VPS的回环接口对应的端口,仅允许VPS内部通过127.0.0.1:<port>访问。 - 公网接口不会绑定该端口,因此外部无法通过公网IP访问容器。
- 若需要使用固定端口而非随机端口,可在port块中添加
static = <你的端口号>(例如static = 8080),之后就能直接用127.0.0.1:8080访问容器。
补充防火墙兜底方案
如果Nomad配置修改后仍有问题,可通过VPS防火墙规则限制公网访问目标端口,以iptables为例:
# 替换<port>为实际端口,禁止外部访问该端口 iptables -A INPUT -p tcp --dport <port> -s 0.0.0.0/0 -j DROP # 允许本地访问该端口 iptables -A INPUT -p tcp --dport <port> -s 127.0.0.1/32 -j ACCEPT
内容的提问来源于stack exchange,提问作者Nilan Saha
相关产品推荐
相关产品推荐

