iptables将80端口重定向到8080端口,但阻止公共8080访问。

24

我有一些 iptables 规则,将对端口80的请求重定向到我们的应用服务器(GlassFish)的端口8080(也包括SSL端口,但为简单起见,我已经省略了它们)。

虽然我们目前的方案很好(个人也没有问题),但是如果有人想在url中指定它,端口8080也会对外开放。现在规定必须关闭从外部访问端口8080,只开放端口80。

我不希望改变应用服务器上的监听器(因为要使用端口80,似乎需要提升运行应用服务器的用户的权限),并且端口8080上的监听器需要知道数据包的源IP地址,因为应用程序审计请求到应用程序(即我们不能将源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


你考虑过阻止8080端口并依赖于httpd的代理传递吗? - guido
谢谢您的建议。目前这个服务器上没有可用的Apache或mod_proxy(我理解它需要..?),但是如果iptables或标准Linux软件包无法实现,那么我想这是值得研究的事情。 - lazidar
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

太棒了 - 我一直在想是否仅使用iptables就可以实现,但这很好用。谢谢。 - lazidar
1
当我尝试时不被允许 - 它告诉我我没有足够的声望!... 这是我经常听到的事情。 - lazidar
3
在我的特定情况下,尽管 DROP 命令确实禁止了对端口8080的访问,但外部的 nmap扫描显示出有一个被“过滤”的8080端口。对我而言,解决方案是使用 iptables -A INPUT -p TCP -m mark --mark 1 -j REJECT --reject-with tcp-reset 替代 iptables -A INPUT -m mark --mark 1 -j DROP - Abdull

4
我以稍微不同的方式处理了这个问题。我将443转发到3000(如上所述),同时也将3000转发到443。然后我允许3000端口的流量,但在443上阻止它。当过滤443流量时,应该只能从端口3000开始。
我正在使用ufw,因此使用该工具输入了过滤规则。我在/etc/ufw/before.rules中添加了nat规则。
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

那真是非常聪明。 - roaima

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访问应用程序,而其他人在互联网上只能看到打开的80端口。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接