web-dev-qa-db-ja.com

mac os xに相当するiptables

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で実行している開発サーバーから応答を返すことです)

60
nafe

だから私は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
35
nafe

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をホストにマップできます。

28
Kevin Leary

私も最近同様のことをしなければならず、検索でこの答えが出てきました。残念ながら、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を実行するとうまくいきます。

6
Yogesch

これは私にとってうまくいきました:

4
Colin Sullivan

10.5以降、OS Xにはipfwではなく、新しいアプリケーション指向のファイアウォールが付属しています。しかし、ipfwはまだインストールされています。構文に問題がある場合は、WaterRoofFlying Buttressなどのグラフィカルフロントエンドを確認してください。

HTH、PEra

1
PEra

ルールの順序は重要です。許可ルールの前に「すべて拒否」などがないことを確認してください。

1
monomyth

コマンドにルール番号がないようです。試してください:

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つを使用して、詳細を処理させます。

1
Gordon Davisson