2017 年更新:
使用 [authbind][1]
*免责声明(每 2021 年更新):请注意,authbind 通过 LD_PRELOAD 工作,仅在您的程序使用 LIBC 时使用,如果您的程序使用 GO 或任何其他避免 C 的编译器编译,则(或可能)不是这种情况。如果您使用 go,请为受保护的端口范围设置内核参数,请参阅帖子底部。</EndUpdate>
Authbind 比 CAP_NET_BIND_SERVICE 或自定义内核要好得多。
- CAP_NET_BIND_SERVICE 授予对二进制文件的信任,但不提供对每个端口访问的控制。
- Authbind 授予用户/组信任并提供对每个端口访问的控制,并支持 IPv4 和 IPv6(最近添加了 IPv6 支持)。
安装:apt-get install authbind
为所有用户和组配置对相关端口的访问,例如 80 和 443:
sudo touch /etc/authbind/byport/80
sudo touch /etc/authbind/byport/443
sudo chmod 777 /etc/authbind/byport/80
sudo chmod 777 /etc/authbind/byport/443
authbind
通过(可选地指定--deep
或其他参数,请参阅手册页)执行您的命令:
authbind --deep /path/to/binary command line args
e.g.
authbind --deep java -jar SomeServer.jar
作为 Joshua 关于破解内核的绝妙(=除非您知道自己在做什么,否则不推荐)建议的后续行动:
我先把它贴在这里。
简单的。使用普通或旧内核,您不需要。
正如其他人指出的那样,iptables 可以转发端口。
正如其他人所指出的, CAP_NET_BIND_SERVICE 也可以完成这项工作。
当然,如果您从脚本启动程序,CAP_NET_BIND_SERVICE 将失败,除非您在 shell 解释器上设置上限,这是没有意义的,您也可以以 root 身份运行您的服务......
例如对于 Java,您必须应用它到 JAVA JVM
sudo /sbin/setcap 'cap_net_bind_service=ep' /usr/lib/jvm/java-8-openjdk/jre/bin/java
显然,这意味着任何 Java 程序都可以绑定系统端口。
用于单声道/.NET 的 Dito。
我也很确定 xinetd 不是最好的想法。
但是既然这两种方法都是hack,为什么不通过解除限制来解除限制呢?
没有人说你必须运行一个普通的内核,所以你可以运行你自己的。
您只需下载最新内核(或您当前拥有的内核)的源代码。之后,你去:
/usr/src/linux-<version_number>/include/net/sock.h:
你在那里寻找这条线
/* Sockets 0-1023 can't be bound to unless you are superuser */
#define PROT_SOCK 1024
并将其更改为
#define PROT_SOCK 0
如果您不想遇到不安全的 ssh 情况,请将其更改为:#define PROT_SOCK 24
通常,我会使用您需要的最低设置,例如 79 用于 http,或 24 在端口 25 上使用 SMTP 时。
这已经是全部了。
编译内核并安装它。
重启。
完成了——那个愚蠢的限制已经消失了,这也适用于脚本。
以下是编译内核的方法:
https://help.ubuntu.com/community/Kernel/Compile
# You can get the kernel-source via package linux-source, no manual download required
apt-get install linux-source fakeroot
mkdir ~/src
cd ~/src
tar xjvf /usr/src/linux-source-<version>.tar.bz2
cd linux-source-<version>
# Apply the changes to PROT_SOCK define in /include/net/sock.h
# Copy the kernel config file you are currently using
cp -vi /boot/config-`uname -r` .config
# Install ncurses libary, if you want to run menuconfig
apt-get install libncurses5 libncurses5-dev
# Run menuconfig (optional)
make menuconfig
# Define the number of threads you wanna use when compiling (should be <number CPU cores> - 1), e.g. for quad-core
export CONCURRENCY_LEVEL=3
# Now compile the custom kernel
fakeroot make-kpkg --initrd --append-to-version=custom kernel-image kernel-headers
# And wait a long long time
cd ..
简而言之,如果您想保持安全,请使用 iptables,如果您想确保此限制不再困扰您,请编译内核。
注意:最近,不再需要更新内核。
您现在可以设置
sysctl net.ipv4.ip_unprivileged_port_start=80
或者坚持
sysctl -w net.ipv4.ip_unprivileged_port_start=80.
如果这产生错误,只需使用 nano 编辑 /etc/sysctl.conf 并在此处设置参数以在重新启动后保持持久性。
或通过 procfs
echo 80 | sudo tee /proc/sys/net/ipv4/ip_unprivileged_port_start