Skip to content

⏸ [KEEP-PR] When using Real I/F only. - #2

Open
ren510dev wants to merge 1 commit into
masterfrom
keep/only-real-if
Open

⏸ [KEEP-PR] When using Real I/F only.#2
ren510dev wants to merge 1 commit into
masterfrom
keep/only-real-if

Conversation

@ren510dev

@ren510devren510dev commented Nov 19, 2022

Copy link
Copy Markdown
Owner
  • WARNING:Do not merge this branch

Real I/Fを使用したEchomanを試す場合はこのブランチを使用します

@ren510devren510dev changed the title ⏸ [kEEP-PR] When using Real I/F only.⏸ [KEEP-PR] When using Real I/F only.Nov 19, 2022
@ren510dev

Copy link
Copy Markdown
OwnerAuthor

🐶 echoman: Simple echo server using Rawsocket

🌱 Overview

  • これはTCP/IPの上でClientがパケットを生成してServerへ送信するだけの簡単なツールです
  • Serverはsrc/dst L2,L3アドレス, L4ポート番号を入れ替えてデータをechoします(ただし、TypeCodeやCheckSumなどの一部パラメータは再計算する)
  • Rawsocketを使用してL2レベル(syscall.ETH_P_IP)でパケットを操作
    • LayersType: LayerTypeEthernet

⚡️ Generating socket descriptors

Socket functions

ansible

Used function

argssyscall
DomainAF_PACKET
TypeSOCK_RAW
ProtocolsETH_P_IP
### 送信ソケットの生成funcetherSendSock(intfIndex*net.Interface) (int, error) {
fd, err:=syscall.Socket(syscall.AF_PACKET, syscall.SOCK_RAW, int(htons(syscall.ETH_P_IP)))
iferr!=nil {
return-1, err
}
addr:= syscall.SockaddrLinklayer{
Protocol: htons(syscall.ETH_P_ALL),
Ifindex: intfIndex.Index,
}
iferr:=syscall.Bind(fd, &addr); err!=nil {
return-1, err
}
returnfd, nil
}
### 受信ソケットの生成funcetherRecvSock(intfIndex*net.Interface) (int, error) {
fd, err:=syscall.Socket(syscall.AF_PACKET, syscall.SOCK_RAW, int(htons(syscall.ETH_P_IP)))
iferr!=nil {
return-1, err
}
addr:= syscall.SockaddrLinklayer{
Protocol: htons(syscall.ETH_P_ALL),
Ifindex: intfIndex.Index,
}
iferr:=syscall.Bind(fd, &addr); err!=nil {
return-1, err
}
// Received in promiscuous modeiferr:=syscall.SetLsfPromisc(intfIndex.Name, true); err!=nil {
return-1, err
}
returnfd, nil
}
### EthernetパケットL2~の送信funcSendEtherPacket(fdint, b []byte) error {
if_, err:=syscall.Write(fd, b); err!=nil {
returnerr
}
returnnil
}

🤝 Requirement

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 / FrameworksVersion
Golang1.19.1
Docker Desktop4.12.0
docker20.10.17
docker-compose1.29.2

🚀 Usage

### 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=[パケットタイプ]
PacketTypeEnv Value
ICMPv4ICMPV4
UDPv4UDPV4

📖 Default Information

DeviceInformation
Echoman Server IPv4 address10.0.3.95
Echoman Server Port number30005
Echoman Client IPv4 address10.0.3.96
Echoman Client Port number30006

📚 References

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@ren510dev