macOSでのインターネット共有は、(内部で)2つ以上のインターフェイスを含むブリッジデバイスを作成し、DHCPサーバーをアクティブにし、さまざまなpfルールを設定し、pfを有効にすることによって行われます。
すべてのルールを印刷するには、次のシェルスクリプトを実行する必要があります。
pfdump.sh:
#!/bin/bash
function pfprint() {
if [ -n "$1" ];then
sudo pfctl -a "$2" -s"$1" 2>/dev/null
else
sudo pfctl -s"$1" 2>/dev/null
fi
}
function print_all() {
local p=$(printf "%-40s" $1)
(
pfprint r "$1" | sed "s,^,r ,"
pfprint n "$1" | sed "s,^,n ,"
pfprint A "$1" | sed "s,^,A ,"
) | sed "s,^,$p,"
for a in `pfprint A "$1"`; do
print_all "$a"
done
}
print_all
デフォルトでは、pfは次のpfダンプで無効になっています。
r scrub-anchor "com.apple/*" all fragment reassemble
r anchor "com.apple/*" all
n nat-anchor "com.apple/*" all
n rdr-anchor "com.apple/*" all
A com.apple
com.apple r anchor "200.AirDrop/*" all
com.apple r anchor "250.ApplicationFirewall/*" all
com.apple A com.apple/200.AirDrop
com.apple A com.apple/250.ApplicationFirewall
インターネット共有をアクティブにすると、pfが有効になり、ダンプは次のようになります。
r scrub-anchor "com.apple/*" all fragment reassemble
r scrub-anchor "com.apple.internet-sharing" all fragment reassemble
r anchor "com.apple/*" all
r anchor "com.apple.internet-sharing" all
n nat-anchor "com.apple/*" all
n nat-anchor "com.apple.internet-sharing" all
n rdr-anchor "com.apple/*" all
n rdr-anchor "com.apple.internet-sharing" all
A com.apple
A com.apple.internet-sharing
com.apple r anchor "200.AirDrop/*" all
com.apple r anchor "250.ApplicationFirewall/*" all
com.apple A com.apple/200.AirDrop
com.apple A com.apple/250.ApplicationFirewall
com.apple.internet-sharing r scrub-anchor "base_v4" all fragment reassemble
com.apple.internet-sharing r anchor "base_v4" all
com.apple.internet-sharing n nat-anchor "base_v4" all
com.apple.internet-sharing n rdr-anchor "base_v4" all
com.apple.internet-sharing A com.apple.internet-sharing/base_v4
com.apple.internet-sharing/base_v4 r scrub on en1 all no-df fragment reassemble
com.apple.internet-sharing/base_v4 r scrub on bridge100 all no-df max-mss 1460 fragment reassemble
com.apple.internet-sharing/base_v4 r scrub on bridge100 proto esp all no-df fragment reassemble
com.apple.internet-sharing/base_v4 r pass on en1 all flags any keep state
com.apple.internet-sharing/base_v4 r pass on en1 proto esp all no state
com.apple.internet-sharing/base_v4 r pass on bridge100 all flags any keep state rtable 6
com.apple.internet-sharing/base_v4 n nat on en1 inet from 192.168.2.0/24 to any -> (en1:0) extfilter ei
com.apple.internet-sharing/base_v4 n no nat on bridge100 inet from 192.168.2.1 to 192.168.2.0/24
com.apple.internet-sharing/base_v4 n rdr on bridge100 inet proto tcp from 192.168.2.0/24 to any port = 21 -> 127.0.0.1 port 8021
ここで、en1は外部インターフェイス(内部ネットワークと共有するインターフェイス)であり、192.168.2.0 / 24はDHCPサーバーによって提供される内部ネットワークです。両方とも環境によって異なる場合があります。
インターネット共有を有効にして内部サーバーを公開するには、外部インターフェイスのポートをサーバーのIPおよびサービスポートに転送する必要があります。
Terminal.appに入力して、ルーター(Mac Pro)でrdrルールを作成します。
sudo nano /private/etc/pf-rdr.rule
およびコンテンツ:
rdr on en1 inet proto tcp from any to 152.1.2.3 port = 9999 -> 192.168.2.3 port 80
en1が外部インターフェイス、152.1.2.3:9999がIP:port、192.168.2.3:80が内部サーバーのIP:portであると仮定します。外部インターフェイスのデバイス識別子(およびIP)を取得するifconfig
には、Mac Proに入力します。
次に、起動デーモンを作成します。
sudo nano /Library/LaunchDaemons/org.user.pfrdr.plist
コンテンツで:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Disabled</key>
<false/>
<key>Label</key>
<string>org.user.pfrdr</string>
<key>ProgramArguments</key>
<array>
<string>/sbin/pfctl</string>
<string>-a</string>
<string>com.apple/portforwarding</string>
<string>-f</string>
<string>/private/etc/pf-rdr.rule</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StandardErrorPath</key>
<string>/Library/Logs/org.usr.pfrdr.log</string>
<key>StandardOutPath</key>
<string>/Library/Logs/org.usr.pfrdr.log</string>
</dict>
</plist>
デーモンを起動します:
sudo launchctl load /Library/LaunchDaemons/org.user.pfrdr.plist
これにより、com.appleアンカーに2番目のrdrルールがpfに追加され、外部ポートが内部ホストに転送されます。
DHCPはIPアドレスを動的に割り当てるため、内部サーバーに固定IPを定義することも役立ちます。
ルーター(Mac Pro)にファイルbootptabを作成します。
sudo nano /etc/bootptab
コンテンツで:
# Bootptab file
# Section 1 -- ignored
%%
# Section 2 -- used
# Hardware types: 1=Ethernet, 6=Wireless
# See http://www.ietf.org/rfc/rfc1700.txt
#
# machine entries have the following format:
#
# hostname hwtype hwaddr ipaddr bootfile
your-nas-ethernet 1 c4:2c:03:3a:7f:65 192.168.2.3 boot
a-wireless-machine 6 60:33:4b:27:6c:62 192.168.2.4 boot
another-ethernet 1 00:0d:93:72:e7:96 192.168.2.2 boot
MACアドレス(hwaddr)とハードウェアタイプ(hwtype)を、ここの環境で見つかった適切なものに置き換えます。ifconfig
各ホストに入力することにより、MACアドレスを取得できます。その後、ルーター(Mac Pro)を再起動します。
セキュリティへの影響:
Mac Proをルーターとして使用することにより、インターネットに公開され、そのように脆弱になります。インターネット共有を有効にした後に実行されるPfには、ブロック規則はまったくありません。より安全な(そして機能する)ルールを追加する必要があります。
公開したIPは152.1.0.0/16に属します。これは、ノースカロライナ州立大学(NCSU)に割り当てられたIPブロックです。大学がこのネットワークにセキュリティ対策を適用し、他のネットワーク(または「全体」インターネット)からのアクセスを防止している可能性があります。