在 Ubuntu 上将本地服务暴露到互联网:完整的端口转发指南
Publié le 28 May 2025
-
假设的前提 : 对Ubuntu的基本了解, 终端, 基本网络概念
-
技术概念 : NAT, 端口转发, 防火墙, 反向代理
-
系统命令 : 使用终端, 网络配置
-
高级部分 : 监控, 安全, 云替代方案
问题:NAT 和私有地址
默认情况下,您的互联网盒子使用 NAT(网络地址转换)在家庭网络的所有设备之间共享一个公共 IP 地址。您的本地机器使用私有 IP 地址(192.168.x.x、10.x.x.x 等),这些地址在 Internet 上不可路由。
当您在 Ubuntu 机器上启动一个服务(例如在端口 8080 上运行一个 Web 服务器)时,该服务只能从本地网络访问。为了使其从 Internet 可访问,我们需要配置端口转发。
步骤1:识别您的公共IP地址
首先,获取您的Internet连接的公共IP地址:
# Plusieurs méthodes au choix
curl ifconfig.me
curl ipecho.net/plain
wget -qO- http://ipecho.net/plain
# Ou encore
curl -s checkip.amazonaws.com
此IP地址是互联网用户用于访问您服务的地址。
步骤2:了解您的Ubuntu机器的本地IP地址
你的Ubuntu机器在局域网上有一个私有IP地址。要查看它:
# Afficher toutes les interfaces réseau
ip addr show
# Ou plus spécifiquement pour l'interface principale
ip route get 1.1.1.1 | awk '{print $7; exit}'
# Alternative avec hostname
hostname -I | awk '{print $1}'
注意此地址(例如`192.168.1.100`), 我们将在配置过程中需要它们。
步骤 3:在您的盒子上配置端口转发
配置会根据您的盒子型号而有所不同,但原理保持不变:
访问管理界面
打开您的浏览器并前往您的盒子的Web界面:
-
Freebox:`192.168.1.1` ou
mafreebox.freebox.fr -
Livebox Orange:`192.168.1.1`
-
SFR Box:
192.168.1.1 -
Bbox Bouygues :
192.168.1.254
重定向的配置
查找专门用于端口转发的部分(名称可能因设备而异):
-
端口转发
-
网络地址转换/端口地址转换
-
端口转发
-
游戏服务器
使用这些参数创建一个新规则:
| 场 | 价值 |
|---|---|
名称/描述 |
Ubuntu Web服务"(或其他明确名称) |
外部端口(或公共端口) |
8080 |
内部 IP 地址 |
您的Ubuntu机器的IP(例如:192.168.1.100) |
内部端口(或私有端口) |
8080 |
�协议 |
TCP |
状态 |
已激活 |
步骤 4:在 Ubuntu 上配置服务
请确保您的服务在所有接口上监听,而不仅仅是 localhost :
# ✅ Correct : écoute sur toutes les interfaces
python3 -m http.server 8080 --bind 0.0.0.0
# ❌ Incorrect : écoute seulement en local
python3 -m http.server 8080 --bind 127.0.0.1
为了验证您的服务正在正确地侦听:
# Vérifier les ports en écoute
sudo netstat -tlnp | grep :8080
# ou avec ss (plus moderne)
sudo ss -tlnp | grep :8080
你应该会看到类似的东西`0.0.0.0:8080`并且不`127.0.0.1:8080`.
步骤 5 : 配置 Ubuntu 防火墙
Ubuntu 默认使用 UFW(Uncomplicated Firewall)。检查其状态并在必要时允许该端口:
# Vérifier le statut du pare-feu
sudo ufw status
# Si le pare-feu est actif, autoriser le port 8080
sudo ufw allow 8080/tcp
# Ou plus spécifiquement pour un service web
sudo ufw allow 'Apache' # si vous utilisez Apache
sudo ufw allow 'Nginx Full' # si vous utilisez Nginx
步骤 6:测试与验证
来自局域网的测试
首先,从您的局域网中的另一台机器测试访问:
# Remplacez par l'IP locale de votre machine Ubuntu
curl http://192.168.1.100:8080
外部测试
现在,使用您的公共IP从互联网进行测试:
# Remplacez par votre IP publique
curl http://VOTRE_IP_PUBLIQUE:8080
您也可以使用在线工具,如:
良好实践与安全
基础安全
# Configurer fail2ban pour protéger contre les attaques par force brute
sudo apt update && sudo apt install fail2ban
# Limiter l'accès avec UFW (exemple : autoriser seulement certaines IP)
sudo ufw allow from 203.0.113.0/24 to any port 8080
连接监控
# Surveiller les connexions en temps réel
sudo netstat -an | grep :8080
# Logs des connexions (selon votre application)
sudo tail -f /var/log/nginx/access.log # pour Nginx
sudo journalctl -f -u your-service # pour un service systemd
使用反向代理
为了更好的安全性和灵活性,请考虑使用如 Nginx 的反向代理:
server {
listen 80;
server_name votre-domaine.com;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
端口转发的替代方案
云解决方案
-
ngrok: 临时安全隧道
-
Cloudflare Tunnel免费且安全的解决方案
-
serveo.net: 简单的SSH隧道
# Exemple avec ngrok
ngrok http 8080
# Exemple avec serveo
ssh -R 80:localhost:8080 serveo.net
VPS和反向代理
对于专业使用,请考虑使用一个通过 VPN 指向您本地基础设施的反向代理的 VPS。
故障排除
常见问题
| 问题 | 解决方案 |
|---|---|
服务从外部不可访问 |
�检查端口转发配置,并确保服务在 0.0.0.0 上监听 |
连接被拒绝 |
服务未启动或仅在 127.0.0.1 上监听 |
连接超时 |
防火墙问题(盒子或Ubuntu)或端口转发配置错误 |
公共IP会定期更换 |
配置动态 DNS(DynDNS、No-IP 等) |
网络调试
# Tester la connectivité locale
telnet localhost 8080
# Tester depuis une autre machine du réseau
telnet 192.168.1.100 8080
# Vérifier les routes réseau
ip route show
# Analyser le trafic réseau
sudo tcpdump -i any port 8080
结论
在互联网上暴露本地服务需要仔细配置端口转发、安全和监控。虽然这种方法非常适合开发或个人项目,但请考虑更稳健的替代方案(VPS、CDN、云服务),以用于生产环境。
重要的是要始终将安全放在心上:使用强密码,定期更新系统,并监控对您暴露服务的访问。
请不要犹豫,在评论中分享您的经验和问题!