일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- packet flow
- .net core 7
- packet filter
- architecture
- vtable
- Compiler
- .nret core 배포
- wnourefresh
- 풀이
- cbpf
- BOF
- iptables
- mvwin
- epoll
- doupdate
- Docker
- DOCKER-USER
- epoll_wait
- NAPT
- rfc5508
- LOB
- edge trigger
- ncurses
- level trigger
- 취약점
- REDIS
- C언어
- wrefresh
- ioctl
- 어셈블리어
- Today
- Total
목록Computer Science (129)
Tuuna Computer Science
Nginx Event Loop Architecture 개론 nginx 이전의 웹서버들은 클라이언트의 접속에 대해 procss or thread를 생성하여 대처했다. 하지만 nginx는 epoll event driven을 통해서 한 스레드 내에서 여러 클라이언트의 접속을 처리하는 구조를 지닌다. nginx의 내부구조는 공식자료로서 설명이 훌륭하지만 아래의 궁금증을 해결해주진 않는다. **nginx은 어떤식으로 이벤트루프를 구성했을까** 이러한 궁금증을 해결하기 위해서는 nginx source code를 직접적으로 봐야만 해결할 수 있기에 분석을 시도했다. 아래 nginx 공식 개발 문서이다. nginx에서 사용된 함수, 구조에 대해서 자세히 설명이 되어있음. 추가) http://nginx.org/en/do..
패킷이 USERSPACE로 전송되는 과정 개론 netfilter hook에 대해서 살펴보는중 어쩌다보니 잠시 커널 소스를 조금 보게 되었는데 어쩌다보니 패킷이 네트워크 인터페이스에 도착해서 관련함수들을 콜하고 그 후 ip_rcv함수를 콜하는 것부터 udp_rcv, tcp_v4_rcv 함수를 콜하는 과정을 보게 되었는데 정리할겸 포스팅 (문서 참조 없이 커널 소스만 보면서 정리한것이기에 틀린것이 있을 수 있음) Netfilter Hook Netfilter Hook에는 주로 5가지의 Hook Point가 존재한다. NF_INET_PRE_ROUTING NF_INET_LOCAL_IN NF_INET_FORWARD NF_INET_PORT_ROUTING NF_INET_LOCAL_OUT 우리는 패킷이 로컬 호스트의 응..
Redis EventLoop Architecture 개론 redis의 공식문서를 보면 자기네들은 자체적인 libev등을 사용하지 않고 자체적인 이벤트루프를 구현해서 쓴다고한다. 자체적인 이벤트루프란 무엇인가 어떻게 만들었을 까 궁금증이 생겨 소스코드를 다운받아 gdb의 콜스택추적 기능을 사용하여 분석을 시작하였다. 아래내용은 redis가 데이터를 어떻게 처리하느냐보다 redis는 어떤식으로 네트워킹 모델을 만들었는가 이벤트루프를 구성하였는가에 초점을 맞춘 분석글이다. 컴파일 소규모 소스코드의 경우 구조를 몇 번의 클릭만으로 파악할 수 있지만 redis의 경우 많은 소스코드 파일으 가지고 있어 분석에 어려움이 있다. 그렇기에 gdb의 backtrace 기능과 watch point를 사용해서 콜 스택을 추적..
Redis를 활용하여 유니크값 관리하기 개요 플레이어가 방을 만들 때를 생각해보자. 필요한값은 RoomId, RoomTitle, HostUserId, Users[]… 등이 있을 것이다. 여기서 title이나 hostuserId등은 request값으로 받아서 넣을 수 있다. 하지만 RoomId는 어떻게 받을것인가 다양한 방법이 있을 수 있다. 웹서버에서 싱글톤으로 관리 가장 보편적이고 쉬운방법이다. 하지만 서버가 스케일아웃으로 구현이 된다면 유니크한 값을 보장받지 못하게 된다. Mysql로 Auto Increasement를 사용하여 관리 Auto Increasement로 유니크한 값을 관리할 수 있지만 샤딩을 사용하게 되면 해당 부분이 깨지게 된다. 또한 Redis에 데이터를 저장할건데 굳이 Mysql까지..
Docker With IPTables 개론 리눅스 호스트에서 동작하는 도커 컨테이너에 Redis가 돌아가고 있으며 포트맵핑으로 6379번 포트를 10000번으로 포트포워딩 했다. 그리고 DOCKER-USER Chain에 아래와 같이 명령어로 10000번 포트에 대해 DROP을 하였지만 동작하지 않아 그 이유를 알아내기 위한 포스팅이다. (개인 공부 목적이기에 틀린 내용이 있을 수 있음) sudo iptables -I DOCKER-USER -p tcp --dport 10000 -j DROP Iptables? iptables란 호스트내에서 방화벽역할로 주로 사용되는데 각 netfilter hook에 걸린것을 처리하는 역할을 지닌다. netfilter에는 5개의 Hook Point가 존재한다. PREROUTI..
Docker Iptables 개론 호스트에서 ufw를 사용한다고 해서 호스트 내부 docker의 네트워크에 영향을 끼치는 것은 아니다. docker또한 DOCKER chain, DOCKER-USER chain 이라는 커스텀 iptables chain을 소유하고 있기 때문에 방화벽에 어떤 구성을 하든 DOCKER chain과 DOCKER-USER chain이 우선권을 가지게 된다. 즉, 외부에서 들어오는 패킷에 대해서 해당 체인이 가장 먼저 검사를 진행한다. 또한, Docker는 기본적으로 아래 사진과 같이 외부의 모든 주소에 대해 허용하는 정책을 지닌다. 만약 자신의 룰을 적용하고 싶다면 DOCKER-USER chain에 룰을 작성해야 한다. 도커는 기본적으로 DOCKER chain을 실시간으로 룰을 작..
C++ vtable gdb로 살펴보기 개론 C++의 상속관계에서 다형성을 구현하기 위해서는 Virtual 함수를 사용하여 구현한다. 이를 gdb를 통해서 어떤식으로 구성하는지 알아보자. #include class A { public: virtual void a_func() { std::cout A *ptr = nullptr; 0x00000000004011b8 : mov QWORD PTR [rbp-0x8],0x0 => ptr = &a; 0x00000000004011c0 : lea rax,[rbp-0x18] 0x00000000004011c4 : mov QWORD PTR [rbp-0x8],rax 그리고 parent()함수를 호출하는 어셈블리 코드인데 좀 더 세부적으로 분해를 해보자. => ptr->parent..
BPF는 무엇인가 개론 네트워크 패킷 모니터링을 하기 위해서는 네트워크 인터페이스에서 들어오는 패킷을 사용자가 원하는 패킷만 필터링하고 나머지 패킷은 Reject하여 Accept되는 패킷만을 Userspace의 Application으로 패킷을 복사해주는 개념이다. 기존의 Unix Packet Filter 시스템은 CSPF(CMU/Stanform Packet Filter) 모델을 사용했었다. 하지만 CSPF는 메모리 스택기반의 Tree 모델을 사용했기 때문에 CPU와 메모리간의 병목현상이 자주 발생하는 성능적인 이슈와 중복파싱에 대한 이슈이 존재했었다. 위의 단점들을 극복하고 나온것이 BPF(BSD Packet Filter)이다. 초기 BPF는 Tcpdump에 주로 쓰였으나 오늘날 리눅스의 여러분야에서도 ..
ASP.NET Core 7.0을 도커로 배포하기 계획 Windows 11 호스트에 도커 3개를 띄워 서버를 운영할 계획이다. 1번 도커 : ASP.NET Core 웹서버 2번 도커 : Redis 서버 3번 도커 : Mysql 서버 사용하는 서비스 확인하기 ASP.NET Core 7.0 Mysql Redis Redis 도커 만들기 Docker를 통해 최신 Ubuntu Image pull하기 해당 ubuntu image를 바탕으로 컨테이너 생성 local bindind 진행 docker run -it --name RedisServer -p 127.0.0.1:6000:6379 ubuntu 주의) 기존에 개발서버로 Redis를 이미 운영하고 있다면 포트포워딩을 해준다. 내부터미널로 접속하여 Redis를 설치한다..