首頁 > Linux, 虛擬化 > 筆記 : proxmox ve 下用 OpenVZ 安裝 CentOS 的一些小眉角

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

2010年1月7日 發表評論 閱讀評論

這幾天玩 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 來建立虛擬機

Categories: Linux, 虛擬化 Tags: ,
  1. 2010年6月6日02:42 | #1

    非常謝謝你的分享,我也開始使用 Proxmox,可是 OpenVZ 方面還是一個頭兩個大,有的時候 eth0 會出現有的時候又不會出現。。

  2. 2010年6月6日17:49 | #2

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

  3. 2010年6月7日04:46 | #3

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

  4. 2010年6月7日20:14 | #4

    @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

  5. 2010年6月13日12:25 | #5

    我現在也是用 OpenVPN 連回家。可是不支道友沒有辦法安裝 Haproxy。會部會如過用 PFSense 會容易一點呢?

  6. 2010年7月4日15:20 | #6

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

  7. 2010年7月4日18:47 | #7

    可能有某些設定不對吧

    要不要先試試看把 haproxy 那台虛擬機也弄成 NAT
    然後把裡面的虛擬 web server 的 gateway 改成 haproxy 的 private ip 看看

  8. 2010年7月6日04:28 | #8

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

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

  9. 2010年7月6日10:51 | #9

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

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

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

  10. 2010年7月6日12:31 | #10

    請問一下,如果對外另外有一台 router port forward 到 haproxy,其他機器都是由該 router 的 dhcp 取得位址(包括 haproxy),這樣應該要怎麼設定呢?謝謝?

  11. 2010年7月6日13:15 | #11

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

  12. 2010年7月6日14:53 | #12

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

  13. 2010年7月6日16:16 | #13

    對不起又是我,我發現如果使用同一個 subnet 的話 webserver 只會顯示 gateway 的 IP,並不會顯示 client 的 IP。(和一般模式的 Haproxy 一樣),好奇怪~

  14. 2010年7月6日18:03 | #14

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

  15. 2010年7月7日23:34 | #15

    以下是 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 則不行。

  16. 2010年7月9日11:08 | #16

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

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

  17. 2010年7月9日15:31 | #17

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

  18. 2010年7月10日00:04 | #18

    @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 應該是多餘的

  19. rogerger
    2010年7月10日06:50 | #19

    我是參考 http://www.revsys.com/writings/quicktips/nat.html 來建立 nat 的。
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    iptables -A FORWARD -i eth1 -j ACCEPT

    我以為第二行為指定所有 eth1(internal) 的都接受並 forward 到 eth0(external),第一行為將 nat 的偽裝為 eth0(external)。不知道這樣的解釋是不是不正確?

  20. 2010年7月10日15:56 | #20

    你是對的 , 我錯了 , 哈!