Skip to content

Commit

Permalink
Merge branch 'develop' of https://github.com/kbu1564/SecurityBootloader
Browse files Browse the repository at this point in the history
… into develop
  • Loading branch information
kbu1564 committed Aug 6, 2015
2 parents ca02542 + 5ce795b commit 4ad0add
Show file tree
Hide file tree
Showing 6 changed files with 237 additions and 33 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ sudo apt-get install qemu
**12. Clone grub**
```
git clone https://github.com/coreos/grub.git
git clone https://github.com/kbu1564/SecurityBootloader.git
```
**13. grub 소스 컴파일**
Expand Down
96 changes: 96 additions & 0 deletions GRUB Guide/2. Setting QEMU bridge.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
[참고사이트](http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/cloud/Qemu/Network)
<br/>
우분투에서 Bridge 네트워크 구축
-------------------------------------------------------------------
우분투에 브릿지 네트워크를 구축하기로 했다. 아래의 과정을 거친다.
```
1. 호스트 브릿지인 br0를 만든다.
2. br0를 eth0 포트에 링크한다.
3. VM을 위한 tap 디바이스 2개를 만든다. 이름은 tap1과 tap2로 했다.
4. br0에 tap1, tap2, eth0을 묶는다.
```
<br/>
###*1. brctl을 이용해서 브릿지를 만든다.*
```
# brctl addbr br0
# ifconfig br0 up
```
<br/>
###*2. 브릿지 인터페이스를 설정한다.*
1. eth0 과 브릿지 한다.
2. dhcp를 이용해서 브릿지의 네트워크를 설정한다. dhcp 패킷은 eth0을 타고 나가서 브로드캐스팅 된다.
```
# vim /etc/network/interfaces
```
▶ interfaces의 내용
```
# cat /etc/network/interfaces
auto lo
iface lo inet loopback
auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0
```
<br/>
###*3. 브릿지 인터페이스를 올린다.*
```
# ifup br0
```
<br/>
###*4. eth0이 했던 네트워크 인터페이스의 역할은 앞으로 br0이 하고 eth0은 물리적인 디바이스를 링크하기 위한 역할만을 한다. 따라서 eth0의 네트워크 설정을 없앤다.*
```
# ifconfig eth0 0.0.0.0
```
<br/>
###*5. Tap interface 생성*
```
# openvpn --mktun --dev tap1
# openvpn --mktun --dev tap2
# ifconfig tap1 up
# ifconfig tap2 up
```
<br/>
###*6. 브릿지에 인터페이스들을 추가한다.*
```
# brctl addif br0 tap1
# brctl addif br0 tap2
# brctl addif br0 eth0
```
<br/>
###*7. 네트워크 브릿지 정보를 확인해 보자.*
```
# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.d2a4aba39cf4 no eth0
tap1
tap0
```
<br/>
###*8. 호스트의 라우팅 설정을 확인해 보자.*
```
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.11.1 0.0.0.0 UG 0 0 0 br0
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 br0
192.168.11.0 0.0.0.0 255.255.255.0 U 0 0 0 br0
```
▶ 0.0.0.0/0으로 향하는 패킷은 br0 으로 흐른다. br0은 이 패킷을 eth0 인터페이스로 보낼 것이다.
▶ 192.168.11.0/24로 향하는 패킷은 LAN 영역에서 소비된다.
<br/>
###*9. 테스트를 위한 VM을 실행한다. VM들의 네트워크 설정은 DHCP로 한다.*
```
# qemu-system-i386 -m 512 -hda brdist-img.raw -net nic,macaddr=52:00:00:00:00:01 -net tap,ifname=tap1,script=no -boot n
```
<br/>
###*10. 실행된 가상머신은 닫지 않은 상태에서 새로운 터미널을 생성해, 브릿지의 MAC 테이블에 VM의 맥이 포함됐는지 확인해 보자.*
```
# brctl showmacs br0
```
<br/>
<br/>
**이 테스트는 하나의 VLAN에서 이루어졌다. VLAN을 쪼개는 방식으로 Multi-tenant 응용이 가능 할거다.**
120 changes: 104 additions & 16 deletions Server/epoll_server.cpp
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
#include "include/global.h"
#include "include/server_handler.h"
#include "include/epoll_server.h"

EpollServer::EpollServer()
EpollServer::EpollServer(ServerHandler* handler)
{
this->mHandler = handler;
}

EpollServer::~EpollServer()
Expand Down Expand Up @@ -81,43 +83,129 @@ int EpollServer::shutdown()
*/
int EpollServer::setOpts()
{
int flags, s;
flags = fcntl(this->mSfd, FGETFL, 0);
if (flags == -1) {
this->__reporting("fcntl", "none-blocking socket option getting error");
return -1;
}
int flags, s;
flags = fcntl(this->mSfd, FGETFL, 0);
if (flags == -1) {
this->__reporting("fcntl", "none-blocking socket option getting error");
return -1;
}

flags |= O_NONBLOCK;
s = fcntl(this->mSfd, F_SETFL, flags);
if (s == -1) {
this->__reporting("1:fcntl", "none-blocking socket change error");
return -1;
}
flags |= O_NONBLOCK;
s = fcntl(this->mSfd, F_SETFL, flags);
if (s == -1) {
this->__reporting("1:fcntl", "none-blocking socket change error");
return -1;
}
return E_OK;
}
/**
* Socket Listen
*/
int EpollServer::listen()
{
int ret = listen(this->mSfd, SOMAXCONN);
return E_OK;
int ret = listen(this->mSfd, SOMAXCONN);
return E_OK;
}

