DSNAT support

dsnat簡介

dsnat(Dynamic Source Network Address Translation) 是一個基于lvs的模塊,在taobao開源的FNAT基礎(chǔ)上開發(fā),dsnat位于網(wǎng)絡(luò)的網(wǎng)關(guān)位置,內(nèi)網(wǎng)訪問外網(wǎng)時,會將內(nèi)網(wǎng)地址改成公網(wǎng)地址池中的ip,輪詢選擇

目前該模塊只支持ipv4下的TCP,UDP協(xié)議, ICMP暫時還不支持

dsnat_tools包含ipvsadm和keepalived這2個工具,在官方源碼的基礎(chǔ)上修改添加了對dsnat的支持

  • ipvsadm是對lvs進行配置的用戶空間工具,ipvsadm->lvs類似于iptables->netfilter
  • keepalived是對lvs集群的一個自動化配置工具(以服務(wù)形式常駐內(nèi)存),可針對rs自動摘除和添加rs到vs中;并帶有HA功能,提供熱備容災(zāi)

安裝

安裝二進制包(xiaomi內(nèi)網(wǎng)可訪問)
  1. 內(nèi)核
rpm -ivh http://xiaomi-kernel.xae.xiaomi.com/mi4-dsnat/kernel-firmware-2.6.32-279.23.1.mi4.el6.x86_64.rpm
rpm -ivh http://xiaomi-kernel.xae.xiaomi.com/mi4-dsnat/kernel-2.6.32-279.23.1.mi4.el6.x86_64.rpm
#開發(fā)包
rpm -ivh http://xiaomi-kernel.xae.xiaomi.com/mi4-dsnat/kernel-devel-2.6.32-279.23.1.mi4.el6.x86_64.rpm
rpm -ivh http://xiaomi-kernel.xae.xiaomi.com/mi4-dsnat/kernel-headers-2.6.32-279.23.1.mi4.el6.x86_64.rpm 
  1. ipvsadm/keepalive
#如發(fā)現(xiàn)/usr/local目錄下的ipvsadm/keepalived,刪掉
wget http://xiaomi-kernel.xae.xiaomi.com/mi4-dsnat/tools/ipvsadm -O /sbin/ipvsadm
wget http://xiaomi-kernel.xae.xiaomi.com/mi4-dsnat/tools/keepalived -O /sbin/keepalived

源碼安裝

過程可以參考FNAT,將補丁換成dsnat即可

  1. 下載 redhat 6.3的內(nèi)核
wget ftp://ftp.redhat.com/pub/redhat/linux/enterprise/6Server/en/os/SRPMS/kernel-2.6.32-279.23.1.el6.src.rpm
  1. 準(zhǔn)備代碼
cat > ~/.rpmmacros << 'EOF'
%_topdir ~/rpms
%_tmppath ~/rpms/tmp
%_sourcedir ~/rpms/SOURCES
%_specdir ~/rpms/SPECS
%_srcrpmdir ~/rpms/SRPMS
%_rpmdir ~/rpms/RPMS
%_builddir ~/rpms/BUILD
EOF

