iptables 阻止的 DNS 请求

iptables 阻止的 DNS 请求

我目前正在为我们的网络设置 IP 表。我们的网络情况如下:

我们有 3 个网络,分别是灰色、绿色和红色。灰色网络可以不受限制地完全访问互联网,但无法访问绿色或红色。绿色网络可以不受限制地访问灰色和互联网,红色网络无法访问互联网,但可以访问绿色和灰色。

灰色的 IP 范围为 192.168.178.0/24(在接口 eth_grey 上) 绿色的 IP 范围为 192.168.50.0/24(在接口 eth_green 上) 红色的 IP 范围为 192.168.40.0/24(在接口 eth_red 上)

我在我的rules.v4中设置了如下规则(目前还没有ipv6,这个后面会配置,ipv6设置为接受策略):

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o eth_grey -j MASQUERADE
COMMIT


*filter
:INPUT DROP
:FORWARD DROP
:OUTPUT DROP

# Allow all loopback traffic and traffic from established connections.
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow traffic in the internal network
-A OUTPUT -s 192.168.40.0/24 -d 192.168.40.0/24 -j ACCEPT
-A OUTPUT -s 192.168.50.0/24 -d 192.168.50.0/24 -j ACCEPT
-A OUTPUT -s 192.168.178.0/24 -d 192.168.178.0/24 -j ACCEPT

#Allow traffic from red to green
-A OUTPUT -s 192.168.40.0/24 -d 192.168.50.0/24 -j ACCEPT

#Allow traffic from green to grey
-A OUTPUT -s 192.168.50.0/24 -d 192.168.178.0/24 -j ACCEPT

#Allow traffic from red to grey
-A OUTPUT -s 192.168.40.0/24 -d 192.168.178.0/24 -j ACCEPT

# Allow all traffic in the grey network
-A INPUT -i eth_grey -d 192.168.178.0/24 -j ACCEPT
-A OUTPUT -s 192.168.178.0/24 -j ACCEPT

#Allo outgoing traffic from the sales network
-A OUTPUT -s 192.168.50.0/24 -j ACCEPT

#Forward traffic from eth_green to eth_grey
-A FORWARD -i eth_green -o eth_grey -j ACCEPT
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# Accept ICMP and SSH.
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp --dport 22 -j ACCEPT
COMMIT

现在的情况是,从绿色到互联网的流量是允许的,例如我可以 ping 8.8.8.8。我无法做的是解析 DNS。路由器上安装了 DNSmasq。当我使用 SSH 连接时,我甚至无法直接在路由器上解析 DNS,但是当我将策略设置为接受并刷新规则时,我可以解析 DNS,因此我认为 DNSMasq 设置正确。

答案1

我认为您需要仔细重新阅读 iptables 文档。

请看一下此图表,直观地了解 iptables 链:https://github.com/rda0/diagram/blob/master/iptables-chains-hooks.png

几乎所有您想要设置的规则都必须包含在FORWARD链中。所有需要路由的数据包(即从一个网络范围到另一个网络范围)都会经过此链。

INPUT链适用于所有发往本地系统(路由器)的数据包,并且该OUTPUT链适用于源自本地系统的数据包。

您的政策全部都是DROP。因此您需要打开一些端口以允许 DNS 流量。

例如,当您通过 ssh 测试时,为了在路由器上本地允许 DNS,您需要53OUTPUT链中打开端口。

我不明白哪个接口连接到互联网。但要允许来自您网络的 DNS,您必须53FORWARD链中打开端口,规则如下:

-A FORWARD -i <local_if> -o <inet_if> --dport 53 -j ACCEPT

local_if您的一个网络在哪里,以及inet_if连接到互联网的接口在哪里。

我还建议接受和链RELATED,ESTABLISHED中的流量。OUTPUTFORWARD

规则#3-5:这样的流量永远不会到达您的路由器,因为它不需要路由。

相关内容