Ubuntu 17.10下为Spring Boot Jar开放低端口访问权限问题
我来帮你解决Spring Boot可执行Jar绑定443低端口的问题,之前我也踩过类似的坑,给你几个亲测有效的方案:
方案1:给Java二进制文件添加端口绑定权限
你之前直接给Jar文件加setcap是没用的——因为setcap是作用于二进制可执行文件,而Spring Boot的可执行Jar本质是带启动逻辑的压缩包,真正执行的是Java虚拟机(JVM)的二进制程序。
具体步骤:
- 先找到你当前使用的Java二进制文件路径,比如通常在
/usr/bin/java,或者通过which java命令查询 - 执行以下命令给Java程序赋予绑定低端口的权限:
sudo setcap CAP_NET_BIND_SERVICE=+eip /usr/bin/java - 之后你就可以不用
sudo,直接运行java -jar proj.jar,Tomcat就能正常绑定443端口了
注意:如果你的系统安装了多个Java版本,一定要给当前运行项目的那个Java版本的二进制文件加权限。
方案2:用端口转发实现(更安全,推荐)
如果不想给全局JVM开放低端口权限,可以用iptables把443端口的流量转发到Tomcat实际监听的高端口(比如8443),这样既不用修改权限,也能实现外部访问443的需求。
具体步骤:
- 修改Spring Boot配置文件(比如
application.properties),让Tomcat监听高端口:server.port=8443 # 如果是HTTPS,还需要配置证书信息: server.ssl.key-store=classpath:your-keystore.jks server.ssl.key-store-password=your-password server.ssl.key-password=your-password - 添加iptables转发规则:
sudo iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443 - 保存iptables规则(不同系统命令不同):
- Ubuntu/Debian:
sudo iptables-save > /etc/iptables/rules.v4 - CentOS/RHEL:
sudo service iptables save
- Ubuntu/Debian:
- 直接运行
java -jar proj.jar,外部访问443端口就会自动转发到8443,站点正常可用
方案3:用systemd服务管理(生产环境首选)
如果是生产环境部署,推荐用systemd来管理你的Spring Boot服务,既能配置普通用户运行,又能通过AmbientCapabilities单独给服务赋予端口绑定权限,比全局加权限更安全。
具体步骤:
- 创建systemd服务文件,比如
/etc/systemd/system/proj.service:[Unit] Description=我的Spring Boot项目服务 After=network.target [Service] User=your-normal-user # 替换成你要使用的普通用户名 ExecStart=/usr/bin/java -jar /path/to/proj.jar AmbientCapabilities=CAP_NET_BIND_SERVICE # 仅给该服务赋予绑定低端口的权限 Restart=always # 服务异常退出时自动重启 [Install] WantedBy=multi-user.target - 重新加载systemd配置:
sudo systemctl daemon-reload - 启动服务并设置开机自启:
sudo systemctl start proj sudo systemctl enable proj
这样服务会以普通用户身份运行,但拥有绑定443端口的权限,既安全又方便后续的运维管理。
内容的提问来源于stack exchange,提问作者szab.kel
相关产品推荐
相关产品推荐

