24

我有一些iptables规则可以将端口 80 的请求重定向到我们的应用程序服务器(GlassFish)的端口 8080(以及 SSL 端口,但为简单起见,我将它们排除在外)。

虽然我们的工作正常(我个人对此没有问题),但如果有人希望在 url 中指定它,端口 8080 也对外界开放。已强制要求将 8080 端口关闭,禁止外界访问,仅开放 80 端口。

我不希望更改应用程序服务器上的侦听器(对于使用端口 80,这似乎需要为运行应用程序服务器的用户提升权限)并且端口 8080 上的侦听器需要知道数据包的源 IP 作为应用程序审核对应用程序的请求(即,我们不能将源 IP 地址更改为本地地址)。

当前iptables配置如下。有谁知道是否有办法阻止公共互联网上的 8080,同时保留从端口 80 重定向到的数据包中的源 IP?

提前谢谢了。


    iptables -P INPUT ACCEPT
    iptables -P OUTPUT ACCEPT
    iptables -P FORWARD DROP

    # allow establishment of connections initialised by my outgoing packets
    iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

    # accept anything on localhost
    iptables -A INPUT -i lo -j ACCEPT

    ################################################################
    #individual ports tcp 
    ################################################################
    iptables -A INPUT -p tcp --dport 80 -j ACCEPT
    iptables -A INPUT -p tcp --dport 8080 -j ACCEPT

    #drop everything else
    iptables -A INPUT -j DROP

    ################################################################
    #Redirection Rules
    ################################################################
    # redirection rules (allowing forwarding from localhost)
    iptables -t nat -A OUTPUT -o lo -p tcp --dport 80 -j REDIRECT --to-port 8080

    # redirection http
    iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080

4

3 回答 3

23

我发现实现此目的的一种方法是在 mangle 表的 PREROUTING 链中使用 MARK 目标。

添加规则以标记要阻止的数据包:

iptables -t mangle -A PREROUTING -p tcp --dport 8080 -j MARK --set-mark 1

然后,在允许端口 8080 之前将其添加到 DROP 标记的数据包中:

iptables -A INPUT -m mark --mark 1 -j DROP
于 2012-07-03T19:32:41.930 回答
4

我以稍微不同的方式处理了这个问题。我将 443 转发到 3000(如上所述),但也将 3000 转发到 443。然后我允许 3000 上的流量,但在 443 上阻止它。过滤 443 流量时,应该只来自端口 3000。

我正在使用 ufw,因此使用该工具输入了过滤规则。我在/etc/ufw/before.rules.

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 3000

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 3000 -j REDIRECT --to-ports 443
于 2012-10-12T02:38:37.267 回答
0

我知道现在为时已晚,但我想出了另一个对大多数人来说可能更直接的解决方案。

只需将端口 8080 重定向到另一个关闭的端口(例如 3000):

iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-ports 3000
iptables -A INPUT -p tcp --dport 3000 -j REJECT --reject-with tcp-reset

然后,您可以在本地计算机的 8080 端口访问该应用程序,而 Internet 上的其他人可能只能看到端口 80 已打开。

于 2020-08-24T03:42:44.827 回答