我有一台始终在线的机器,运行 Debian/Squeeze,带有几个以太网端口(它正在执行各种服务器工作,包括 DHCP),每个端口上都有一个 LAN。
eth0 位于 192.168.7.* 上,可以通过位于 192.168.7.1 的 LAN 上的网关(NAT 转换 DSL 路由器)访问互联网(以及“办公室 LAN”的其余部分)。
eth1 位于 192.168.1.* 上。我正在寻找一种快速、简单且 Debian 友好的方法来配置机器,以便 192.168.1.* LAN 上的任何人只能访问外部互联网、DHCP,而无法访问 192.168.1.* LAN 上的任何其他内容192.168.7.*。
我确信使用一组适当的 iptables 规则是可能的。怀疑我正在寻找其中之一:
- 关于如何设置 iptables 来实现上述目标的简单指南(我不是第一个想要这样做的人)。
- 指向一些用户友好的防火墙配置软件,可以执行此操作(尽管请注意,我根本不想锁定 eth0 端和 192.168.7.* 网络)。
- 建议一些专门用于执行此操作的软件;我有一个想法,有一些软件包旨在实现与我想要的网吧等类似的功能,但我不确定从哪里开始寻找,或者这些软件包是否可能矫枉过正。
Debian Squeeze(或 Wheezy)中的任何工具都已经是一个很大的优势。
答案1
使用 iptables 可以很容易地做到这一点。在下面,“wan-iface”是您的 WAN 连接所在的接口。根据其连接方式,可能是 eth2、ppp0 等。另外,请注意,您可以通过编辑来重命名以太网接口/etc/udev/rules.d/70-persistent-net.rules
- 当您有多个以太网接口时,强烈建议这样做。-i lan
比 清楚得多-i eth0
。
您可以编写 init.d 脚本以在启动时应用这些规则或使用 iptables-persistent 包。或者打包了各种防火墙规则生成器(我个人直接写iptables规则,因为我经常想做一些奇怪的事情)。
如果您现有的规则尚未涵盖,您将需要一条 NAT 规则:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o wan-iface -j SNAT --to-source external-ip
external-ip 是您的实际 IP 地址。如果您有动态的,请将该行更改为:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o wan-iface -j MASQUERADE
然后您需要防火墙规则来允许流量。我在这里给出两个,具体取决于您的默认转发是否为 DROP。它应该会下降,但是...
iptables -A FORWARD -i eth1 -o wan-iface -j ACCEPT # default is drop
iptables -A FORWARD -i eth1 ! -o wan-iface -j DROP # default is accept
现在,您只需要允许 DHCP。假设您的防火墙正在运行 DHCP,并且 DNS 位于 WAN 上(否则,您需要允许它们与 DNS 服务器通信):
iptables -A INPUT -i eth1 -p udp --dport bootps -j ACCEPT
iptables -A INPUT -i eth0 -j DROP # only if your default isn't drop
我相信,这是最小的配置。您还可以限制传至 Internet 的流量。例如,如果您只想浏览网页,而不是上面的 FORWARD 规则,您可以这样做(再次假设 WAN 上有 DNS):
iptables -A FORWARD -i eth1 -o wan-iface -p tcp --dport domain -j ACCEPT
iptables -A FORWARD -i eth1 -o wan-iface -p udp --dport domain -j ACCEPT
iptables -A FORWARD -i eth1 -o wan-iface -p tcp --dport http -j ACCEPT
iptables -A FORWARD -i eth1 -o wan-iface -p tcp --dport https -j ACCEPT
iptables -A FORWARD -i eth1 -j DROP # only if default is accept
请注意,上面允许三个端口:域(TCP 和 UDP,用于 DNS)、http (TCP) 和 https (TCP)。
编辑:
针对您的澄清:
听起来这个盒子上目前没有进行 NAT。此外,没有 WAN 接口,流量通过 LAN 流出。不是最好的设置,但可行。
我将使用“lan-ip”来表示 LAN (eth0) 上 Debian 机器的 IP 地址。我将使用“guest-ip”来表示访客网络 (eth1) 上同一个盒子的 IP 地址。
在编写本文时,我对您的接口命名感到困惑,因此我假设您采纳了我的建议,并将接口重命名为“lan”(eth0)和“guest”(eth1)。如果没有,您可以进行查找和替换。
听起来您目前没有在此机器上设置路由或防火墙,因此我将给出完整的规则,而不仅仅是要添加的规则。当然,您可能还需要添加更多内容。
您需要打开 IP 转发(编辑 /etc/sysctl.conf 来执行此操作)。并在同一文件中打开反向路径过滤器。
您需要配置 DHCP 以在 eth1 网络上提供服务。请注意,它提供的默认网关(仅适用于 eth1 访客网络)需要是 guest-ip,不是192.168.7.1。
您的 NAT 规则看起来会有点不同。最好不要这样做,而是在 192.168.7.1 上执行此操作,但我猜这是不可能的。如果可能,请跳过此 nat 规则,将其添加到 7.1 上,并通过 lan-ip 添加到 192.168.1.0/24 的路由。
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o lan -j SNAT --to-source lan-ip
现在,由于您当前没有设置防火墙,因此默认拒绝。一般来说,这是最安全的做事方式。
iptables -P INPUT DROP # default for traffic to firewall (this box)
iptables -P FORWARD DROP # default for forwarded traffic
iptables -F # clear rules
iptables -X # delete custom chains
iptables -t nat -F # same, but for nat table
iptables -t nat -X
iptables -A INPUT -i lo -j ACCEPT # let the box talk to itself. Important.
此时,您的盒子将完全无法访问。不是你想要的。接下来的几条规则可以解决这个问题。前两个设置连接跟踪,允许属于现有连接(或与其密切相关)的数据包
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
然后我们现在假设您信任办公室 LAN 上的计算机,并允许来自它们的所有流量。如果您愿意,可以将其更改为更受限制的规则。请注意,FORWARD 规则将允许您访问访客网络上的计算机从办公室局域网。如果不需要,请忽略它。
iptables -A INPUT -i lan -j ACCEPT
iptables -A FORWARD -i lan -o guest -j ACCEPT
现在,允许来自访客网络的一些流量。首先,您需要允许 DHCP。
iptables -A INPUT -i guest -p udp --dport bootps -j ACCEPT # dhcp
接下来,我假设您不想允许访客访问您的任何专用网络。因此,我们将把所有访客流量丢弃到 RFC1918(私人)空间。
iptables -A FORWARD -i guest -d 10.0.0.0/8 -j DROP
iptables -A FORWARD -i guest -d 172.16.0.0/12 -j DROP
iptables -A FORWARD -i guest -d 192.168.0.0/16 -j DROP
由于我们已经放弃了所有私有地址空间,其余的都是公共的。所以允许它。这行字有点吓人,要是前面的一行字少了,那就麻烦了。
iptables -A FORWARD -i guest -o lan -j ACCEPT
您当然可以将其限制为特定的协议和端口(如仅浏览网页的示例)。
您还可以添加规则来记录丢弃的数据包等。