PF防火墙仅允许内部LAN访问FreeBSD Samba:规则合规性及优化方案?
嘿,针对你在FreeBSD 11.1上用PF保护单NIC Samba共享的需求,我来给你拆解下规范配置思路,顺便帮你评估现有规则的合理性。
先明确Samba的核心端口
首先,要搞清楚Samba服务依赖的端口,避免规则遗漏:
- TCP 139:NetBIOS会话服务(老版本Windows常用)
- TCP 445:直接SMB服务(现代系统优先用这个)
- UDP 137/138:NetBIOS名字解析(如果内部客户端依赖NetBIOS访问共享名,就需要开这两个)
评估你现有规则的合理性
假设你现有规则大概是这样的:
pass in on em0 from 192.168.x.0/24 to em0 port {139,445}
这个规则方向是对的,但可能存在几个不规范/不完整的地方:
- 没有结合PF的状态检测(
keep state),会导致Samba的响应流量可能被默认规则拦截 - 如果内部依赖NetBIOS,遗漏了UDP端口的规则
- 没有定义变量(比如网卡、网段),后续维护起来麻烦
- 大概率缺少PF的基础规则(比如默认拒绝、允许回环),这会让整体防火墙策略不安全
规范的PF配置方案
下面是符合PF惯例的配置步骤,你可以直接参考修改:
1. 定义全局变量(方便维护)
在/etc/pf.conf开头先定义常用变量,替换成你实际的网卡和网段:
# 内部网卡名称(比如em0、igb0,用ifconfig查看) int_if = "em0" # 允许访问的内部网段 internal_net = "192.168.1.0/24" # Samba核心TCP端口 samba_tcp_ports = "{139, 445}" # Samba NetBIOS UDP端口(可选,根据内部需求开启) samba_udp_ports = "{137, 138}"
2. 配置PF基础规则(必须)
这部分是PF的常规安全基线,不能省略:
# 跳过回环接口的过滤(本地服务访问必须) set skip on lo0 # 默认拒绝所有入站、转发流量,只允许出站的状态化连接 block all pass out quick keep state
3. 添加Samba专属规则
结合状态检测,只允许内部网段访问:
# 允许内部网段访问Samba的TCP端口,启用状态检测 pass in on $int_if proto tcp from $internal_net to ($int_if) port $samba_tcp_ports keep state # (可选)如果内部需要NetBIOS名字解析,添加UDP规则 pass in on $int_if proto udp from $internal_net to ($int_if) port $samba_udp_ports keep state
这里的($int_if)写法更灵活,即使服务器有多个IP或者用CARP,也能匹配所有绑定在该网卡上的地址;keep state会自动允许Samba的响应流量,不用额外写出站规则。
4. 双重保险:Samba自身配置限制
除了PF规则,建议在/etc/smb.conf里也添加网段限制,即使PF出问题,Samba也会拒绝外部访问:
[global] hosts allow = 192.168.1.0/24 hosts deny = all
验证配置的步骤
- 先检查PF配置语法是否正确:
pfctl -nf /etc/pf.conf
没有报错说明语法没问题。
- 加载新配置:
pfctl -f /etc/pf.conf
- 测试效果:
- 从内部网段的机器访问Samba共享,确认能正常连接
- 尝试从外部(如果有条件)访问,应该被拦截
- 可以用
tcpdump抓包验证:tcpdump -n -i em0 port 139 or 445,看外部流量是否被PF丢弃
额外注意事项
- 确保PF开机自动启动:
sysrc pf_enable="YES",sysrc pflog_enable="YES" - 如果需要排查问题,可以查看pflog日志:
tcpdump -n -e -ttt -i pflog0
内容的提问来源于stack exchange,提问作者gsl
相关产品推荐
相关产品推荐

