猛牛哥
记录网络点滴生活

hetzner独服安装proxmox后,配置NAT网络(为单IP创建多个虚拟机做准备)

本文的前提是HETZNER家的机器已经安装好了proxmox,如果还没有安装好,请转到:https://mengniuge.com/hetzner-proxmox-install.html 查看安装步骤。本人使用的场景是单IP开NAT虚拟机,如果您购买了多个IP,就不要往下看了。

一、登陆proxmox后台后,按照下图箭头依次点击链接,进入网络设置。新建一个网络桥接接口。

proxmox网络设置

proxmox网络设置

二、填写IP和子网掩码,IP地址填写个局域网的网段地址就行,子网掩码就填255.255.255.0。其他项目不用填也不用改,保持默认(不用IPV6的情况下)。IPV6我还没有折腾过,这里暂时不设置IPV6信息。

网络接口设置

网络接口设置

三、开启系统的转发功能,很简单,执行一条命令:echo 1 > /proc/sys/net/ipv4/ip_forward

特别说明:这条命令在之前的kimsufi的机器上使用正常。但是在这家Hetzner机器上使用没有效果,创建好的虚拟机无法连接外网。直接编辑文件/etc/sysctl.conf,增加net.ipv4.ip_forward = 1,也许之前有这一行,但是有注释,取消注释就行了。保存后执行sysctl -p就会生效。实测这样执行后,不能联网的虚拟机就恢复正常了。

四、配置iptables,先设置出站的nat转发。执行的命令是:iptables -t nat -A POSTROUTING -s ‘10.20.20.0/24’ -o enp2s0 -j MASQUERADE。其中10.20.20.0根据刚才填写的IP修改。enp2s0是在“网络”页看到的配置有外网IP的那个网络接口。不同机器会有区别,例如kimsufi的机器安装proxmox后的外网接口是vmbr0。

特别说明:第三、四步的操作很多网上的教程(应该都是根据proxmox官网资料写的)都是通过写入/etc/network/interfaces文件的方式实现的(原因可能是Debian系统默认不支持保存iptables规则)。例如(官方例子):

post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up   iptables -t nat -A POSTROUTING -s '10.10.10.0/24' -o eno1 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '10.10.10.0/24' -o eno1 -j MASQUERADE

但是这种方式有2个缺点,1:每条转发规则都要配置2行,分别是post-up时添加规则和post-down时删除规则。不知道不写post-down的话会怎么样。2:修改转发规则后,必须执行service networking restart重启网卡才能使修改生效。而重启网卡会导致整机瞬间断网,如果有需要保持长连接的业务,会受到严重影响。而我之前的实际使用中,即使重启网卡新规则也不会生效,必须重启母鸡才可以。这是更加不可接受的。其实这种方式就是通过网络配置文件自动执行iptables命令而已,还不如直接设置好iptables。直接使用iptables的话,修改了转发规则会立即生效,不用重启网络,也不用每个规则需要2条命令。下一步解决Debian系统重启后无法保持iptables规则的问题。

第五步、解决Debian系统重启后不保持iptables设置的问题:

touch /etc/network/if-pre-up.d/iptables
chmod +x /etc/network/if-pre-up.d/iptables
vi /etc/network/if-pre-up.d/iptables

在打开的编辑器里面输入以下文本,然后保存退出:

#!/bin/sh
/sbin/iptables-restore < /etc/iptables

这样设置后,每次开机会从/etc/iptables读取iptables设置。修改iptables规则后,执行iptables-save > /etc/iptables这个命令就会把设置好的iptables规则保存到/etc/iptables这个文件。这样就不怕重启后丢失iptables设置了。

例如:

iptables -t nat -A PREROUTING -i enp2s0 -p tcp --dport 21 -j DNAT --to 10.20.20.102:21
iptables-save > /etc/iptables

至此,单IP开多个小鸡的网络基础准备工作已经做好了,剩下的工作就是创建小鸡并在小鸡里设置小鸡的网络了。

注意:这样设置的NAT网络,虚拟机不能通过母机的外网IP访问到该母鸡上的任何虚拟机的网络。这涉及到NAT网络的“回流”问题。解决方法请查看本博客文章:iptables回流设置方法

proxmox开小鸡的教程请点这里。

