我目前正在使用 Linux 路由器,但无法按照我希望的方式对其进行防火墙保护。
路由器有三个接口 - WAN,即移动宽带专用子网172.18.15.0/24
,它是安全的,并且具有我不信任的设备172.18.15.2
专用子网10.0.0.0/24
。WAN 用于通过 OpenVPN 访问它,是路由器的默认网关。
路由器 IP 为172.18.15.1
和10.0.0.1
。在 iptables 中,我设置了 DNAT 规则,用于将端口80
流量从转发10.0.0.1
到172.18.15.2
MASQUERADE 然后再返回。
这部分工作正常。
我担心的是,当私有子网中的任何人选择10.0.0.1
作为其默认网关或创建到172.18.15.0/24
via的路由时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 规则时产生意外影响。
话虽如此...
问题
- LAN
10.0.0.0/24
的节点不能将路由器用作路由器,至少不能到达172.18.15.0/24
。但有些节点还是会这么做。 - 路由器通过DNAT和转发为位于
172.18.15.0/24
(172.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