Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .docker/go/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ FROM golang:1.19

ENV GO111MODULE on

RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y iproute2 iputils-ping dnsutils traceroute iperf3 lsof tcpdump wireshark vim
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y iproute2 iputils-ping dnsutils iperf3 vim tcpdump lsof
138 changes: 125 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,17 +1,129 @@
# 📣 echoman: simple echo server
# 🐶 echoman: Simple echo server using Rawsocket

## 🌱 Overview
- This is a simple tool where a client generates packets over TCP/IP and sends them to a server.
- The echo server echoes data by swapping src/dst L3 address and L4 port number. (However, some parameters such as TypeCode and CheckSum are recalculated.)
## 🌱 Overview
- これはTCP/IPの上でClientがパケットを生成してServerへ送信するだけの簡単なツールです
- Serverはsrc/dst L2,L3アドレス, L4ポート番号を入れ替えてデータをechoします(ただし、TypeCodeやCheckSumなどの一部パラメータは再計算する)
- Rawsocketを使用してL2レベル(`syscall.ETH_P_IP`)でパケットを操作
- **LayersType: `LayerTypeEthernet`**

## ✏️ Documents
- [Information: Network design](./docs/01_information.md)
- [Application: An application that communicates over the overlay network](./docs/02_application.md)
- [Usage: How to start echoman](./docs/03_usage.md)
- [Appendix: About sockets](./docs/04_appendix.md)
## ⚡️ Generating socket descriptors
### Socket functions
<img src="https://user-images.githubusercontent.com/63791288/194802596-fbed4e9f-4877-45a9-817d-14522b8a5c2c.png" alt="ansible" width="280" height="400" />

### Used function
| args | syscall |
| :--- | :---: |
| Domain | `AF_PACKET` |
| Type | `SOCK_RAW` |
| Protocols | `ETH_P_IP` |

```go
### 送信ソケットの生成
func etherSendSock(intfIndex *net.Interface) (int, error) {
fd, err := syscall.Socket(syscall.AF_PACKET, syscall.SOCK_RAW, int(htons(syscall.ETH_P_IP)))
if err != nil {
return -1, err
}

addr := syscall.SockaddrLinklayer{
Protocol: htons(syscall.ETH_P_ALL),
Ifindex: intfIndex.Index,
}

if err := syscall.Bind(fd, &addr); err != nil {
return -1, err
}

return fd, nil
}

### 受信ソケットの生成
func etherRecvSock(intfIndex *net.Interface) (int, error) {
fd, err := syscall.Socket(syscall.AF_PACKET, syscall.SOCK_RAW, int(htons(syscall.ETH_P_IP)))
if err != nil {
return -1, err
}

addr := syscall.SockaddrLinklayer{
Protocol: htons(syscall.ETH_P_ALL),
Ifindex: intfIndex.Index,
}
if err := syscall.Bind(fd, &addr); err != nil {
return -1, err
}

// Received in promiscuous mode
if err := syscall.SetLsfPromisc(intfIndex.Name, true); err != nil {
return -1, err
}

return fd, nil
}

### Ethernetパケット(L2~)の送信
func SendEtherPacket(fd int, b []byte) error {
if _, err := syscall.Write(fd, b); err != nil {
return err
}

return nil
}
```

## 🤝 Requirement
- **⚠️WARNING**:https://docs.docker.com/desktop/previous-versions/3.x-mac/#new-9

> First version of docker compose (as an alternative to the existing docker-compose). Supports some basic commands but not the complete functionality of docker-compose yet.

| Languages / Frameworks | Version |
| :--- | ---: |
| Golang | 1.19.1 |
| Docker Desktop | 4.12.0 |
| docker | 20.10.17 |
| docker-compose | 1.29.2 |

