# Linux 下普通用户无法使用80（www）端口

- Link: https://www.xuepaijie.com/html/skill/devops/855.html
- Published: 2017-03-01T10:48:31+08:00
- Author: Admin

在 Linux 中为了安全起见，小于1024的端口都归root用户所有，其他用户没有使用这些端口
的权限。

因此大量的新手或粗心的运维就会遇到伤害了。怎么解决呢？有两种方式，一种是用 root 
账户来执行，另一种就是利用 iptables 进行端口转发。

但是若是用 root 账户来启动服务，如 tomcat ，那是极度不安全的作法，这里就推荐使用
iptables 来进行端口的转发了。

    ```html;
    #使用root用户执行，将80端口映射到8080上
    iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
    ```

**这里有一段摘于他人的解释：**

原因是，如果你连接到1024以下的端口，你可以很确定你正在使用的服务由系统的系统管理
员设置，而不是由恶意或天真的用户设置的一些“木马”。

如果你真的需要 Tomcat 来听端口80，那么你有两个选择：

（1）将 Tomcat 作为“root”运行。

（2）运行一些其他软件作为“root”，它将 http 请求交给作为普通用户运行的 Tomcat。

第一个选项是危险的，不推荐用于实际使用。例如它可能允许Web应用程序代码无意中损坏系统
文件。第二个选项通常是通过在端口80上运行Web服务器（如Apache或Nginx）它将所有或某些
Web请求交给Tomcat服务器。这是一个受欢迎的选项，Tomcat网站上有完整的设置详细信息。

为什么将Tomcat运行为“root”是危险的？它如何允许Web应用程序代码无意中损坏系统文件？

Unix / Linux系统总是设置不同级别的用户权限。每个文件对三类用户具有单独的读，写和
执行权限：“拥有”文件的用户，与所有者在同一“组”中的用户，以及其他所有人。这种细粒度
的访问控制允许系统配置是可读的，但不能由普通用户写入，例如，允许单个用户将私人信息
标记为其他用户不可读。

“root”用户可以完全绕过此保护。 “root”是超级用户，能够读取，写入和/或执行系统上的
任何文件。 “root”访问应该是任何系统上最密切保护的秘密。如果进程由“root”拥有，它可以
在系统上执行任何操作。

现在想象我有一个运行为“root”的Tomcat服务器，并部署一个允许输入文件名并显示命名文件
内容的Web应用程序。只需将输入框中的私人文件的完整路径，任何地方的任何用户就可以读
取秘密文件。如果服务器在一般的互联网上，你甚至可能会发现Google已索引这些秘密文件，
并使他们可被搜索！

你可能认为你从这种事情中是安全的，但如果你的程序建立一个本地文件名从一些外部输入
读取（或更糟，写入），几乎没有阻止角色进入相对路径只有一个文件名，并可以访问整个
系统与超级用户权限。

底线：除非你既是Linux / Unix系统管理员又是Tomcat配置大师，甚至没有想过
 运行像“root”
这样的东西。