cd
mkdir -p ~/rpms/{tmp,BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
rpm -ivh kernel-2.6.32-279.23.1.el6.src.rpm
cd ~/rpms/SPECS
rpmbuild -bp kernel.spec
  1. 打補丁
cd ~/rpms/BUILD/
cd kernel-2.6.32-220.23.1.el6/linux-2.6.32-279.23.1.el6.x86_64/
wget https://raw.github.com/xiaomi-sa/dsnat/master/dsnat-kernel-2.6.32-279.23.1.el6/dsnat-2.6.32-279.23.1.el6.xiaomi.noconfig.patch
patch -p1 < dsnat-2.6.32-279.23.1.el6.xiaomi.noconfig.patch
  1. 編譯安裝
make -j16
make modules_install
make install
##重啟使用新內(nèi)核
init 6

LVS TOOL 安裝

標(biāo)準(zhǔn)的ipvsadm和keepalive將無法正常使用,
需要編譯安裝ipvsadm和keepalived,在dsnat_tools下載工具源碼

git clone git@github.com:xiaomi-sa/dsnat.git
cd dsnat/dsnat_tools/ipvsadm
make && make install
cd ../keepalived
make && make install

配置用例

將lvs放在網(wǎng)關(guān)的位置,假設(shè)網(wǎng)絡(luò)環(huán)境是這樣的

client eth0   1.1.1.1      255.255.0.0     (cip)
lvs    eth0    1.1.100.1    255.255.0.0     (gw ip)
lvs    eth1    1.2.100.1-4  255.255.0.0     (lip)
rs     eth1    1.2.1.4      255.255.0.0     (rip)

網(wǎng)絡(luò)環(huán)境是(模擬一下)

  • client在內(nèi)網(wǎng)
  • realserver在外網(wǎng)
  • 內(nèi)網(wǎng)到外網(wǎng)的路由指向lvs
  • route add -net 1.2.0.0 netmask 255.255.0.0 gw 1.1.100.1(用默認(rèn)路由也可以)
  • 外網(wǎng)服務(wù)器可以訪問lvs的lip
Alt text
Alt text

網(wǎng)關(guān)的配置

##寫入開機啟動腳本

# echo >> /etc/rc.local << 'EOF'
#打開轉(zhuǎn)發(fā)設(shè)置
echo 1 > /proc/sys/net/ipv4/ip_forward

#由于gro/lro功能會影響轉(zhuǎn)發(fā)后數(shù)據(jù)包大小,超過MTU后會被丟棄重發(fā),系統(tǒng)默認(rèn)是開啟的
#關(guān)掉gw ip所在的網(wǎng)卡gro/lro
ethtool -K eth0 gro off
ethtool -K eth0 lro off

#綁定網(wǎng)卡中斷,讓中斷在多核cpu上輪訓(xùn),效果很贊,同樣是gw ip所在的網(wǎng)卡
set_irq_affinity.sh eth0
EOF

##關(guān)閉irqbalance
# service irqbalance stop
# chkconfig --level 2345 irqbalance off

## 綁定local address
# echo >> /etc/rc.local << 'EOF'
ip addr add 1.2.100.1/16 dev eth1
ip addr add 1.2.100.2/16 dev eth1
ip addr add 1.2.100.3/16 dev eth1
ip addr add 1.2.100.4/16 dev eth1
EOF

zone 說明

  • zone是有序的
  • zone是local address的容器
  • 源地址會從第一個網(wǎng)段開始,依次檢查到最后一個,一旦找到相匹配的網(wǎng)段即終止檢查
  • 網(wǎng)段內(nèi)如果沒有l(wèi)ocal address
  • 或者local address中的ip上的所有端口都被占用
  • 或者沒有匹配到任何網(wǎng)段lvs將不會做任何處理(可視為丟棄)

通過ipvsadm配置lvs規(guī)則

如果執(zhí)行報錯,請核對一下使用的內(nèi)核補丁是否生效,ipvsadm是否為dsnat_tools編譯安裝版本

#打開添加一個0/0的虛擬服務(wù),開啟dsnat,讓所有的內(nèi)網(wǎng)請求都能命中該服務(wù)
ipvsadm –A –t 0.0.0.0:0 –s rr


#添加一個1.1.0.0/16的網(wǎng)段,用來做源地址匹配(client的ip是1.1.1.1/16)
ipvsadm -K  --zone 1.1.0.0/16

#為1.0.0.0/16的zone添加local address
ipvsadm -P --zone 1.1.0.0/16 -z 1.2.100.1
ipvsadm -P --zone 1.1.0.0/16 -z 1.2.100.2

#再添加一個缺省的網(wǎng)段0/0
ipvsadm -K  --zone 0.0.0.0/0

#為缺省網(wǎng)段添加local address
ipvsadm -P --zone 0.0.0.0/0 -z 1.2.100.3
...


#查看vs
ipvsadm -ln
  
#查看公網(wǎng)ip地址池
ipvsadm -G

通過keepalive配置lvs規(guī)則

如果執(zhí)行報錯,請核對一下使用的內(nèi)核補丁是否生效,keepalive是否為dsnat_tools編譯安裝版本,
keepalive需要2臺機器了,這里給出一臺的配置

  • 啟動:service keepalived start
  • 更新:service keepalived reload
  • 停止:service keepalived stop
## /etc/keepalived/keepalived.conf
global_defs {
   router_id LVS_DEVEL
}
  
##這是lvs的配置,寫好公網(wǎng)ip地址池的ip
local_address_group laddr_g1 {
        1.2.100.1
        1.2.100.2
}

local_address_group laddr_g2 {
        1.2.100.3
}

zone 1.1.0.0 16 {
    laddr_group_name laddr_g1
}

zone 0.0.0.0 0.0.0.0 {
    laddr_group_name laddr_g2
}

##這是High Availability部分的配置,會根據(jù)lvs的狀況,讓virtual_ipaddress在合適的機器上浮動
vrrp_sync_group G1 {
  group {
    VI_1
    VI_2
  }
}

##配置eth0浮動ip
vrrp_instance VI_1 {
        state MASTER
        interface eth0
        virtual_router_id 52
        priority 100 
        advert_int 1
        authentication {
                auth_type pass
                auth_pass 1111
        }
  
        virtual_ipaddress {
                1.1.100.1
        }
}

#配置eth1浮動ip
vrrp_instance VI_2 {
        state master
        interface eth1
        virtual_router_id 53
        priority 100
        advert_int 1
        authentication {
                auth_type pass
                auth_pass 1111
        }

        virtual_ipaddress {
                1.2.100.1/16
                1.2.100.2/16
        }
}

##配置lvs,添加一個0/0的虛擬服務(wù),開啟dsnat,讓所有的內(nèi)網(wǎng)請求都能命中該服務(wù)
virtual_server 0.0.0.0 0 {
        delay_loop 6
        lb_algo rr
        lb_kind FNAT
        protocol TCP
        laddr_group_name laddr_g1
}

資源

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脸秽,一起剝皮案震驚了整個濱河市市框,隨后出現(xiàn)的幾起案子悦冀,更是在濱河造成了極大的恐慌,老刑警劉巖咬展,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡掀潮,警方通過查閱死者的電腦和手機骄呼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門共苛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蜓萄,你說我怎么就攤上這事隅茎。” “怎么了嫉沽?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵辟犀,是天一觀的道長。 經(jīng)常有香客問我耻蛇,道長踪蹬,這世上最難降的妖魔是什么胞此? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮跃捣,結(jié)果婚禮上漱牵,老公的妹妹穿的比我還像新娘。我一直安慰自己疚漆,他們只是感情好酣胀,可當(dāng)我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著娶聘,像睡著了一般闻镶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丸升,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天铆农,我揣著相機與錄音,去河邊找鬼狡耻。 笑死墩剖,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的夷狰。 我是一名探鬼主播岭皂,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼沼头!你這毒婦竟也來了爷绘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤进倍,失蹤者是張志新(化名)和其女友劉穎土至,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體背捌,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡毙籽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了毡庆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坑赡。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖么抗,靈堂內(nèi)的尸體忽然破棺而出毅否,到底是詐尸還是另有隱情,我是刑警寧澤蝇刀,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布螟加,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏捆探。R本人自食惡果不足惜然爆,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望黍图。 院中可真熱鬧曾雕,春花似錦、人聲如沸助被。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽揩环。三九已至搔弄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丰滑,已是汗流浹背顾犹。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吨枉,地道東北人蹦渣。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像貌亭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子认臊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容