---
# System prepended metadata

title: 20231216 低レベル勉強会Tokyo 前半 Go言語で

---

# 20231216 低レベル勉強会Tokyo 前半 Go言語でポートスキャン


# テキスト

https://zenn.dev/satoken/articles/golang-port-scanner

レポジトリ：
https://hackmd.io/@nanbuwks/Skq8Pn5UT

# 作業環境

Linux 環境が必要ですが、MS-Windows 上で WSL2 や Mac でもOKのはず。

去年試した例  → https://hackmd.io/BCGiB2WMQdyeTgNN43aGfg


cloudshellが便利ですかね
https://cloud.google.com/shell?hl=ja

Go のインストールする場合も、こちらを参照 → https://hackmd.io/BCGiB2WMQdyeTgNN43aGfg

# ネットワーク環境

host0,host1,attacker の3ホストが必要となりますが、netns を使って仮想的に作成します。
https://github.com/sat0ken/go-port-scanner/blob/main/tools/netns1.sh

# Docker 環境をインストール

「Ubuntu20.04 に Docker を導入する (Also Ubuntu 22.04)」
https://qiita.com/nanbuwks/items/0ba1d13b3cd27e5c6426

# トラブルシューティング
dockerでエラー(Linux環境)


```
unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/images/create?fromImage=sat0ken%2Fgo-port-scanner&tag=latest": dial unix /var/run/docker.sock: connect: permission denied
```

→ root権限が必要なので、sudoをつけて実行する必要がある。
あるいはユーザ権限を設定すればOKになる。後々のために以下をしておくほうがいいかな?

(Linux の場合の操作)
```
$ sudo usermod -aG docker $USER
```

として再起動。



## gopacketについて

gopacketのドキュメントを参照

https://pkg.go.dev/github.com/google/gopacket

gopacketに含まれているサブパッケージは以下を参照

https://pkg.go.dev/github.com/google/gopacket#section-directories

上記のライブラリは、Docker 環境を使用する場合は既にインストールされています。


## Docker 環境に入った後

```
# cd /work
```
とするとレポジトリをクローンしたファイルが見えるようになるのでそこで作業します。

## 参加者の質問

### docker 内部のソースファイルはどうやって編集すればいいの?

 docker を立ち上げたターミナルと別のターミナルやデスクトップGUIなどで、先に`git clone` でダウンロードしていたファイルを好きなエディターで編集します。docker 起動時のオプションで`$(pwd):/work` とマウントの指定を行っているのでカレントディレクトリ内のファイルに変更を加えると、 Docker 実行中の `/work` 内に反映します。

### docker 内部に vim とかインストールできないかな?

` apt` コマンドとか使えます。好きなコマンドなどをインストールでき、使えるようになりますが一旦 `exit` すると元に戻ってしまうので注意。

### マイルーター

家庭用ルータにこの機能があることについて、なんとなくわかった気がします。

![image](https://hackmd.io/_uploads/BkuMZ69I6.png)

ルーターの配下LAN内のホスト同士の ARP spoofing を防止するのではなく、あくまでルーターに対しての ARP spoofing ぽいですね。

### さとけん先生にしつもん!


- Q.どういう理由でGoはトランスポートレイヤの通信ができるライブラリがあるんですか？他の言語では聞いたことがないです。（kmt-t）

  - A.   Goでミドルも作ったりするためなんですかね？僕もなんでGoで用意されているかはわからないです(><)

- Q.やぱりこういうのはGoがいいのでしょうか？TamさんもRDGatewayをGoで書いてますし、有名なところではtailscaleもGoです。

  - A.   なんでもいいとは思いますが、Cで実装するよりかはGoやRustが今はラクなんじゃないですかねw

- Q.仕事でネットワーク障害の切り分けが必要です。アプリケーションレベルではエラーコードはわかるのですが、そのエラーコードがどのケースで返ってくるかわかりません。再現確立が異常に低いので、どのような時にそのエラーコードになるか、調べるのにGoは使えますか？（kmt-t）

  - A.   Wiresharkとかのほうがいいんじゃないですかね？

- Q.TCPで接続するときにタイムアウトのエラーコードになるのですが、そのIPアドレスに相手がいない場合はオープンエラーになります。SYN ACKは返ってきてるだろうとかそういうのを推測したいです。

  - A.   まずpingが通らなければTCPもつながらないですからね

- Q.みなさん、さとけんさんのコード理解されてるんですか？コード読んだ方が本読むよりわかりやすいので勉強になります。（kmt-t）

- Q.QUIC、大学で研究されている人も多いのですが、知っている学生さんが卒論で撃沈したらしいです。さとけんさんは実装されていますが、論文読まれてるんですか？（kmt-t）

  - A.    論文は呼んでないですね、RFCだけです。
