Iptables 防火墙转发

Iptables 防火墙转发

我目前正在使用 Linux 路由器,但无法按照我希望的方式对其进行防火墙保护。

路由器有三个接口 - WAN,即移动宽带专用子网172.18.15.0/24,它是安全的,并且具有我不信任的设备172.18.15.2专用子网10.0.0.0/24。WAN 用于通过 OpenVPN 访问它,是路由器的默认网关。

路由器 IP 为172.18.15.110.0.0.1。在 iptables 中,我设置了 DNAT 规则,用于将端口80流量从转发10.0.0.1172.18.15.2MASQUERADE 然后再返回。

这部分工作正常。

我担心的是,当私有子网中的任何人选择10.0.0.1作为其默认网关或创建到172.18.15.0/24via的路由时10.0.0.1,它也会暴露172.18.15.2。我希望停止这种行为,这样访问172.18.15.2网络的唯一方式就是通过地址10.0.0.1

如果我取消转发,我也会取消 DNAT,这是有问题的。

我想到的一个方法是安装 Apache 并创建反向代理。但我不确定这是否是正确的方法。

感谢您的建议!

编辑:

172.18.15.2是简单的设备。它只能有自己的地址和网关地址,在本例中172.18.15.1。它之所以有响应,是因为我已经设置了/etc/sysctl.conf net.ipv4.ip_forwarf=1

这是iptables-save -c
enp1s0 的转储,是 10.0.0.0/24 的接口
enp2s0 是 172.18.15.0/24 的接口
wwx582c80139263 是移动宽带网关的接口

# Generated by iptables-save v1.6.0 on Mon Apr 16 08:27:45 2018
*filter
:INPUT ACCEPT [840:388180]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [643:92809]
[0:0] -A INPUT -d 10.0.0.0/24 -p tcp -m tcp --dport 80 -j ACCEPT
[0:0] -A INPUT -d 10.0.0.0/24 -p tcp -j DROP
COMMIT
# Completed on Mon Apr 16 08:27:45 2018
# Generated by iptables-save v1.6.0 on Mon Apr 16 08:27:45 2018
*nat
:PREROUTING ACCEPT [10:648]
:INPUT ACCEPT [10:648]
:OUTPUT ACCEPT [11:770]
:POSTROUTING ACCEPT [11:770]
[0:0] -A PREROUTING -i enp1s0 -p tcp -m tcp --dport 80 -j DNAT --to- 
destination 172.18.15.2:80
[0:0] -A POSTROUTING -s 172.18.15.0/24 -j MASQUERADE
[0:0] -A POSTROUTING -o wwx582c80139263 -j MASQUERADE
COMMIT
# Completed on Mon Apr 16 08:27:45 2018

答案1

使用反向代理(应插入X-Forwarded-For用于日志记录的标头)并删除网络转发将是一个干净的解决方案。应清楚理解以下解决方案,以避免进一步更改 iptables 规则时产生意外影响。

话虽如此...

问题

  • LAN10.0.0.0/24的节点不能将路由器用作路由器,至少不能到达172.18.15.0/24。但有些节点还是会这么做。
  • 路由器通过DNAT和转发为位于172.18.15.0/24172.18.15.2:80)的节点提供服务。10.0.0.0/24
  • 一旦数据包到达过滤器/FORWARD 链,就无法区分它们最初是发往10.0.0.1然后经过 DNAT 还是直接发送到172.18.15.2(这应该是禁止的)。

解决方案

因此,分类必须在 NAT 发生之前完成:在 mangle 表中,如下所示Netfilter 和常规网络中的数据包流示意图。这个独特的规则足以处理它:

iptables -t mangle -A PREROUTING -s 10.0.0.0/24 -d 172.18.15.0/24 -j DROP

但通常,为了更好地管理,应该将角色分开:mangle 用于修改(而不是删除)或在此处标记,而 filter 表(默认)用于过滤和删除。这可以通过在 mangle 步骤中使用标记,并在 filter 步骤中将此标记与删除相匹配来实现。因此,这是等效的:

iptables -t mangle -A PREROUTING -s 10.0.0.0/24 -d 172.18.15.0/24 -j MARK --set-mark 1
iptables -A FORWARD -m mark --mark 1 -j DROP

(并且真正完整:iptables -A INPUT -m mark --mark 1 -j DROP阻止访问172.18.15.1

两种方法都一样。当然,如果实际上只需要保护设备 172.18.15.2,只需将其替换-d 172.18.15.0/24-d 172.18.15.2

更新:可以使用一种更简单的方法,依赖于 conntrack(由于 NAT,该方法已经在使用):查询连接跟踪知道数据包是否真的经过 DNAT 处理,如果没有,则丢弃它。这样就简化了事情,因为那只是一条规则,并且只是在过滤器/FORWARD 链中。因此,作为第三种方法,而不是上面的规则:

iptables -A FORWARD -s 10.0.0.0/24 -d 172.18.15.0/24 -m conntrack ! --ctstate DNAT -j DROP

另外,以下行是无用的,可以删除。PREROUTING 使用 DNAT 更改了目的地,因此流量永远不会到达 INPUT,而是通过 FORWARD 链:

[0:0] -A INPUT -d 10.0.0.0/24 -p tcp -m tcp --dport 80 -j ACCEPT

相关内容