macos - para - Vagrant no reenviará SOLAMENTE el puerto 80
vagrant manual (7)
Reenvío de puertos para Vagrant en OSX: ipfw se deprecia
Además de la respuesta de @ sgarbesi, ipfw se depreció a partir de OS X Mavericks. Lamentablemente no pude acceder a la solución que publicó, ya que el enlace parece estar roto.
Sin embargo, se le acredita en la solución que se describe aquí: https://www.danpurdy.co.uk/web-development/osx-yosemite-port-forwarding-for-vagrant/
Estoy pegando la solución aquí para completarla, con la esperanza de que ayude a alguien:
Configurar el control de puertos en la máquina virtual
Agregue lo siguiente a su Vagrantfile, según la documentación de Vagrant :
config.vm.network "forwarded_port", guest: 80, host: 8080 config.vm.network "forwarded_port", guest: 443, host: 4443
Instalar disparadores Vagrant
Para instalar vagrant-triggers, debe navegar en una ventana de terminal a la carpeta donde se guarda su Vagrantfile y ejecutar el siguiente comando:
vagrant plugin install vagrant-triggers
Use Vagrant Triggers para habilitar automáticamente el reenvío de puertos
Agregue lo siguiente a su 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
Esto une los puertos 80 y 443 a los puertos 8080 y 4443, respectivamente, en Vagrant Provision, los carga y vuelve a cargar y los elimina al detenerlos o destruirlos. Tenga en cuenta que pf no está habilitado de forma predeterminada en OSX, por lo que pasamos la marca -e cuando agregamos las reglas para habilitar pf y la bandera -d para deshabilitarla nuevamente cuando eliminamos el reenvío de puertos.
He configurado el reenvío de puertos para 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
El puerto 80 está abierto desde mi caja virtual errante
[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
Pero está cerrado desde mi máquina host
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
Nada más está escuchando en el puerto 80 en mi máquina host
Ben-Fischer:~ bfischer$ sudo lsof -n -i4TCP:80 | grep LISTEN
[no output]
Las iptables están apagadas y mi cortafuegos mac
[vagrant@www ~]$ sudo service iptables stop
Y todos los demás puertos reenviados funcionan bien (8443,9443,8445,8000)
La caja es una imagen de vagrant, centOS 6.3 con chef.
Entonces ... ¿por qué no puedo conectarme al puerto 80 desde mi máquina local?
La respuesta de Terry diagnosticó correctamente el problema. Aquí está mi solución:
En lugar de ejecutar VirtualBox como root, reenvíe el puerto dos veces. Configure vagrant para reenviar el host: 8080 a guest: 80. Combine eso con algunas reglas de reenvío de puertos en la máquina host (usando la utilidad ipfw) para que 80 pase a 8080 en la máquina host. Luego, 8080 se enviará de vuelta a 80 en la máquina invitada.
Parece complicado, pero este artículo describe la configuración con mayor claridad http://www.dmuth.org/node/1404/web-development-port-80-and-443-vagrant
No creo que pueda reenviar a puertos de host <1024, a menos que VirtualBox se ejecute como root
en el host.
El Manual de VirtualBox dice esto acerca de la limitación del modo NAT:
Reenvío de puertos host <1024 imposible :
En hosts basados en Unix (por ejemplo, Linux, Solaris, Mac OS X) no es posible enlazar a puertos por debajo de 1024 desde aplicaciones que no son ejecutadas por root. Como resultado, si intenta configurar dicho reenvío de puerto, la máquina virtual se negará a iniciar.
Estas limitaciones normalmente no afectan el uso estándar de la red. Pero la presencia de NAT tiene efectos sutiles que pueden interferir con los protocolos que normalmente funcionan. Un ejemplo es NFS, donde el servidor a menudo está configurado para rechazar las conexiones de puertos no privilegiados (es decir, puertos por debajo de 1024).
Puede configurar el reenvío de puertos en VirtualBox:
Su VM -> Configuración -> Red -> Avanzada -> reenvío de puertos
Aquí puedes agregar los puertos que necesites.
Puede usar un adaptador de puente y luego apuntar a la dirección IP local en lugar de usar localhost. Ya que esto puede variar según el host (como la dirección IP local en uso, etc.) pondré todo en un archivo config.yml
externo.
# ...
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'']
# ...
Sigue el archivo 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
Luego solo ve a http://192.168.1.123:80/
:-)
Una alternativa al uso de ipfw, que no tenía instalado en mi máquina (Arch Linux), es SSH.
Si está ejecutando el servidor web en el puerto 80 en el invitado, puede ejecutar un puerto hacia adelante en segundo plano utilizando SSH.
sudo ssh -p 2222 -gNfL 80:localhost:80 vagrant@localhost -i ~/.vagrant.d/insecure_private_key
ACTUALIZAR:
ipfw
ha quedado en desuso a partir de OS X Mavericks. Deberías estar usando pfctl
lugar. Escribí un artículo que explica en detalle cómo lograr esto aquí:
http://salvatore.garbesi.com/vagrant-port-forwarding-on-mac/
En Mac OS X a través de Terminal:
sudo ipfw add 100 fwd 127.0.0.1,8080 tcp de cualquiera 80 me
Esto redireccionará todo el tráfico entrante en 127.0.0.1:80 a 127.0.0.1:8080