shad-go/firewall/README.md

57 lines
2.4 KiB
Markdown
Raw Permalink Normal View History

2020-04-02 19:25:32 +00:00
## firewall
В этой задаче нужно написать примитивный файрвол.
2022-03-06 02:06:00 +00:00
Файрвол - это прокси сервер, пропускающий через себя все запросы
2020-04-02 19:25:32 +00:00
и отвергающий некоторые из них по заданному набору правил.
Пример правил можно посмотреть в [example.yaml](./configs/example.yaml).
2020-04-02 20:24:33 +00:00
Все правила можно разделить на 2 группы: те, что применяются к запросу и те, что применяются к ответу.
2020-04-02 19:25:32 +00:00
Для решения этой задачи удобно использовать `http.RoundTripper`.
2020-04-02 19:25:32 +00:00
На все заблокированные запросы нужно отвечать статусом 403 и строкой `Forbidden`.
2021-03-30 23:10:32 +00:00
Сервер должен принимать следующие аргументы:
2020-04-02 19:51:35 +00:00
* `-service-addr` - адрес защищаемого сервиса
* `-conf` - путь к .yaml конфигу с правилами
* `-addr` - адрес, на котором будет развёрнут файрвол
2020-04-02 19:25:32 +00:00
## Примеры:
2020-04-02 20:17:18 +00:00
В [cmd/service](./cmd/service/main.go) находится примитивный сервис, который мы хотим защитить.
2020-04-02 19:25:32 +00:00
```
go run ./firewall/cmd/service/main.go -port 8080
```
2020-04-02 19:51:35 +00:00
Делаем запрос:
2020-04-02 19:25:32 +00:00
```
curl -i http://localhost:8080/list -d '"loooooooooooooooooooooooooooooong-line"'
HTTP/1.1 200 OK
Date: Thu, 02 Apr 2020 19:14:36 GMT
Content-Length: 40
Content-Type: text/plain; charset=utf-8
"loooooooooooooooooooooooooooooong-line"
```
Стартуем firewall:
```
go run ./firewall/cmd/firewall/main.go -service-addr http://localhost:8080 -addr localhost:8081 -conf ./firewall/configs/example.yaml
```
2020-04-02 20:22:04 +00:00
Делаем тот же запрос через него:
2020-04-02 19:25:32 +00:00
```
curl -i http://localhost:8081/list -d '"loooooooooooooooooooooooooooooong-line"'
HTTP/1.1 403 Forbidden
Date: Thu, 02 Apr 2020 19:14:40 GMT
Content-Length: 9
Content-Type: text/plain; charset=utf-8
Forbidden
```
Сработало правило на максимальную длину запроса.
## Resources
* project layout: https://github.com/golang-standards/project-layout
* reverse proxy: https://pkg.go.dev/net/http/httputil#ReverseProxy
2020-04-02 19:25:32 +00:00
* yaml: https://gopkg.in/yaml.v2
2020-04-02 19:31:31 +00:00
* regexp: https://golang.org/pkg/regexp/