25

vagrant 用にポート転送を設定しました

Vagrant.configure("2") do |config|
  config.vm.box = "centOS"
  config.vm.network :forwarded_port, guest: 80, host: 80
  config.vm.network :forwarded_port, guest: 8443, host: 8443
  config.vm.network :forwarded_port, guest: 8443, host: 9443
  config.vm.network :forwarded_port, guest: 8445, host: 8445
  config.vm.network :forwarded_port, guest: 8000, host: 8000 
  config.vm.hostname = "www.vagrant.com"
end

vagrant 仮想ボックスからポート 80 が開いています

[vagrant@www ~]$ nmap -sT 0.0.0.0 -p 80 

Starting Nmap 5.51 ( http://nmap.org ) at 2013-07-02 22:25 UTC
Nmap scan report for 0.0.0.0
Host is up (0.000063s latency).
PORT   STATE SERVICE
80/tcp open  http

しかし、それは私のホストマシンから閉じられています

Ben-Fischer:~ bfischer$ nmap -sT 0.0.0.0 -p 80 

Starting Nmap 6.25 ( http://nmap.org ) at 2013-07-02 17:38 CDT
Nmap scan report for 0.0.0.0
Host is up (0.000086s latency).
PORT   STATE  SERVICE
80/tcp closed http

ホスト マシンのポート 80 でリッスンしているものは他にありません

Ben-Fischer:~ bfischer$ sudo lsof -n -i4TCP:80 | grep LISTEN
[no output]

iptables がオフで、Mac ファイアウォールもオフです

[vagrant@www ~]$ sudo service iptables stop

そして、他のすべての転送ポートは正常に動作します (8443,9443,8445,8000)

ボックスは vagrant、centOS 6.3 withchef のイメージです。

では、ローカル マシンからポート 80 に接続できないのはなぜですか?

4

7 に答える 7

40

VirtualBoxがホスト上で実行されていない限り、1024未満のホストポートに転送できないと思いますroot

VirtualBox マニュアルでは、NAT モードの制限について次のように述べています。

ホスト ポートの転送 < 1024は不可能です:

Unix ベースのホスト (Linux、Solaris、Mac OS X など) では、ルートによって実行されていないアプリケーションから 1024 未満のポートにバインドすることはできません。その結果、そのようなポート フォワーディングを構成しようとすると、VM は起動を拒否します。

これらの制限は通常、標準的なネットワークの使用には影響しません。しかし、NAT の存在には微妙な影響があり、通常は機能するプロトコルに干渉する可能性があります。1 つの例は NFS です。NFS では、非特権ポート (つまり、1024 未満のポート) からの接続を拒否するようにサーバーが構成されていることがよくあります。

于 2013-07-02T23:53:00.463 に答える
25

テリーの答えは問題を正しく診断しました。これが私の解決策です:

root として VirtualBox を実行する代わりに、ポートを 2 回転送します。ホスト: 8080 をゲスト: 80 に転送するように vagrant をセットアップします。これをホスト マシンのポート転送ルールと組み合わせて (ipfw ユーティリティを使用)、80 がホスト マシンの 8080 になるようにします。次に、8080 がゲスト マシンの 80 に送り返されます。

複雑に見えますが、この記事ではセットアップをより明確に説明しています http://www.dmuth.org/node/1404/web-development-port-80-and-443-vagrant

于 2013-07-03T18:21:19.733 に答える
13

私のマシン (Arch Linux) にインストールしていない ipfw を使用する代わりに、SSH を使用できます。

ゲストのポート 80 で Web サーバーを実行している場合は、SSH を使用してバックグラウンドでポート転送を実行できます。

sudo ssh -p 2222 -gNfL 80:localhost:80 vagrant@localhost -i ~/.vagrant.d/insecure_private_key
于 2014-03-12T14:48:47.800 に答える
7

アップデート:

ipfwOS X Mavericks で非推奨になりました。pfctl代わりに使用する必要があります。ここでこれを達成する方法について詳しく説明した記事を書きました。

http://salvatore.garbesi.com/vagrant-port-forwarding-on-mac/


ターミナル経由の Mac OS X の場合:

sudo ipfw add 100 fwd 127.0.0.1,8080 tcp from any from me 80 in

これにより、127.0.0.1:80 のすべての受信トラフィックが 127.0.0.1:8080 にリダイレクトされます。

于 2014-04-07T01:48:49.717 に答える
4

ブリッジ アダプタを使用して、localhost を使用する代わりにローカル IP アドレスを指定できます。これはホストによって異なる可能性があるため (使用中のローカル IP アドレスなど)、すべてを外部config.ymlファイルに入れます。

# ...

require 'yaml'

current_dir    = File.dirname(File.expand_path(__FILE__))
configs        = YAML.load_file("#{current_dir}/config.yml")
vagrant_config = configs['config'][configs['config']['use']]

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

# http://docs.vagrantup.com/v2/virtualbox/networking.html
config.vm.network vagrant_config['vm']['network_type'],
    ip: vagrant_config['vm']['network_ip'],
    bridge: vagrant_config['vm']['network_bridge'],
    virtualbox__intnet: vagrant_config['vm']['network_intnet']
config.vm.network "forwarded_port", 
    guest: 80, 
    host: vagrant_config['http_server']['host_port']

# ...

config.yml ファイルに従います。

config:
    use: "public"
    private: # this is the old configuration that doesn't let you forward on port 80
    vb:
        cpus: 2
        memory: 4096
    vm:
        network_type: "private_network"
        network_ip: "192.168.33.10"
        network_intnet: true
        network_bridge: ""
        synced_folder: "/home/francesco/whatever/vagrant-synced-folder"
    http_server:
        host_port: 8080
    public: # here follows the new bridged configuration that let you use port 80!
    vb:
        cpus: 2
        memory: 4096
    vm:
        network_type: "public_network"
        network_ip: "192.168.1.123"
        network_intnet: false
        network_bridge: "eth0" # or whatever is your adapter name!
        synced_folder: "/home/francesco/whatever/vagrant-synced-folder"
    http_server:
        host_port: 80

次に、次の場所に移動してhttp://192.168.1.123:80/ください:-)

于 2015-04-22T11:21:16.267 に答える
3

OSX 上の Vagrant のポート転送: ipfw は減価償却されます

@sgarbesi の応答に加えて、ipfw は OS X Mavericks の時点で実際に減価償却されました。残念ながら、リンクが壊れているように見えるため、彼が投稿したソリューションにアクセスできませんでした.

ただし、彼はここで説明されているソリューションでクレジットされています: https://www.danpurdy.co.uk/web-development/osx-yosemite-port-forwarding-for-vagrant/

誰かに役立つことを期待して、完全を期すためにここにソリューションを貼り付けています。

VM でポート フォワーディングを設定する

Vagrant のドキュメントに従って、Vagrantfile に以下を追加します。

config.vm.network "forwarded_port", guest: 80, host: 8080 config.vm.network "forwarded_port", guest: 443, host: 4443

Vagrant トリガーをインストールする

vagrant-triggers をインストールするには、ターミナル ウィンドウで Vagrantfile が保存されているフォルダーに移動し、次のコマンドを実行する必要があります。

vagrant plugin install vagrant-triggers

Vagrant Triggers を使用してポート転送を自動的に有効にする

以下を Vagrantfile に追加します。

config.trigger.after [:provision, :up, :reload] do
      system('echo "
        rdr pass on lo0 inet proto tcp from any to 127.0.0.1 port 80 -> 127.0.0.1 port 8080  
        rdr pass on lo0 inet proto tcp from any to 127.0.0.1 port 443 -> 127.0.0.1 port 4443
  " | sudo pfctl -ef - > /dev/null 2>&1; echo "==> Fowarding Ports: 80 -> 8080, 443 -> 4443 & Enabling pf"')  
  end

  config.trigger.after [:halt, :destroy] do
    system("sudo pfctl -df /etc/pf.conf > /dev/null 2>&1; echo '==> Removing Port Forwarding & Disabling pf'")
  end

これにより、ポート 80 と 443 がそれぞれ Vagrant プロビジョニングのポート 8080 と 4443 にバインドされ、アップとリロードされ、停止または破棄時に削除されます。pf は OSX ではデフォルトで有効になっていないため、ルールを追加して pf を有効にするときに -e フラグを渡し、ポート フォワーディングを削除するときに再度無効にするために -d フラグを渡します。

于 2017-09-14T12:03:00.173 に答える