mac os xに相当するiptables


55

から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


OSXクライアントまたはサーバーのどちらを話しているのですか?
スコットパック

1
ユキヒョウです。
-nafe

192.168.99.100:80もリッスンするようにWebサーバーを構成できない理由はありますか?
ゾレダチェ

1
ポート80でリッスンする@Zoredacheはsudoを必要とし、一部のWebサーバーは、sudoで安全に実行するのに十分な速度で特権を削除しません。
ナビン

回答:


33

だから私は見つけたこれを行う方法を。それが好ましい方法かどうかはわかりませんが、動作します!お気に入りのシェルで:

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

4
IPFWはヨセミテ(MAC)上では動作しませんし、ちょっと非推奨のようだ
Vadorequest

25

Mac 10.10.2でifconfigand pfctlコマンドを使用して、これを機能させることができました。次のアプローチで、マシン上のローカルに正常にマッピング127.0.0.1:3000mydomain.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ブラウザで開くと、ローカルホストポートでホストされているサーバーが表示されます(例:)127.0.0.1:3000。基本的に、このプロセス<ip>:<port>は新しい<ip>IPにマップするため、そのIPをホストにマップできます。


1
ちょっとしたハックですが、仕事は完了です。良いショー。
ジョーイカーソン

6
ありがとうございました。エイリアスと転送をどのように元に戻しますか?
カルロスヌニェス

1
こんにちはsudo discoveryutil udnsflushcaches私に与えるcommand not foundが、それはまだエントリに正しく一致します。しかし、どうすれば2番目のポートをマップできますか?id:10.0.0.2および別のポートを使用してステップ1 + 2を実行しようとしましたが、常に最後の接続のみが必要です。だから私は、最後のない場合10.0.0.1port 3000転送し、それを3000私が最後に行った場合、10.0.0.2およびポート4000転送します4000。私には/private/etc/hosts私が(応じて)異なるIDとの両方のエントリを書きました。
アンディギガ

動作しますが、OSXを再起動すると再び必要になります。これを永久に保存するものはありますか?
キャスパー

1
更新してくださいsudo dscacheutil -flushcache
northtree

5

私も最近似たようなことをしなければならなかった、と検索でこの答えに出くわした。残念ながら、Nafeの答えipfwは、現在は非推奨であり、OSXでは使用できません。そして、Kevin Learyの答えは確かに少しハックです。それで、私は何かをより良く(よりきれいに)しなければならなかったので、後世のためにここでそれを共有することにしました。この答えは主にこの要点で言及されたアプローチに基づいています。

OPが言及しているように、192.168.99.100でブラウザをポイントすると、localhost:8000のサーバーから応答が返されます。へのエイリアスの追加ifconfigは、実際には必要ではなく、それpfctlだけで十分です。これを実現するには、pf.confファイルを/etc/pf.conf変更する必要があります。

まず、次の場所で(sudoを使用して)新しいアンカーファイルを作成します(呼び出しましょう redirection/etc/pf.anchors/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ます。pf.confsudoでファイルを開き、rdr-anchor "redirection"最後のrdr-anchor行(つまり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

そして、それはほとんどそれです。最初に無効にpfctlしてsudo pfctl -dから再起動することで、再起動しsudo pfctl -fe /etc/pf.confます。

今、これを再起動するたびに自動的に行う必要がある場合は、もう少し作業が必要です:起動デーモンをpfctl更新する必要がありますコードを見てからのケース)。(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、その他の変更は不可)。唯一の方法は、といじくり回すあるシステムの整合性の保護の設定:リカバリーモードおよび起動端子に起動します。でSIPステータスを確認しますcsrutil status。通常は有効にする必要があります。で無効にしcsrutil disableて通常モードで再起動し、上記のようにplistファイルに変更を加えます。完了したら、リカバリモードに戻り、を発行して保護を再度有効にします(正当な理由で適切に配置されていcsrutil enableます)。

説明:すでにローカルホストlo0の(デフォルト)エイリアスであるifconfigコマンドを発行することで確認でき127.0.0.1ます-この事実は、ローカルホストに余分なエイリアスを追加する必要をなくし、pf.confファイル内のデフォルトアドレスを単に使用するために使用されています。

更新:残念ながら、起動時にファイルをロードしても機能しないようです。私はまだそれをソートするための助けを得ようとしています。それまでは、起動sudo pfctl -f /etc/pf.conf後に実行するとうまくいきます。


このおかげで、これはOS X Sierraでうまくいきました。ただし、リダイレクトファイルが改行で終わることは非常に重要です。
カドリアン

System/Library/LaunchDaemons/com.apple.pfctl.plist;のようなシステムファイルを上書きするのは安全ではないようです。これはおそらく、OSの更新に耐えられないでしょうか?
トム

4

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


1

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

HTH、PEra


1

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


アドバイスをありがとう、しかし、私はその特定の問題を抱えているとは思わない(ipfwリストは私のルールとのみを表示する65535 allow ip from any to any)。
nafe

1

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

ipfw add 100 fwd 127.0.0.1,8000 tcp from any to 192.168.99.100 80

(rootとして実行していない場合は、sudoをプレフィックスとして付ける必要があります)。確認するもう1つのことは、ファイアウォールが有効になっていることです。

sysctl net.inet.ip.fw.enable

値0(オフ)で戻ってきたら、次のようにしてオンにします。

sysctl -w sysctl net.inet.ip.fw.enable=1

...そして、コンピューターの再起動時に再び有効になるように調整します。これを行う「適切な」方法は、おそらく起動アイテムを作成することですLingonはこれをかなり簡単にします)。または、PEraが言及したGUIツールのいずれかを使用して、詳細を処理します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.