PF 방화벽을 사용하는 OpenBSD 라우터의 포트 전달

PF 방화벽을 사용하는 OpenBSD 라우터의 포트 전달

저는 OpenBSD FAQ의 지침에 따라 방화벽을 설정하고 포트 전달을 수행했습니다.

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 규칙이 없습니다 . tcpdumping pflog0또는 내부 인터페이스가 단서를 제공합니까?

업데이트 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또한 pfSSH를 통해 규칙을 변경하는 것은 컴퓨터에서 자신을 잠그는 시도되고 테스트된 방법이므로 콘솔 액세스가 선호됩니다.

행운을 빌어요!

관련 정보