/**
* Epoll 초기화
*/
int EpollServer::_epoll_init(const int epollsize)
{
return E_OK;
int retval = 0;
this->mEpfd = epoll_create(epollsize);
if (epfd == -1) {
this->__reporting("epoll_create", "can't create epoll events");
return -1;
}

epoll_event event;
event.data.fd = this->mSfd;
event.events = EPOLLIN | EPOLLET;
retval = epoll_ctl(epfd, EPOLL_CTL_ADD, this->mSfd, &event);
if (retval == -1) {
this->__reporting("epoll_ctl", "can't create epoll events");
return -1;
}
return E_OK;
}

/**
* 소켓 루프 관련 부분
*/
int EpollServer::loop()
{
int retval = 0;
epoll_event event, current_event;

for (;;) {
int n = epoll_wait(this->mEpfd, this->mEvents, MAX_EVENTS, -1);
for (int i = 0; i < n; i++) {
current_event = this->mEvents[i];

if ((current_event.events & EPOLLERR) ||
(current_event.events & EPOLLHUP) ||
!(current_event.events & EPOLLIN)) {
// epoll error!!
this->mHandler->disconnect(current_event);
} else if (current_event.events & EPOLLRDHUP) {
// closed connection on descriptor via EPOLLRDHUP
this->mHandler->disconnect(current_event);
} else if (this->mSfd == current_event.data.fd) {
// listening socket
for (;;) {
sockaddr in_addr;
sockaddr sa;
socklen_t in_len;
int infd;
char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];

in_len = sizeof(in_addr);
infd = accept4(this->mSfd, &in_addr, &in_len, SOCK_NONBLOCK, SOCK_CLOEXEC);
if (infd == -1) {
if (errno == EAGAIN || errno == EWOULDBLOCK)
break;
else {
// accept!!
break;
}
}

retval = getnameinfo(&sa, in_len, hbuf, sizeof(hbuf), sbuf, sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV);
if (retval == 0) {
// host = hbuf, serv = sbuf
}

event.data.fd = infd;
event.events = EPOLLIN | EPOLLRDHUP | EPOLLET;
retval = epoll_ctl(this->mEpfd, EPOLL_CTL_ADD, infd, &event);
if (retval == -1) {
this->__reporting("epoll_ctl", "Register for read events error");
return -1;
}

// accept handler
this->mHandler->accept(event, hbuf, sbuf);
}
} else if (current_event.events & EPOLLIN) {
// read data
char buf[MAX_BUFFER_SIZE];
int nread = read(current_event.data.fd, buf, MAX_BUFFER_SIZE);
if (nread < 1) {
// closed connection on descriptor
this->mHandler->disconnect(current_event);
} else {
// NULL value setting
if (nread < MAX_BUFFER_SIZE) buf[nread] = 0;

// recv event!!
this->mHandler->recv(current_event, buf, nread);
}
} else if (current_event.events & EPOLLOUT) {
// write event!!
}
}
}
return E_OK;
}

Expand Down
35 changes: 19 additions & 16 deletions Server/include/epoll_server.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,32 +4,35 @@
class EpollServer
{
private:
enum Config {
MAX_EVENTS = 64,
MAX_BUFFER_SIZE = 512
};
enum Config {
MAX_EVENTS = 64,
MAX_BUFFER_SIZE = 512
};
protected:
int mPort;
int mPort;
int mSfd;
int mEpfd;

epoll_event mEvents[MAX_EVENTS];
epoll_event mEvents[MAX_EVENTS];

ServerHandler* mHandler;

public:
EpollServer();
~EpollServer();
EpollServer(ServerHandler* handler);
~EpollServer();

int open(const int port);
int shutdown();
int setOpts();
int listen();
int loop();
int open(const int port);
int shutdown();
int setOpts();
int listen();
int loop();

protected:
int _epoll_init(const int epollsize);
int _epoll_init(const int epollsize);

private:
EpollServer(const EpollServer& es);
EpollServer& operator=(const EpollServer& es);
EpollServer(const EpollServer& es);
EpollServer& operator=(const EpollServer& es);

void __reporting(char* funcname, int retval) const;
};
Expand Down
17 changes: 17 additions & 0 deletions Server/include/server_handler.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#ifndef SERVER_HANDLER_H_
#define SERVER_HANDLER_H_

class ServerHandler
{
public:
ServerHandler() {}
virtual ~ServerHandler() {}

virtual void accept(epoll_event& event, const char* hbuf, const char* sbuf) = 0;
virtual void disconnect(epoll_event& event) = 0;
virtual void recv(epoll_event& event, const char* buffer, int readlen) = 0;
virtual void send(epoll_event& event) = 0;
};

#endif

0 comments on commit 4ad0add

Please sign in to comment.