筆記 : proxmox ve 下用 OpenVZ 安裝 CentOS 的一些小眉角

這幾天玩 proxmox ve 來裝 CentOS 其實碰到許多問題 , 所以寫下心得

由於 OpenVZ 必須要有所謂的 template 檔案才能模擬出各種 Linux 環境 , 所以必須要去下載  , proxmox ve 的管理介面裡頭是有一些現成 , 但都是 32bit , 若要安裝 64bit 的 CentOS , 則必須到 OpenVZ 官方網站下載

http://wiki.openvz.org/Download/template/precreated

但下載回來後發現用 proxmox ve 上傳 template 檔案是會發生錯誤的 , 因為它要求 template 檔案的檔案命名方式必須符合它的規定

--__(i386|amd64).tar.gz

所以下載回來的 CentOS 5.4 64bit 的 template 檔案可以改成如 centos-5-default_5.2-1_amd64.tar.gz , 名稱只要符合規則就好 , 看個人喜好 , 然後再把這個檔案透過 proxmox ve 管理介面上傳上去即可以使用

在創建 OpenVZ 虛擬環境的過程 , 若網卡選擇 bridge 模式 , 在建立好之後 , 其實該虛擬機的網路是起不來的

雖然在虛擬的 CentOS 下有 /etc/sysconfig/network-scripts/ifcfg-venet0 這個檔 , 當初我以為這就是虛擬網卡設定 ... 但我錯了 , 搞了許久都無法啟動 , 後來將檔案名稱改成 ifcfg-eth0 , 並將 ifcfg-eth0 裡面的 DEVICE=venet0 改成 eth0 , 然後重新執行 /etc/rc.d/init.d/network restart
 , 這樣就可以正常運作了

當然網路通了之後 , 可以用 yum 來進行各種軟體安裝及更新 , 但後來又發現 iptables 不能用 , 因為 CentOS 預設的 iptables 設定工具 system-config-securitylevel-tui 這個套件若有安裝 , 透過 setup 去設定防火牆會無法生效的 , 後來查一查 , 原因是 proxymox 沒有載入一些 CentOS 或 RHEL 常用的 iptables 模組 , 所以必須修改 proxymox ve 下的 /etc/vz/vz.conf

找到一行  IPTABLES="ipt_REJECT ipt_tos ..........

這一行是設定 OpenVZ 下會載入 iptables 那些 modules , 我則是修改成

IPTABLES="ipt_REJECT ipt_tos ipt_TOS ipt_LOG ip_conntrack ipt_limit ipt_multiport iptable_filter iptable_mangle ipt_TCPMSS ipt_tcpmss ipt_ttl ipt_length ipt_state iptable_nat ip_nat_ftp"

然後要重啟 vz 這個 service , /etc/init.d/vz restart , 不然就重開機

接下來還要修改一下 CentOS 下的 /etc/sysconfig/iptables-config , 將 IPTABLES_MODULES="ip_conntrack_netbios_ns" 改為 IPTABLES_MODULES="" 以及將 IPTABLES_MODULES_UNLOAD="yes" 改為 IPTABLES_MODULES_UNLOAD="no"

這樣子 OpenVZ 下的 CentOS iptables 就可以正常運作了

到目前為止 , 我的網站運作在 OpenVZ 下很正常很順暢 , LAMP 架構基本上用 OpenVZ 來虛擬就很棒了 , 若要玩 X-Windows 或有牽扯到 kernel modules 的應用程式才有必要採用 KVM 來建立虛擬機

