這幾天玩 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 來建立虛擬機
非常謝謝你的分享,我也開始使用 Proxmox,可是 OpenVZ 方面還是一個頭兩個大,有的時候 eth0 會出現有的時候又不會出現。。
怎會 ?
如果你是 CentOS
檢查一下 /etc/sysconfig/network-scripts/ifcfg-eth0
看看是否有這行
ONBOOT=yes
如果你沒有設定 ONBOOT=yes , 那麼下次重啟你的 Openvz 模擬的CentOS就看不到了
終於好了原來是我沒選 Bridge Mode(我也太豬頭了)。請問一下你家內部的網路有用 DNS Forwarding 嗎?因為有多個 VMs 可是只有一個 IP 地址,不知道除了用 PFsense Router 外還有什麼辦法~?
@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
我現在也是用 OpenVPN 連回家。可是不支道友沒有辦法安裝 Haproxy。會部會如過用 PFSense 會容易一點呢?
您好:
不好意思又來打擾了。現在用 ubuntu server 並且有將 nf_tproxy_core module 載入,但是只要使用 trasparent mode (已編譯到 haproxy 中),並在 haproxy.cnf 中加入 source 0.0.0.0 usesrc clientip 這一行就會出現 Error 503 Service Unavailable 當嘗試連結。拿掉這一行(取消 tproxy 就正常),不知道您有沒有遇過相同問題呢?謝謝。
可能有某些設定不對吧
要不要先試試看把 haproxy 那台虛擬機也弄成 NAT
然後把裡面的虛擬 web server 的 gateway 改成 haproxy 的 private ip 看看
謝謝,可以了!!現在 haproxy 那台機有兩個 Bridge Interfaces,eth0 接原來的 subnet,eth1 接新的 subnet,新建的 webserver 使用新的 subnet 並把 gateway 連到 haproxy 的 private ip。不好意思我對網路不太懂。有一些問題想請教一下。(觀念不是很好)
因為新的 webserver 虛擬機使用的 subnet 不同,所以原先 subnet 中的機器無法直接連接到 webserver,必須透過 haproxy 再連接到 webserver,這個是正常的嗎?有沒有解決的辦法。
為何你要把 web server 弄成不同的 subnet 呢 ?
如果說要讓 web server 在區網內好管理 , 而 haproxy 要給外面的人連
那照理說
haproxy 應該是有一張卡對內 一張卡對外 , 假設 eth0 是對外的 ip , eth1 就是與區網同一網段 ip 即可
web server 與 haproxy 的 eth1 都屬於同一 subnet
這樣區網內的人也可以直接連到 web server
請問一下,如果對外另外有一台 router port forward 到 haproxy,其他機器都是由該 router 的 dhcp 取得位址(包括 haproxy),這樣應該要怎麼設定呢?謝謝?
服務器 haproxy , web server 最好都為靜態 ip
不然到時候 ip 變了你甚麼都連不上了
當然你也可以把 haproxy 的 eth0 和 eth1 , web server 設為同一區段也是可以啦
只要 web server 的 gateway 可以指到 eth1(你所謂新的 bridge interface) 也是可以動的
非常感謝您的回覆。原來 eth0 和 eth1 同一個區段也可以,現在所有的 subnet 機器都可以連了。有空真的要好好看一看網路 IP 之類的文章,可是不知道為什麼 TProxy + Haproxy 一定要以 NAT 的方式 Forward 到第二個 Interface 才能用。謝謝你的幫忙!
對不起又是我,我發現如果使用同一個 subnet 的話 webserver 只會顯示 gateway 的 IP,並不會顯示 client 的 IP。(和一般模式的 Haproxy 一樣),好奇怪~
這個嘛 …..
說實在話 我還真的沒這樣玩過
要不要把你的 iptables 設定和 route 設定貼上來看看
最好把你的 haproxy 和 web server 的 ip gateway 設定也貼來看看吧
以下是 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 則不行。
看你的設定
應該 eth0 是提供 NAT (也就是 private ip)
而 eth1 應該是對外才對 , 也就是說一般 brwoser 應該要對 eth1 的 ip 瀏覽
而 haproxy.cfg 中的 listen ip 應該與 eth1 一樣
我有時間也來玩玩同一區段的方式看看 , 照你的設定應該是沒甚麼問題的 也許 TPROXY 不能這麼做也不一定
不過我不知道你設定 iptables -A FORWARD -i eth1 -j ACCEPT 是為了甚麼 ?
因為對 iptables 不太熟所以去網路上東抄西抄。我以為是 eth0 對外,eth1 NAT 對內。可是對外又有一台 router 做 port forwarding 給 haproxy。看來得好好唸一唸網路架構之類的書。也可能是 tproxy 不支援同一個 subnet,無論如何非常謝謝你的答覆。也謝謝你提供詳細的 proxmox 資料。如果我發現什麼再回來。
@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 應該是多餘的
我是參考 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)。不知道這樣的解釋是不是不正確?
你是對的 , 我錯了 , 哈!