## 🚀 Usage
```sh
### envをコピー
$ cp server/.env{.sample,}
$ cp client/.env{.sample,}

### .envの中身を環境に合わせて書き換える
※注意: Docker networkではMACアドレスはランダムに生成されます

### docker-composeを起動
$ make up

### 実行
---
### 1枚目のTerminal: Echoman server を起動
$ make exec/server
# make run

### 2枚目のTerminal: Echoman client を起動
$ make exec/client
# make run
---

### Echoman clientはデフォルトでUDPを喋ります
-> .env を編集することで生成するパケットタイプを切り替える
PACKET_TYPE=[パケットタイプ]
```
| PacketType | Env Value |
| :--- | :---: |
| ICMPv4 | `ICMPV4` |
| UDPv4 | `UDPV4` |

## 📖 Default Information

| Device | Information |
| :--- | ---: |
| Echoman Server IPv4 address | `10.0.3.95` |
| Echoman Server Port number | `30005` |
| Echoman Client IPv4 address | `10.0.3.96` |
| Echoman Client Port number | `30006` |

## 📚 References
- [RFC 792 - Internet Control Message Protocol](https://www.rfc-editor.org/rfc/rfc792)
- [RFC 768 - User Datagram Protocol](https://www.rfc-editor.org/rfc/rfc768)
- [Universal TUN/TAP device driver](https://docs.kernel.org/networking/tuntap.html)
- [Checksum calculation](https://o21o21.hatenablog.jp/entry/2019/01/31/120436)
- [RFC 792](https://www.rfc-editor.org/rfc/rfc792)
- [RFC 768](https://www.rfc-editor.org/rfc/rfc768)
- [Checksum計算](https://o21o21.hatenablog.jp/entry/2019/01/31/120436)
15 changes: 5 additions & 10 deletions client/.env.sample
Original file line number Diff line number Diff line change
@@ -1,15 +1,10 @@
DEBUG_MODE=true
VIRTUAL_IP_TYPE=4

LOCAL_INTERFACE=eth0
LOCAL_UDP_PORT=30006

PEER_IPV4_ADDRESS=10.0.3.95
PEER_IPV6_ADDRESS=fde4:db8::0395
PEER_UDP_PORT=30000
PEER_MAC_ADDRESS=02:42:0a:00:03:5f
PEER_UDP_PORT=30005

TUN_INTERFACE_NAME=echoman_tun
PACKET_TYPE=UDPV4

ECHOMAN_SERVER_IPV4_TUN=198.18.9.10
ECHOMAN_SERVER_IPV6_TUN=2001:db8:c0ff:ee00:0910:0910:0910:0910

CHROUS_PORT=30910
DEBUG_MODE=true
17 changes: 5 additions & 12 deletions client/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@ GODOC=$(GOCMD)doc
GOLANGCI=golangci-lint
DUMPCMD=tcpdump

INTERFACE_REAL=eth0
INTERFACE_VIRTUAL=echoman_tun
INTERFACE=eth0



Expand Down Expand Up @@ -43,17 +42,11 @@ coverage: ## coverage
go test -coverprofile=cover.out ./...
go tool cover -html=cover.out -o cover.html

dump-real: ## dump packet
$(DUMPCMD) -i ${INTERFACE_REAL}
dump: ## dump packet
$(DUMPCMD) -i ${INTERFACE}

dump-virtual: ## dump packet
$(DUMPCMD) -i ${INTERFACE_VIRTUAL}

dump-real/out: ## dump packet and output to file
$(DUMPCMD) -i ${INTERFACE_REAL} -w ./debug/dumpfile-client-real.pcapng

dump-virtual/out: ## dump packet and output to file
$(DUMPCMD) -i ${INTERFACE_VIRTUAL} -w ./debug/dumpfile-client-virtual.pcapng
dump/out: ## dump packet and output to file
$(DUMPCMD) -i ${INTERFACE} -w ./debug/dumpfile-client.pcapng

listen: ## check listen port
lsof -i -P
Expand Down
130 changes: 0 additions & 130 deletions client/chorus/generate_request.go

This file was deleted.

Loading