socket選項IP_TRANSPARENT簡單介紹

1 引言

在使用Keepalived部署DNS(nsd)高可用集群時溪北,不使用LVS肉盹,僅僅使用Keepalived實現(xiàn)雙主模式,在另外一臺服務(wù)器發(fā)起dig,出現(xiàn)reply from unexpected source沪么。

dig @192.168.0.51 www.example.com

;; reply from unexpected source: 192.168.0.3#53, expected 192.168.0.51#53

192.168.0.51未VIP,192.168.0.3為網(wǎng)卡原始ip
在服務(wù)器上抓包锌半,的確收到目的地址為192.168.0.51的報文禽车,但是回復(fù)報文的源IP卻變?yōu)?code>192.168.0.3,但是奇怪一點的是使用tcp模式發(fā)起dig請求卻是正常的刊殉。

2 IP_TRANSPARENT簡介

經(jīng)過網(wǎng)絡(luò)了解殉摔,發(fā)現(xiàn)有個socket選項IP_TRANSPARENT是針對類似問題,查看Linux manual有:

IP_TRANSPARENT (since Linux 2.6.24)
Setting this boolean option enables transparent proxying on
this socket. This socket option allows the calling applica‐
tion to bind to a nonlocal IP address and operate both as a
client and a server with the foreign address as the local end‐
point. NOTE: this requires that routing be set up in a way
that packets going to the foreign address are routed through
the TProxy box (i.e., the system hosting the application that
employs the IP_TRANSPARENT socket option). Enabling this
socket option requires superuser privileges (the CAP_NET_ADMIN
capability).

          TProxy redirection with the iptables TPROXY target also
          requires that this option be set on the redirected socket.

簡單來說记焊,使用這個選項可以socket綁定一個非本地的地址逸月,實現(xiàn)所謂的透明代理(TProxy, Transparent Proxy),通過Keepalived實現(xiàn)IP漂移時,VIP就是一個nonlocal IP,這段文字還是很難理解遍膜,包括解釋不了為什么TCP可以而UDP卻不可以的疑問碗硬,不過可以參考PowerDNS的一篇文章Linux transparent proxy support,解釋的比較清楚瓢颅。

3 IP_TRANSPARENT使用示例

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <iostream>

int create_other_sock()
{
    //
    int fd = socket(AF_INET, SOCK_DGRAM, 0);
    int ret = 0;
    int value = 1;
    ret = setsockopt(fd, SOL_IP, IP_TRANSPARENT, &value, sizeof(value));
    if(ret != 0)
    {
        std::cout << "setsockopt IP_TRANSPARENT failed" << std::endl;
        std::cout << strerror(errno) << std::endl;
        exit(1);
    }
    // local address is not belong the local machine
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(53);
    uint32_t addr_local = 0;
    ret = inet_pton(AF_INET, "192.168.50.100", &addr_local);
    if(ret != 1)
    {
        std::cout << "inet_pton failed" << std::endl;
        close(fd);
        exit(1);
    }
    addr.sin_addr.s_addr = addr_local;

    ret = bind(fd, (struct sockaddr*)&addr, sizeof(addr));
    if(ret !=0)
    {
        std::cout << strerror(errno) << std::endl;
        std::cout << "bind failed" << std::endl;
        exit(1);
    }
    return fd;
}

int main()
{
    int fd_other = create_other_sock();

    for(;;)
    {
        char buf[1024] = {0};
        struct sockaddr_in remote_addr;
        memset(&remote_addr, 0, sizeof(remote_addr));
        socklen_t addr_len;
        
        int len = recvfrom(fd_other, buf, 1024, 0, (struct sockaddr*)&remote_addr, &addr_len);
        std::cout << "len = " << len << std::endl;
        sendto(fd_other, buf, len, 0, (struct sockaddr*)&remote_addr, addr_len);
    }

    return 0;
};

發(fā)現(xiàn)使用了IP_TRANSPARENT可以綁定任意一個IP地址恩尾,包括8.8.8.8從而實現(xiàn)流量攔截。

3 nsd配置使用IP_TRANSPARENT

nsd.conf配置里有IP_TRANSPARENT的選項挽懦,

ip-address: 192.168.0.52
ip-address: 192.168.0.51

# Allow binding to non local addresses. Default no.
ip-transparent: yes

配置了重啟nsd翰意,再次dig就不會出現(xiàn)之前描述的問題,并且需要注意的是使用IP_TRANSPARENT監(jiān)聽IP列表里必須指明VIP列表信柿,否則還是會出現(xiàn)問題冀偶。

4 參考文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市渔嚷,隨后出現(xiàn)的幾起案子蔫磨,更是在濱河造成了極大的恐慌,老刑警劉巖圃伶,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堤如,死亡現(xiàn)場離奇詭異,居然都是意外死亡窒朋,警方通過查閱死者的電腦和手機搀罢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侥猩,“玉大人榔至,你說我怎么就攤上這事∑劾停” “怎么了唧取?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵铅鲤,是天一觀的道長。 經(jīng)常有香客問我枫弟,道長邢享,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任淡诗,我火速辦了婚禮骇塘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘韩容。我一直安慰自己款违,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布群凶。 她就那樣靜靜地躺著插爹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪请梢。 梳的紋絲不亂的頭發(fā)上赠尾,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機與錄音溢陪,去河邊找鬼萍虽。 笑死,一個胖子當(dāng)著我的面吹牛形真,可吹牛的內(nèi)容都是我干的杉编。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼咆霜,長吁一口氣:“原來是場噩夢啊……” “哼邓馒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蛾坯,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤光酣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后脉课,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體救军,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年倘零,在試婚紗的時候發(fā)現(xiàn)自己被綠了唱遭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡呈驶,死狀恐怖拷泽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤司致,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布拆吆,位于F島的核電站,受9級特大地震影響脂矫,放射性物質(zhì)發(fā)生泄漏枣耀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一羹唠、第九天 我趴在偏房一處隱蔽的房頂上張望奕枢。 院中可真熱鬧娄昆,春花似錦佩微、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扒俯,卻和暖如春奶卓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背撼玄。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工夺姑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人掌猛。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓盏浙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親荔茬。 傳聞我的和親對象是個殘疾皇子废膘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354