# 宿主与虚拟机之间的网络问题

我们的两台宿主居然都 ping 不到虚拟机,导致后续 haproxy 代理转发后出现所有虚拟机 server 都是 down 状态

原因应该是宿主只有一个校园网网段的 ip,但是虚拟机只有实验室局域网网段的 ip

这个问题需要配置宿主节点的网络,可以在 PVE 控制面板修改 网络 / Network:

network

实际上就是编辑该节点的: /etc/network/interfaces 配置文件

应该需要配置虚拟网卡才能解决,但是我们的一台服务器有两张网卡(图中 eno1 eno2) 所以我们最后的解决方案给服务器插了多一条网线,配置该网卡 ip 为实验室局域网的 ip,从而该服务器连接上了虚拟机

# 安装 HAProxy

shell
apt isntall haproxy

或者源码编译安装

可快速上手学习、搜索问题的官网资料

# 配置 haproxy.cfg

编辑 /etc/haproxy/haproxy.cfg 配置文件,所需要的基本指令如下:

检查并重载配置文件

shell
haproxy -f /etc/haproxy/haproxy.cfg

仅检查:

shell
haproxy -f /etc/haproxy/haproxy.cfg -c

⚠️ 注意,文件最后需要有换行符结尾,否则会有报错:

shell
Missing LF on last line, file might have been truncated at position xx

重启 haproxy 服务

shell
service haproxy restart
# or
systemctl restart haproxy

配置由 5 部分组成,当然并不都是必须的: globaldefaultsfrontendbackendlisten (可能还有更多)

我们的 SSH 代理转发需求只需配置 frontendbackend 即可,我们的配置如下:

raw
frontend fe_ssh
   bind *:2222 ssl crt /etc/pve/nodes/proxmox2/pveproxy-ssl.pem
   mode tcp
   log-format "%ci:%cp [%t] %ft %b/%s %Tw/%Tc/%Tt %B %ts %ac/%fc/%bc/%sc/%rc %sq/%bq dst:%[var(sess.dst)] "
   tcp-request content set-var(sess.dst) ssl_fc_sni
   use_backend %[ssl_fc_sni]
backend server1
   mode tcp
   server s1 192.168.134.247:22 check
backend server2
   mode tcp
   server s2 192.168.134.30:22 check
backend server3
   mode tcp
   server s2 172.18.198.204:22 check
  • 其中 frontend 后面的 fe_sshbackend 后面的 server1 等都是自定义的名字;
  • 端口 bind *:2222 所指定的端口也是自定义的;跟在其后面的 ssl crt /etc/pve/nodes/proxmox2/pveproxy-ssl.pem 是指定 ssl 证书,该路径是 PVE 的通过上传的或用其提供插件自动申请的 ssl 证书所在路径。
    • haproxy 似乎只认定一个 xxx.pem 证书文件的对应 key 文件是 xxx.pem.key ,所以 key 文件需要以这个形式命名放在 pem 相同路径上

# SSH 连接

shell
ssh -o ProxyCommand="openssl s_client -quiet -connect [服务器ip]:2222 -servername [servername]" -l [登陆虚拟机用的用户名] [虚拟机主机名]

其中:

  • [服务器 ip] 即一般使用 ssh 登陆时的 @ 后面的 ip,或者主机名

  • [登陆虚拟机用的用户名] 即一般使用 ssh 登陆时的 @ 前面的用户名

  • [servername] 是 backend 指定的对应服务器名字,例如我们配置文件中的 server1 、 server2 、 server3

  • [虚拟机主机名] 可以自定义,但是最后和虚拟机主机名一致,否则以后连接会出现这样的报错:

    shell
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
    Someone could be eavesdropping on you right now (man-in-the-middle attack)!
    It is also possible that a host key has just been changed.
    The fingerprint for the ED25519 key sent by the remote host is
    SHA256:fDBSRwFB552ZiUUmekpCWrbuSdh186h4c12JdrAQxTM.
    Please contact your system administrator.
    Add correct host key in /Users/xxx/.ssh/known_hosts to get rid of this message.
    Offending ED25519 key in /Users/minamoto/.ssh/known_hosts:xx
    Host key for xxx has changed and you have requested strict checking.
    Host key verification failed.

    即连接不同的虚拟机总是需要指定不同的主机名才不会产生冲突

# Dashboard

raw
frontend stats
    mode http
    bind *:9000
    stats enable
    stats uri /stats
    stats refresh 10s
    # stats uri /stats # choose a subpath for the dashboard
    # stats admin if localhost   # enable to restrict to localhost
    # stats admin if 10.0.0.0/8  # enable to restrict to 10.x.x.x network sources
    # stats admin auth <username:password> # enable to setup basic http auth

目前发现每次修改配置文件后 dashboard 没有同步更新,除非修改 dashboard 配置的端口号,在新端口号才有同步更新了的数据

配置好后可以打开 http://node_ip:9000/stats

若想要 https 访问,则需要在 bind *:9000 后面加上 ssl 证书文件路径,否则只能 http 访问

raw
bind *:9000 ssl crt /etc/pve/nodes/proxmox2/pveproxy-ssl.pem

最终效果(图中用的是 9002 端口):

dashboard

  • reference1
  • reference2
Edited on Views times