192.168.99.100:80
から127.0.0.1:8000
にリクエストを転送したい。これは、Linuxでiptables
を使用して行う方法です。
iptables -t nat -A OUTPUT -p tcp --dport 80 -d 192.168.99.100 -j DNAT --to-destination 127.0.0.1:8000
MacOS Xで同じことをするにはどうすればよいですか? ipfw
コマンドの組み合わせを試してみましたが、あまりうまくいきませんでした。
ipfw add fwd 127.0.0.1,8000 tcp from any to 192.168.99.100 80
(私にとっての成功は、ブラウザをhttp://192.168.99.100
に向け、私がlocalhost:8000
で実行している開発サーバーから応答を返すことです)
だから私はaこれを行う方法を見つけました。それが望ましい方法かどうかはわかりませんが、うまくいきます!お気に入りのシェルで:
Sudo ifconfig lo0 10.0.0.1 alias
Sudo ipfw add fwd 127.0.0.1,9090 tcp from me to 10.0.0.1 dst-port 80
(lo0
のエイリアスが欠落しているようです)
(偽の)ドメインがこの新しいエイリアスを指すようにする場合は、/ etc/hostsに次の行が含まれていることを確認してください。
10.0.0.1 www.your-domain.com
Mac 10.10.2でifconfig
およびpfctl
コマンドを使用してこれを機能させることができました。次のアプローチで、127.0.0.1:3000
を自分のマシンのローカルでmydomain.com
に正常にマッピングしています。
コマンドラインに次の2つのコマンドを入力して、接続を127.0.0.1:3000
から10.0.0.1
に転送します。
Sudo ifconfig lo0 10.0.0.1 alias
echo "rdr pass on lo0 inet proto tcp from any to 10.0.0.1 port 80 -> 127.0.0.1 port 3000" | Sudo pfctl -ef -
次に、/etc/hosts
または/private/etc/hosts
ファイルを編集し、次の行を追加して、ドメインを10.0.0.1
にマッピングします。
10.0.0.1 mydomain.com
Hostsファイルを保存したら、ローカルDNSをフラッシュします。
Sudo discoveryutil udnsflushcaches
ブラウザでmydomain.com
を開くと、localhostポートでホストされているサーバー(つまり、127.0.0.1:3000
)が表示されます。基本的に、このプロセスは<ip>:<port>
を新しい<ip>
にマップするため、IPをホストにマップできます。
私も最近同様のことをしなければならず、検索でこの答えが出てきました。残念ながら、Nafeの答えはipfw
を使用しています。これは現在非推奨であり、OSXでは使用できません。ケビン・リアリーの答えは確かに少しハックです。だから私はより良いもの(よりきれいなもの)を作る必要があり、後世のためにここでそれを共有することにしました。この回答は、主に this Gist で言及されているアプローチに基づいています。
OPが言及しているように、ブラウザーを192.168.99.100に向けると、localhost:8000にあるサーバーから応答が返されます。 ifconfig
にエイリアスを追加する必要はありません。pfctl
だけで十分です。これを実現するには、pf.conf
の/etc/pf.conf
ファイルを変更する必要があります。
最初に、(Sudoを使用して)/etc/pf.anchors/redirection
で新しいアンカーファイル(redirection
と呼びます)を作成します。これは基本的に通常のテキストファイルであり、次の行が含まれています(Kevin Learyの回答と同様):rdr pass on lo0 inet proto tcp from any to 192.168.99.100 port = 80 -> 127.0.0.1 port 8000
。新しいアンカーファイルを作成したら、pf.conf
ファイル内で参照する必要があります。 Sudoでpf.conf
ファイルを開き、最後のrdr-anchor行(rdr-anchor "redirection"
)の後にrdr-anchor "com.Apple/*"
を追加し、最後にload anchor "redirection" from "/etc/pf.anchors/redirection"
を追加します。
最終的に、これはpf.confファイルが次のようになるはずです。
scrub-anchor "com.Apple/*"
nat-anchor "com.Apple/*"
rdr-anchor "com.Apple/*"
rdr-anchor "redirection" #added for redirection/port forwarding
dummynet-anchor "com.Apple/*"
anchor "com.Apple/*"
load anchor "com.Apple" from "/etc/pf.anchors/com.Apple"
load anchor "pow" from "/etc/pf.anchors/redirection" #added for redirection/port forwarding
そして、それはほとんどそれです。最初にSudo pfctl -d
を発行して無効にし、次にSudo pfctl -fe /etc/pf.conf
を発行してpfctl
を再起動します。
ここで、再起動のたびにこれを自動的に行う必要がある場合は、別の小さな作業を行う必要があります。pfctl
の起動デーモンを更新する必要があります(参照されているGistは、起動時にpfが自動的に有効になると述べていますが、これはコードを見てからのケースです)。 (Sudoで)System/Library/LaunchDaemons/com.Apple.pfctl.plist
を開き、これを探します。
<array>
<string>pfctl</string>
<string>-f</string>
<string>/etc/pf.conf</string>
</array>
そして<string>-e</string>
という行を追加して、最終的には次のようにします。
<array>
<string>pfctl</string>
<string>-e</string>
<string>-f</string>
<string>/etc/pf.conf</string>
</array>
それでうまくいくはずです。
警告:Appleでは、このように起動デーモンファイルを変更することはできなくなりました(Sudo、chmod、 onlyの方法は System Integrity Protection の設定をいじくり回すことです:リカバリモードで起動してターミナルを起動します。SIP csrutil status
でステータスを確認してください。通常は有効になっているはずです。csrutil disable
で無効にし、通常モードで再起動してから、次のようにplistファイルに変更を加えます。上記で説明しました。完了したら、リカバリモードに戻り、csrutil enable
を発行して保護を再度有効にします(正当な理由により、保護が有効になっています)。
説明:ifconfig
コマンドを発行して、127.0.0.1
が既にlocalhost lo0の(デフォルト)エイリアスであることを確認できます。この事実は、localhostのエイリアスを追加する必要がないように使用されています。 pf.conf
ファイルのデフォルトアドレスを使用するだけです。
更新:残念ながら、起動時にファイルをロードできないようです。私はまだそれを分類するために助けを得ようとしています。それまでは、起動後にSudo pfctl -f /etc/pf.conf
を実行するとうまくいきます。
これは私にとってうまくいきました:
ここで説明するように、スタートアップファイルに次の行を追加します。 http://xeiam.com/port-forwarding-80-to-8080-using-ipfw-on-mac-os-x/
add 100 fwd 127.0.0.1,8080 tcp from any to any 80 in
10.5以降、OS Xにはipfw
ではなく、新しいアプリケーション指向のファイアウォールが付属しています。しかし、ipfwはまだインストールされています。構文に問題がある場合は、WaterRoof
やFlying Buttress
などのグラフィカルフロントエンドを確認してください。
HTH、PEra
ルールの順序は重要です。許可ルールの前に「すべて拒否」などがないことを確認してください。
コマンドにルール番号がないようです。試してください:
ipfw add 100 fwd 127.0.0.1,8000 tcp from any to 192.168.99.100 80
(ルートとして実行していない場合は、プレフィックスにSudoを付ける必要があります)。確認するもう1つのことは、ファイアウォールが有効になっていることです。
sysctl net.inet.ip.fw.enable
値が0(オフ)の場合は、次のコマンドでオンにします。
sysctl -w sysctl net.inet.ip.fw.enable=1
...そして、コンピュータが再起動したときに再び有効になるように調整します。これを行う「適切な」方法は、おそらく launchd item を作成することです( Lingon はこれをかなり簡単にします)。または、PEraが言及したGUIツールの1つを使用して、詳細を処理させます。