在 Linux 下,默認狀況下1024 如下的端口是要在 root 下才能使用的,在其餘用戶下,若是嘗試使用將會報錯。在有的時候,咱們可能考慮程序運行在 root 賬戶下,但這可能會給 Linux 系統帶來安全風險。那如何可以讓非 root 用戶運行的程序可以對外啓用小於 1024 的端口呢?linux
本文嘗試給出一些方法: 安全
第一種方法:SetUIDapp
給用戶的應用程序在執行位設置用戶 ID 可以使程序能夠以 root 權限來運行,這個方法讓程序可以像在 root 下運行同樣,不過須要很是當心,這種方法一樣會帶來安全風險,特別是當要執行的程序自己存在安全風險時。運維
使用的方法是:tcp
chown root.root /path/to/application工具
#使用SetUIDspa
chmod u+s /path/to/application.net
咱們能夠看到在系統下,/usr/bin/passwd這種文件,就使用了SetUID,使得每一個系統能的用戶都能用passwd來修改密碼——這是要修改/etc/passwd的文件(而這個只有root有權限)。視頻
既然要使用非root用戶運行程序,目的就是要下降程序自己給系統帶來的安全風險,所以,本方法使用的時候須要特別謹慎。教程
第二種方法:CAP_NET_BIND_SERVICE
從 2.1 版本開始,Linux 內核有了能力的概念,這使得普通用戶也可以作只有超級用戶才能完成的工做,這包括使用端口。
獲取CAP_NET_BIND_SERVICE能力,即便服務程序運行在非root賬戶下,也可以banding到低端口。使用的方法:
# 設置CAP_NET_BIND_SERVICE
setcap cap_net_bind_service =+ep /path/to/application
Note:
1. 這個方法並非全部Linux系統通適,內核在2.1以前的並無提供,所以你須要檢查要使用此方法所在系統是否支持;
2. 另外須要注意的是,若是要運行的程序文件是一個腳本,這個方法是沒有辦法正常工做的。
第三種方法:Port Forwarding
若是要運行的程序有權限監聽其餘端口,那麼這個方法是可使用的,首先讓程序運行在非root賬戶下,並綁定高於1024的端口,在確保能正常工做的時候,將低端口經過端口轉發,將低端口轉到高端口,從而實現非root運行的程序綁定低端口。要使用此方法可使用下面的方式:
# Enable the IP FORWARD kernel parameter.
sysctl -w net.ipv4.ip_forward=1
# Use iptables rules to redirect packets
iptables -F -t nat
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to:8088
第一步使用sysctl確保啓用IP FORWARD功能(此功能在Red Hat/CentOS默認是被禁用的),注意,代碼中使用的sysctl設置是臨時性設置,重啓以後將會被重置,若是要長久保存,須要在/etc/sysctl.conf文件內修改:
# Default value is 0, need change to 1.
# net.ipv4.ip_forward = 0
net.ipv4.ip_forward = 1
而後從文件中加載新的配置
# load new sysctl.conf
sysctl -p /etc/sysctl.conf
# or sysctl -p
# default filename is /etc/sysctl.conf
第二步就是使用iptables的規則來實現端口轉發到程序所在的端口,示例中咱們要將80端口轉發到8088。
此種方法可以比較好的達到咱們的目的,咱們的程序能夠經過非root用戶來運行,並可以對外提供低端口號的服務。
第四種方式:RINETD
這種方法使用的也是端口轉發,此工具能夠將本地端口映射到遠程端口,但此功能對於咱們當前的功能來講,有點雞肋,畢竟咱們新增了一個額外的程序,這將可能會增長咱們系統的風險性。在此不作推薦。
免費領取兄弟連IT教育原創linux運維工程師視頻/細說linux教程,詳情諮詢官網客服:http://www.lampbrother.net/linux/
PHP、Linux、HTML五、UI、Android等視頻教程(課件+筆記+視頻)!聯繫Q2430675018