pf
を使用して、Mac Aのポート5800からポート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
ルールを/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
上記と同じルールでanchor
を使用しても、エラーは発生しません。ただし、ポートはまだ閉じられており、接続しようとするとconnection refused
が表示されます。いくつかの調査を行った後、ポート5800に何もリストされていない可能性があるため、拒否されましたが、
nc
がリッスンしている場合でも、外部および内部(localhost)から拒否され、転送されませんエラーメッセージに示されているように、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
ルールは、TCPポート5800に到着したパケットをどうするかをパケットフィルターに指示するだけです。通常、pass
ルール(つまりフィルタリングルール)を使用してpf
に通知することを許可しますが、pass
をrdr
ルールに追加するだけで十分なので、rdr pass
を使用します。
パケットを転送するには、sysctl
で有効にするか、sysctl.conf
で永続的に設定する必要があることに注意してください(man pfctl
を参照):
$ Sudo sysctl net.inet.ip.forwarding=1