pf를 사용하여 macOS에서 간단한 포트 전달을 설정하는 방법은 무엇입니까? "규칙은 순서대로 이루어져야 합니다: 옵션, 정규화, 큐잉, 번역, 필터링"

pf를 사용하여 macOS에서 간단한 포트 전달을 설정하는 방법은 무엇입니까? "규칙은 순서대로 이루어져야 합니다: 옵션, 정규화, 큐잉, 번역, 필터링"

pf포트 5800의 Mac A에서 포트 5900의 Mac B 로 트래픽을 전달하려고 합니다 .

예상 이동 경로는 다음과 같습니다.

Client to port 5800 → Router (Yes, port forwarding is setup here) → Mac with PF → PF → 192.168.1.246 port 5900

내가 사용하려는 규칙은 다음과 같습니다(잘못되었을 수도 있음).

rdr pass inet proto tcp from any to any port 5800 -> 192.168.1.246 port 5900

질문 1

규칙을 직접 추가 /etc/pf.conf하고 실행 하면 sudo pfctl -f /etc/pf.conf다음과 같은 결과가 나타납니다.

$ sudo pfctl -f /etc/pf.conf
pfctl: Use of -f option, could result in flushing of rules
present in the main ruleset added by the system at startup.
See /etc/pf.conf for further details.

No ALTQ support in kernel
ALTQ related functions disabled
/etc/pf.conf:29: Rules must be in order: options, normalization, queueing, translation, filtering
pfctl: Syntax error in config file: pf rules not loaded

내 구성 파일은 다음과 같습니다.

#
# Default PF configuration file.
#
# This file contains the main ruleset, which gets automatically loaded
# at startup.  PF will not be automatically enabled, however.  Instead,
# each component which utilizes PF is responsible for enabling and disabling
# PF via -E and -X as documented in pfctl(8).  That will ensure that PF
# is disabled only when the last enable reference is released.
#
# Care must be taken to ensure that the main ruleset does not get flushed,
# as the nested anchors rely on the anchor point defined here. In addition,
# to the anchors loaded by this file, some system services would dynamically 
# insert anchors into the main ruleset. These anchors will be added only when
# the system service is used and would removed on termination of the service.
#
# See pf.conf(5) for syntax.
#

#
# com.apple anchor point
#
scrub-anchor "com.apple/*"
nat-anchor "com.apple/*"
rdr-anchor "com.apple/*"
dummynet-anchor "com.apple/*"
anchor "com.apple/*"
load anchor "com.apple" from "/etc/pf.anchors/com.apple"

rdr pass inet proto tcp from any to any port 5800 -> 192.168.1.246 port 5900

질문 2

위와 동일한 규칙을 사용하면 anchor오류가 발생하지 않습니다. 그러나 포트는 여전히 닫혀 있으며 connection refused연결을 시도하면 나타납니다. 몇 가지 조사를 한 후 포트 5800에 아무 것도 나열되지 않아 거부될 가능성이 있다는 것을 발견했습니다.

  1. 아무 것도 스누핑되는 것을 원하지 않습니다. 트래픽을 다른 컴퓨터로 전달하기만 하면 됩니다.
  2. 듣고 있음에도 불구하고 nc외부 및 내부(localhost)에서 계속 거부되어 전달되지 않습니다.

답변1

rdr오류 메시지에서 알 수 있듯이 의 다른 번역 규칙 옆에 규칙을 추가해야 합니다 pf.conf. 앵커가 이미 존재하므로 최선의 선택은 그 뒤에 규칙을 rdr두는 것입니다 .rdr

scrub-anchor "com.apple/*"
nat-anchor "com.apple/*"
rdr-anchor "com.apple/*"
rdr pass inet proto tcp to port 5800 -> 192.168.1.246 port 5900
dummynet-anchor "com.apple/*"
anchor "com.apple/*"
load anchor "com.apple" from "/etc/pf.anchors/com.apple"

( from any to any생략된 경우 암시되므로 가독성을 위해 제거했습니다)

rdr규칙은 패킷 필터에 포트 5800에 도착하는 TCP 패킷을 처리하는 방법만 알려줍니다. 일반적 으로 허용하도록 pass지시하는 규칙(예: 필터 규칙) 이 필요 하지만 이는 규칙 에 추가하기에 충분하므로 .pfpassrdrrdr pass

패킷을 전달하려면 이를 활성화 sysctl하거나 영구적으로 설정 해야 합니다 sysctl.conf( 참조 man pfctl).

$ sudo sysctl net.inet.ip.forwarding=1

관련 정보