![具有 PF 防火墙的 OpenBSD 路由器上的端口转发](https://linux22.com/image/211107/%E5%85%B7%E6%9C%89%20PF%20%E9%98%B2%E7%81%AB%E5%A2%99%E7%9A%84%20OpenBSD%20%E8%B7%AF%E7%94%B1%E5%99%A8%E4%B8%8A%E7%9A%84%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91.png)
我已按照 OpenBSD 常见问题解答中的指南设置防火墙和进行端口转发。
https://www.openbsd.org/faq/pf/example1.html https://www.openbsd.org/faq/pf/rdr.html
我尝试进行端口转发的原因是为了在线游戏。如示例所示,端口转发规则应位于阻止所有规则之后。但是,当我遵循此设置时,我的端口转发永远不会触发。我想要转发的端口始终被阻止,并且永远不会匹配最后一条规则。
我的规则是
pass in on egress inet proto udp from any to any port 3074:3079 rdr-to $gamepc
但每次我开始游戏时,连接都会在端口 3075 上被阻止,并且游戏认为我的 NAT 很严格
我错过了什么吗?
编辑:附加信息
按照目前写为 的阻止所有规则block drop in log on $pubif
,我有以下规则:
pass out on { $l1 $l2 $l3 $l4 $l5 } inet keep state
对于每个端口 $l1 到 $l5 重复下一条规则:
pass out on $pubif inet from $l1:network to any nat-to ($pubif)
然后
# Gaming Port Forward Begins Here
pass in on egress inet proto udp from any to any port 3074:3079 rdr-to $gamepc
pass in on egress inet proto udp from any to any port 3478 rdr-to $gamepc
pass in on egress inet proto udp from any to any port 4379:4380 rdr-to $gamepc
pass in on egress inet proto udp from any to any port 27000:27031 rdr-to $gamepc
pass in on egress inet proto udp from any to any port 27036 rdr-to $gamepc
pass in on egress inet proto tcp from any to any port 3074 rdr-to $gamepc
pass in on egress inet proto tcp from any to any port 27014:27050 rdr-to $gamepc
答案1
在没有看到其余规则的情况下很难判断pf
,因为可能存在一些优先级问题。
请注意,您的规则仅适用于接口in
上传入的数据包egress
。您是否有pass out
适用于重定向数据包的规则?有时,简单的包罗万象的pass out quick
规则会使事情变得更加简单,然后您只需要为来自互联网或来自 LAN 的传入流量添加规则,这通常对于简单的路由器/防火墙来说就足够了。
log
在您的block
规则中添加指令,然后用于tcpdump -ei pflog0
检查您的数据包是否被阻止也很有帮助。同样,log
规则指令pass
也可能有助于调试和/或监视事物。
更新(在OP提供额外信息后):
您的规则集似乎是正确的。您确定游戏仅通过 UDP 连接(或测试通过 UDP 的连接)?您没有pass
TCP/3075 规则。tcpdump
ingpflog0
或内部界面是否提供了任何线索?
更新2(对此答案发表评论后)
确保您也有pass
针对来自 的传入流量的规则。$gamepc
总之:
# Some macros to improve readibility
gamer_udp = "{ 3074:3079, 3478, 4379:4380, 27000:27031, 27036 }"
gamer_tcp = "{ 3074, 27014:27050 }"
# Block (and log) by default
block log
# Generic outgoing traffic (NAT)
pass out on $pubif inet from $l1:network nat-to ($pubif)
# Incoming traffic (redirection)
pass in on egress inet proto udp to port $gamer_udp rdr-to $gamepc
pass in on egress inet proto tcp to port $gamer_tcp rdr-to $gamepc
# Incoming (redirected) traffic must be allowed to pass out to the LAN
pass out on $l1 inet proto udp to $gamepc port $gamer_udp
pass out on $l1 inet proto tcp to $gamepc port $gamer_tcp
# LAN must be allowed to reach the internet (and me)
pass in on $l1 from $l1:network
警告:这显然还没有经过测试,但我相信它基本上是正确的。请不要盲目复制粘贴,根据您的需要进行调整并将其集成到您的规则集中。您可能想在其中插入一些其他规则。您还可以添加log
用于调试目的的指令(我总是记录我的block
规则)。还可以通过pass out
在该block
规则之后添加一个简单的规则并删除这两个pass out
规则$l1
(请注意,您需要保留该nat-to
规则)来进一步简化此示例。此外,通过 SSH 更改pf
规则是一种久经考验的将自己锁定在计算机之外的方法,因此控制台访问是首选。
祝你好运!