web-dev-qa-db-ja.com

pfを使用してmacOSで単純なポート転送を設定する方法「ルールは正しい順序である必要があります:オプション、正規化、キューイング、変換、フィルタリング」

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

問題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)から拒否され、転送されません
5
JBis

エラーメッセージに示されているように、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に通知することを許可しますが、passrdrルールに追加するだけで十分なので、rdr passを使用します。

パケットを転送するには、sysctlで有効にするか、sysctl.confで永続的に設定する必要があることに注意してください(man pfctlを参照):

$ Sudo sysctl net.inet.ip.forwarding=1
4
Zé Loff