具有 PF 防火墙的 OpenBSD 路由器上的端口转发

具有 PF 防火墙的 OpenBSD 路由器上的端口转发

我已按照 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 的连接)?您没有passTCP/3075 规则。tcpdumpingpflog0或内部界面是否提供了任何线索?

更新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规则是一种久经考验的将自己锁定在计算机之外的方法,因此控制台访问是首选。

祝你好运!

相关内容