Linux 為安全考量,僅允許 root 進程綁定 1-1023 號「特權連接埠」。開發人員需以非 root 身分運行服務(如 DNS 53、HTTP 80)時,需繞過此限制。
| 方案 | 優點 | 缺點 |
setcap CAP_NET_BIND_SERVICE=+ep | 無額外工具、效能最好 | 需檔案系統支援 extended attributes、二進制檔升級後失效 |
iptables 端口轉發 | 不修改程式 | 增加複雜度、NAT 迴環問題 |
authbind | 細粒度控制(依用戶/連接埠/IP)、無需 root 執行 | 需額外安裝、LD_PRELOAD 機制有相容性限制 |
systemd Socket Activation | 現代標準、並發友善 | 需 systemd 235+、服務需支援 socket 傳遞 |
authbind 安裝(Debian/Ubuntu)
apt-get update && apt-get install -y authbind
authbind 手動編譯安裝(CentOS/RHEL 無官方 RPM)
# 1. 取得原始碼
git clone https://github.com/tootedom/authbind-centos-rpm.git
cd authbind-centos-rpm
# 或直接下載 tarball:wget https://ftp.debian.org/debian/pool/main/a/authbind/authbind_2.1.2.tar.gz
# 2. 編譯安裝(以 Debian 源碼為例)
tar xf authbind_2.1.2.tar.gz
cd authbind-2.1.2
make
make install
# 安裝至 /usr/local/bin/authbind、/usr/local/lib/authbind/、/etc/authbind/
配置授權(以用戶 test 綁定 80 連接埠為例)
# 依連接埠授權(最常用)
touch /etc/authbind/byport/80
chmod 755 /etc/authbind/byport/80
chown test:test /etc/authbind/byport/80
# 依 IP:Port 授權
touch /etc/authbind/byaddr/192.168.1.100:80
chown test:test /etc/authbind/byaddr/192.168.1.100:80
# 依 UID 授權(該用戶可綁定所有已授權連接埠)
touch /etc/authbind/byuid/1001
chown test:test /etc/authbind/byuid/1001
啟動程式
# 直接在啟動命令前加上 authbind --deep
authbind --deep java -jar myserver.jar
# 或寫入 systemd 服務單元
ExecStart=/usr/local/bin/authbind --deep /opt/app/start.sh
原理與限制
authbind 透過 LD_PRELOAD 攔截 bind() 系統呼叫,若檢查通過則以輔助程式(helper,setuid root)代為綁定再傳回檔案描述符。
- 不支援:靜態連結程式、Go/Rust 等非 glibc 動態連結、SUID/SGID 程式、
cap_net_bind_service 已設定的二進制檔。
--deep 參數可遞迴處理子進程(如 Java 啟動的 wrapper script)。