我目前正在为我们的网络设置 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,您需要53
在OUTPUT
链中打开端口。
我不明白哪个接口连接到互联网。但要允许来自您网络的 DNS,您必须53
在FORWARD
链中打开端口,规则如下:
-A FORWARD -i <local_if> -o <inet_if> --dport 53 -j ACCEPT
local_if
您的一个网络在哪里,以及inet_if
连接到互联网的接口在哪里。
我还建议接受和链RELATED,ESTABLISHED
中的流量。OUTPUT
FORWARD
规则#3-5:这样的流量永远不会到达您的路由器,因为它不需要路由。