赞(0) 打赏
猛牛哥原创:猛牛哥的博客 » hetzner独服安装proxmox后,配置NAT网络(为单IP创建多个虚拟机做准备)

评论 11

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    请问大佬,如何把不同小鸡多个域名的80端口,转到母鸡的80端口?

    Jay6年前 (2018-05-30)回复
    • 好像没有办法把同一个端口转发给多个小鸡。你可以在转发了80端口的小鸡上做反代,把其他小鸡的域名反代到其对应的小鸡内网IP上。

      mengniu6年前 (2018-05-30)回复
  2. #2

    好的,谢谢!我去测试下。
    我之前直接在母鸡上安装Apache,然后在母鸡上做反代,总是出错。

    Jay6年前 (2018-05-31)回复
    • 如果NAT网络设置没错的话,在母鸡上反代应该也不会有问题,这样就不要给80端口做转发了。不知道这样会不会有“回流”的问题。我把80端口转发到小鸡时会有“回流”问题,就是小鸡无法通过外网IP访问到自己,例如小鸡需要通过域名访问自己就无法连接。这还需要通过母鸡进一步设置才能解决。
      还有就是我反代用的都是nginx,没有用过apache。

      mengniu6年前 (2018-05-31)回复
  3. #3

    按照以下配置,重启Apache后没出错,但还是不成功。看来我得试下nginx了!

    #配置站点的域名
    ServerName http://www.example.ml
    #配置站点的管理员信息
    ServerAdmin info@example.ml

    #off表示开启反向代理,on表示开启正向代理
    ProxyRequests Off
    ProxyMaxForwards 100
    ProxyPreserveHost On
    ProxyPass / http://192.168.0.9:80/
    ProxyPassReverse / http://192.168.0.9:80/

    Order Deny,Allow
    Allow from all

    #配置站点的域名
    ServerName http://www.example2.ml
    #配置站点的管理员信息
    ServerAdmin info@example2.ml

    #off表示开启反向代理,on表示开启正向代理
    ProxyRequests Off
    ProxyMaxForwards 100
    ProxyPreserveHost On
    ProxyPass / http://192.168.0.10:80/
    ProxyPassReverse / http://192.168.0.10:80/

    Order Deny,Allow
    Allow from all

    Jay6年前 (2018-05-31)回复
    • apache的反代我没用过。
      NGINX的设置例子,在vhost配置文件的server段加入:
      location / {
      proxy_pass http://192.168.0.10;
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      }

      mengniu6年前 (2018-06-01)回复
  4. #4

    谢谢!!
    用Nginx配置解析成功了。
    不过Nginx报以下警告,不知什么原因:
    Jun 02 10:01:28 srv nginx[27664]: nginx: [warn] conflicting server name “www.example1.ml” on 0.0.0.0:80, ignored
    Jun 02 10:01:28 srv nginx[27668]: nginx: [warn] conflicting server name “www.example1.ml” on 0.0.0.0:80, ignored
    Jun 02 10:01:28 srv systemd[1]: Failed to read PID from file /run/nginx.pid: Invalid argument
    Jun 02 10:01:28 srv systemd[1]: Started A high performance web server and a reverse proxy server.

    Jay6年前 (2018-06-02)回复
    • 可能有重复设置的域名

      mengniu6年前 (2018-06-02)回复
  5. #5

    配置文件如下:
    server {
    listen 80;
    server_name http://www.example1.ml;
    location /{
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-Ip $remote_addr;
    proxy_set_header X-NginX-Proxy true;
    proxy_pass http://192.168.0.9;
    proxy_redirect off;
    }
    }

    Jay6年前 (2018-06-02)回复
  6. #6

    大佬,我安装好面板之后主机网络配置那里硬件网卡eth0里面没有任何信息,添加vmbr0也没有填写子网掩码的输入框,请问下是什么问题,谷歌了好久都没找到原因,我是debian9添加软件源安装的

    star5年前 (2019-07-19)回复
    • 新版的proxmox界面设计有变。子网掩码设置项取消了。直接在IPV4输入框里面的IP地址后面增加/24就行,等效于255.255.255.0。比方说你要设置的vmbr0的ip地址是10.10.10.1,就输入10.10.10.1/24。以后新建CT虚拟机时,需要输入IP时,也没有子网掩码输入框,也是这种方式输入。

      mengniu5年前 (2019-07-21)回复

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