web-dev-qa-db-ja.com

Vagrantはポート80のみを転送しません

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

ポート80は私のvagrant virtual boxから開いています

[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)

ボックスは、シェフと一緒に浮浪者、centOS 6.3からの画像です。

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

23
Ben Fischer

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

VirtualBox Manual はこれについてNATモードの制限:

転送ホストポート<1024不可能

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

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

38
Terry Wang

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

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

入り組んでいるようですが、この記事では設定をより明確に説明しています http://www.dmuth.org/node/1404/web-development-port-80-and-443-vagrant

23
The Q CS or GS

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

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

Sudo ssh -p 2222 -gNfL 80:localhost:80 vagrant@localhost -i ~/.vagrant.d/insecure_private_key
12
Dave Parrish

UPDATE:

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

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


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

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

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

7
sgarbesi

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/にアクセスします:-)

4

OSX上のVagrantのポート転送:ipfwが廃止されました

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

彼はここで説明されているソリューションで信用されています: 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 Triggersをインストールする

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

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

3
colin

VirtualBoxへのポート転送を構成できます。

あなたのVM->設定->ネットワーク->詳細->ポート転送

ここで、必要なポートを追加できます。

0
redflasher