我有一台 FreeBSD 机器,用作 playbox/服务器/torrentbox。它是我的局域网的一部分。以下是语义(根据 OpenBSD 网站上的示例更改):
[ desktop ] [ laptop ]
| |
---+------+-----+------- [switch] -------- ( DSL modem )
|
[ FreeBSD playbox ]
我已在 10.0.0.0/24 范围内的所有设备中设置静态 IP。所以我的 DSL 调制解调器是 10.0.0.1,我的桌面是 10.0.0.2,FreeBSD 盒子是 10.0.0.3。它还启用了 DHCP,因此每台没有静态 IP 的计算机(朋友带来了一台笔记本电脑)都会由 DSL 调制解调器分配一个 IP,范围为 10.0.0.30 - 10.0.0.60。
我只有一张以太网卡 (em0),我想在 WAN 上打开一个端口,但不想在 LAN 上打开一个端口。这样做:
block in all
pass out all keep state
pass in proto tcp from any to any port 22
也会在 LAN 上打开端口。
在我见过的所有例子中,WAN 和 LAN 是分开的,它有两个 NIC,FreeBSD 扮演了中间层(防火墙)的角色。
那么,如何只在 WAN 上打开端口呢?
这个问题有后续。我想在 LAN 和 WAN 中打开一些端口,但我想对 WAN 施加一些限制。这是我在网上找到的一个例子:
# Setup a table and ruleset that prevents excessive abuse by hosts
# that attempt to brute force the ssh daemon with repeated requests.
# any host that hammers more than 3 connections in 5 seconds gets
# all their packet states killed and dropped into a blackhole table.
table <wan_abuse> persist
block in quick from <wan_abuse>
pass in on $eth proto tcp to any port $wan_servers_tcp flags S/SA keep \
state (max-src-conn 10, max-src-conn-rate 3/5, overload <wan_abuse> flush)
答案1
阻止 LAN 访问:如果pf.conf
知道您的 LAN 子网是什么,您可以有选择地阻止来自该子网的流量。使用你的例子:
block in all
pass out all keep state
lan_subnet = "10.0.0.0/24"
block in quick proto tcp from $lan_subnet to any port 22
pass in proto tcp from any to any port 22
限制 WAN 速率,但不限制 LAN:例如,假设您想要对端口 80 和 8080 上来自 Internet 的流量进行速率限制,但不对这些端口上的 LAN 施加速率限制。此代码片段将跟踪并阻止滥用 WAN 主机,同时允许从 LAN 进行访问:
table <http_abuse> persist
http_ports = "{ 80 8080 }"
pass in quick proto tcp from $lan_subnet to any port $http_ports
block in quick proto tcp from <http_abuse> to any port $http_ports
pass in proto tcp from any to any port $http_ports \
flags S/SA keep state \
(source-track rule, max-src-conn 50, max-src-conn-rate 25/2, \
overload <http_abuse> flush)