20 則評論在 筆記 : proxmox ve 下用 OpenVZ 安裝 CentOS 的一些小眉角.

  1. 怎會 ?
    如果你是 CentOS
    檢查一下 /etc/sysconfig/network-scripts/ifcfg-eth0
    看看是否有這行
    ONBOOT=yes
    如果你沒有設定 ONBOOT=yes , 那麼下次重啟你的 Openvz 模擬的CentOS就看不到了

  2. 終於好了原來是我沒選 Bridge Mode(我也太豬頭了)。請問一下你家內部的網路有用 DNS Forwarding 嗎?因為有多個 VMs 可是只有一個 IP 地址,不知道除了用 PFsense Router 外還有什麼辦法~?

  3. @rogerger
    我沒用耶 !
    我家也只有一個 IP
    但通常我會弄一個 pptpd vpn , 連回家之後 , 就可通行無阻了

    如果你想要做 web , 虛擬出好多個 vps , 也許你可以試試弄台虛擬的 ubuntu server 最新版
    這台 ubuntu server 版就對應到你的真實 IP
    並且手動編譯 haproxy 安裝於 ubuntu server , 將 haproxy 編譯成支援 transparent 模式
    然後就可以針對 domain name 導到不同的 ip , 而且是走 transparent 模式 , web server 的 log 看到的都是真實 ip
    之所以不跟你說 haproxy 安裝在 centos 是因為 centos 5.x kernel 太舊不支援 TProxy 所以無法讓 haproxy 走 transparent 模式
    但 RHEL6 正式版已經出來, 等 CentOS6 出來後 , 也會支援 TProxy

  4. 您好:
    不好意思又來打擾了。現在用 ubuntu server 並且有將 nf_tproxy_core module 載入,但是只要使用 trasparent mode (已編譯到 haproxy 中),並在 haproxy.cnf 中加入 source 0.0.0.0 usesrc clientip 這一行就會出現 Error 503 Service Unavailable 當嘗試連結。拿掉這一行(取消 tproxy 就正常),不知道您有沒有遇過相同問題呢?謝謝。

  5. 謝謝,可以了!!現在 haproxy 那台機有兩個 Bridge Interfaces,eth0 接原來的 subnet,eth1 接新的 subnet,新建的 webserver 使用新的 subnet 並把 gateway 連到 haproxy 的 private ip。不好意思我對網路不太懂。有一些問題想請教一下。(觀念不是很好)

    因為新的 webserver 虛擬機使用的 subnet 不同,所以原先 subnet 中的機器無法直接連接到 webserver,必須透過 haproxy 再連接到 webserver,這個是正常的嗎?有沒有解決的辦法。

  6. 為何你要把 web server 弄成不同的 subnet 呢 ?

    如果說要讓 web server 在區網內好管理 , 而 haproxy 要給外面的人連
    那照理說
    haproxy 應該是有一張卡對內 一張卡對外 , 假設 eth0 是對外的 ip , eth1 就是與區網同一網段 ip 即可
    web server 與 haproxy 的 eth1 都屬於同一 subnet

    這樣區網內的人也可以直接連到 web server

  7. 服務器 haproxy , web server 最好都為靜態 ip
    不然到時候 ip 變了你甚麼都連不上了
    當然你也可以把 haproxy 的 eth0 和 eth1 , web server 設為同一區段也是可以啦
    只要 web server 的 gateway 可以指到 eth1(你所謂新的 bridge interface) 也是可以動的

  8. 非常感謝您的回覆。原來 eth0 和 eth1 同一個區段也可以,現在所有的 subnet 機器都可以連了。有空真的要好好看一看網路 IP 之類的文章,可是不知道為什麼 TProxy + Haproxy 一定要以 NAT 的方式 Forward 到第二個 Interface 才能用。謝謝你的幫忙!

  9. 這個嘛 …..
    說實在話 我還真的沒這樣玩過
    要不要把你的 iptables 設定和 route 設定貼上來看看
    最好把你的 haproxy 和 web server 的 ip gateway 設定也貼來看看吧

  10. 以下是 iptables 的設定

    sysctl -e net.ipv4.ip_forward=1
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    iptables -A FORWARD -i eth1 -j ACCEPT
    iptables -t mangle -N DIVERT
    iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
    iptables -t mangle -A DIVERT -j MARK –set-mark 1
    iptables -t mangle -A DIVERT -j ACCEPT
    ip rule add fwmark 1 lookup 100
    ip route add local 0.0.0.0/0 dev lo table 100

    下面為 haproxy 的設定:
    global

    log 127.0.0.1 local0
    log 127.0.0.1 local1 notice
    maxconn 4096
    ulimit-n 80013
    pidfile /var/run/haproxy.pid

    defaults
    log global
    mode http
    option httplog
    option dontlognull
    retries 3
    option redispatch
    maxconn 2000
    timeout connect 20s
    contimeout 5000
    clitimeout 50000
    srvtimeout 50000

    listen webfarm [haproxy private ip]:80
    stats uri /stats
    stats auth username:password
    mode http
    balance roundrobin
    cookie SERVERID insert indirect
    source 0.0.0.0 usesrc clientip
    monitor-uri /haproxy_status
    server weba [private ip 1]:80 cookie A check
    server webb [private ip 2]:80 cookie A check

    weba 的 gateway 是指向 haproxy 的 private ip。如果在不同 subnet 就可以 transparent,同一個 subnet 則不行。

  11. 看你的設定
    應該 eth0 是提供 NAT (也就是 private ip)
    而 eth1 應該是對外才對 , 也就是說一般 brwoser 應該要對 eth1 的 ip 瀏覽
    而 haproxy.cfg 中的 listen ip 應該與 eth1 一樣

    我有時間也來玩玩同一區段的方式看看 , 照你的設定應該是沒甚麼問題的 也許 TPROXY 不能這麼做也不一定
    不過我不知道你設定 iptables -A FORWARD -i eth1 -j ACCEPT 是為了甚麼 ?

  12. 因為對 iptables 不太熟所以去網路上東抄西抄。我以為是 eth0 對外,eth1 NAT 對內。可是對外又有一台 router 做 port forwarding 給 haproxy。看來得好好唸一唸網路架構之類的書。也可能是 tproxy 不支援同一個 subnet,無論如何非常謝謝你的答覆。也謝謝你提供詳細的 proxmox 資料。如果我發現什麼再回來。

  13. @rogerger
    如果照你所說
    有一台 router 做 port forwarding 給 haproxy , 那麼應該 router 上有一個設定是 forward 80 port到 eth1 才對 , 因為你的 iptalbes 設定是 eth0 做 NAT 而非你說的用 eth1 做 NAT , 而 web server 的 gateway 應該都指向 eth0(NAT) 的 ip , 另外我覺得 iptables -A FORWARD -i eth1 -j ACCEPT 應該是多餘的

發佈留言