iptables重定向80到8080但阻止公共8080访问

时间:2012-06-16 16:19:10

标签: http redirect port iptables

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

虽然我们的工作正常(而且我个人也没有问题)如果有人希望在网址中指定端口8080,那么端口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

3 个答案:

答案 0 :(得分:21)

我发现实现此目的的一种方法是在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

答案 1 :(得分: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

答案 2 :(得分: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已打开。