2018年2月14日 星期三

C bad file descriptor: error on accept()

code example:
while(1) {
        ...
        newsockfd = accept(listenfd, (struct sockaddr *) &cli_addr, &clilen);
        
        if (newsockfd < 0) {
            perror("server: accept error");
            exit(1);
        }

        if ((pid = fork()) < 0) {
         perror("fork error:");
            exit(3);
        } else {
            if (pid == 0) {  
                cout<<"close listenfd in child\n";
                close(listenfd);
                handle_socket(newsockfd,cli_addr);
            } else { 
             cout<<"close newsockfd in parent\n";
                close(newsockfd);
            }
        }
}

If you don't kill child after accept function,
the program will keep forking another child process.
Then, another "children"(depends on how many times you fork) also want to accept connection in while loop.
This situation leads to accept error.

Solution:
add exit(0) to your child process

[教學&詳解] Network Programming HW4 - SOCK4 Server + Firewall


大家好
今天要來跟大家介紹一下這個作業的想法
以及如何實作

●本次作業說明:
第一:實作一個SOCK4 Server,能夠支援Connect/Bind mode兩種模式,並實作出防火牆的功能
第二:在HW3的CGI程式中,加入連線到SOCK Server的功能
((沒有隱藏測資喔喔喔喔喔
((這次爽拿100分喔喔喔喔

●想法:
Connect/Bind mode:
參考標準,照樣填入對應的資料reply回去

防火牆:
根據socks.conf中的設定,來取決於要不要繼續進行連線
格式為permit ( mode type:b(bind mode), c(connect mode) ) (IP address)
重點就是檔案讀取&字串處理啦

CGI+socks:
加一些關於SOCKS的判斷式,看是否要啟用SOCKS連線
(這部分的詳細說明之後補上,簡單來說就是先判斷網頁空格有無填入SOCKS server的位址,有的話就要先做SOCKS的事情,再做CGI的事情)

●我的架構:
第一:sock.cpp
第二:把HW3的cgi & httpd通通複製過來

●流程:
如同先前寫的server
要先建立好socket
並且bind & listen
再來等使用者連線進來accept
就fork出child process進去handle_socket()處理要求
((記得parent不要wait child,這樣一次只能處理一筆連線,只要那個連線等不到response,程式就會動不了,這個錯誤de了一個晚上才發現))

進來後
"請務必用unsigned char去read"
因為網路協定的傳輸都是用unsigned char type的方式傳輸
用char去接的話...嘿嘿嘿
你會發現SOCKS完全動不了
((這個問題也找了很久才發現
將VN、CD、DST_IP和DST_PORT填好
並且預留USER_ID這個部分
((這個部份我不知道它的用途是啥,在這次的作業都是NULL

接著就判斷此連線的DST_IP是否可以通過防火牆
先開好sock.conf後
用一個while迴圈去掃
並且和DST_IP比對
有符合允許的位址的話,reply的第一格就填0x5A
你覺得不行的話,reply的第一格填0x5B(reject掉)

然後判斷是Connect還是Bind mode做對應的回覆
-----------------------------------------------------------------------
※Connect mode(CD=0x01)
建立與目標server的socket後連線
reply的內容:
第0格填0(代表這訊息為SOCK4 reply)
第2~7格就照request的內容填進去
因為DST_IP,DST_PORT都和request一樣(到目標伺服器)

※Bind mode(CD=0x02)
由SOCK server選一個port給client program bind
用getsockname()抓出port,傳reply(IP填0,PORT填SOCKS bind的port number)給client
reply的內容:
第0格填0
第2~3格填入SOCKS bind的port number
第4~7格填0

client會利用前面connect mode的連線告訴target server,要自動連來SOCKS server剛bind的port
target server連過來SOCKS後,再傳一次一模一樣的reply給client
-----------------------------------------------------------------------

接下來兩者都會做像是HW2 single process的事情
將連到SOCK server的fd、SOCK server連到目標伺服器的fd加入fd_set
並用select去看是哪個fd有資料要傳
擔任一個中繼端的角色協助資料傳遞
也就是:
先將target server/client的資料收下來,再轉送到client/target server

這樣就大功告成囉~~
有問題歡迎提問

程式參考連結:
https://lsps4111wu@bitbucket.org/lsps4111wu/np_project4_0656509

FTP運作模式:
http://matis.pixnet.net/blog/post/22918494

[筆記] M-CORD是什麼

大家好啊~~
繼OPNFV之後又有新的類似專案產生了
是由ONF組織所領導的M-CORD

全名是Mobile-Central Office Re-architected as a Datacenter
因為M-CORD是CORD的一個變形
要了解M-CORD
得先從CORD去理解

CORD是一個用來建資料中心的架構
它的特點是
  1. 利用現有的 hardware 和 open source software 是具有經濟效益的
    相較於以前的硬體設備是vendor lock-in,現在用了CORD後因為不用特定的硬體,取得成本低,外加使用open source軟體不須付費,因此很有經濟效益
  2. 由於是CORD軟體平台,可以很快速地部建新的服務在上頭
M-CORD架構圖
M-CORD比CORD多了XOS上面,關於核心網路的模組,有Disaggregated/Virtualized RAN and EPC + Mobile Edge Services
根據了解,上述的核心網路模組並未完整開源(open source),只有30%的code在外亮相(這算哪門子的開源啦= =),有興趣的人可以查查看Radisys,雖然它號稱開源,但是有人說可能最後仍要收費

2018年2月8日 星期四

[筆記] 2018/02/06 P4 workshop in NCTU

大家好啊~~
前幾天交大才舉辦P4的工作坊
趁記憶猶新
稍稍做個筆記以免忘記XD

這裡說明一下P4是什麼?
P4全名為Programming Protocol-independent Packet Processors
他是一個程式語言,用來決定每個switch的行為,包含封包的欄位switch具有的flow table
根據P4的作者在他發的paper中表示,他提出的P4相當於OpenFlow 2.0,有一種「SDN的救星」的感覺。

那為何P4可譽為是SDN的救星?
主要有兩個方面
1. 由於SDN在P4誕生之前,主要是照著OpenFlow協議去規範。
從OpenFlow 1.0演進到現在的OpenFlow 1.4,在封包中的header欄位一直在增加,這對於設計switch的人來說很不方便,因為都被這個protocol綁死了,無法根據自己網路需求來增加或減少header欄位。
P4讓設計人員可以在區域網路的switch上自訂封包欄位,不用受到protocol的牽制,即為protocol independent
2. 從OpenFlow 1.1之後,多了Multiple Flow Table的設計。
由於在1.0的時候,每個switch都是只有一個大table,但是每個欄位之中的數值很少,大部分的值都是don't care,這會導致很大的空間浪費
Multiple Flow Table這樣的設計會把大table拆解成很多小table,這可以讓switch的用更少的空間記住相等的資訊,但這導致了一個問題。因為每個SDN switch廠商的switch包含的table數量都不一樣,即使一樣但在pipeline的flow table比較順序都不一樣,進而導致不相容。
P4可以讓設計人員可以在區域網路的switch上,自訂每個switch的flow table樣式,以及pipeline的運作順序。

如果有什麼想問的問題
歡迎在留言提問喔

2018年2月5日 星期一

[教學] 用KVM設置虛擬區域網路(等同於VMware的LAN Segment)

大家好啊~~
今天來教大家使用KVM設置虛擬區域網路
當初找這個功能找了很久
都不是我想要的
好不容易在學長的幫忙下成功了
趕緊寫下來分享給大家

首先要先安裝KVM
參考這裡的第一和第二步驟
把KVM和virt-manager安裝好

接著因為有些設定預設是被隱藏的
需要藉由gksu這個套件顯現出來
指令:
$ sudo apt-get install gksu

藉由gksu啟動virt-manager
讓virt-manager有更多控制選項
$ gksu virt-manager

接下來會跳出VM列表
在上方
Edit→Connection Details→Virtual Networks
按底下的加號新增虛擬區域網路

為你的LAN Segment命名

設定你的IP範圍,看你的需求設定

是否啟動IPv6協定,看你的需求

決定封包是否要到達實體網卡,選第一個

接下來
到VM的所有裝置列表
按底下的Add Hardware新增網卡

重覆這個部分把要加進來虛擬區域網路的VM都設定好

驗證:到VM中用ping的方式ping到其他VM
ping <your_vm_ip> (本例為192.168.2.189)

成功啦~~~