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에 아무 것도 나열되지 않아 거부될 가능성이 있다는 것을 발견했습니다.
- 아무 것도 스누핑되는 것을 원하지 않습니다. 트래픽을 다른 컴퓨터로 전달하기만 하면 됩니다.
- 듣고 있음에도 불구하고
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
지시하는 규칙(예: 필터 규칙) 이 필요 하지만 이는 규칙 에 추가하기에 충분하므로 .pf
pass
rdr
rdr pass
패킷을 전달하려면 이를 활성화 sysctl
하거나 영구적으로 설정 해야 합니다 sysctl.conf
( 참조 man pfctl
).
$ sudo sysctl net.inet.ip.forwarding=1