2020-04-02 19:25:32 +00:00
|
|
|
|
## firewall
|
|
|
|
|
|
|
|
|
|
В этой задаче нужно написать примитивный файрвол.
|
|
|
|
|
|
|
|
|
|
Файрвол - это прокси сервер, пропускающий через себя все запросы,
|
|
|
|
|
и отвергающий некоторые из них по заданному набору правил.
|
|
|
|
|
|
|
|
|
|
Пример правил можно посмотреть в [example.yaml](./configs/example.yaml).
|
|
|
|
|
Все правила можно разделить на 2 группы: те, что приминяются к запросу и те, что приминяются к ответу.
|
|
|
|
|
|
2020-04-02 20:07:16 +00:00
|
|
|
|
Для решения этой задачи удобно использовать `http.Transport`.
|
|
|
|
|
|
2020-04-02 19:25:32 +00:00
|
|
|
|
На все заблокированные запросы нужно отвечать статусом 403 и строкой `Forbidden`.
|
|
|
|
|
|
2020-04-02 19:51:35 +00:00
|
|
|
|
Сервер должен принимать следующие агрументы:
|
|
|
|
|
* `-service-addr` - адрес защищаемого сервиса
|
|
|
|
|
* `-conf` - путь к .yaml конфигу с правилами
|
|
|
|
|
* `-addr` - адрес, на котором будет развёрнут файрвол
|
|
|
|
|
|
2020-04-02 19:25:32 +00:00
|
|
|
|
## Примеры:
|
|
|
|
|
В [http service](./cmd/service/main.go) находится примитивный сервис, который мы хотим защитить.
|
|
|
|
|
```
|
|
|
|
|
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
|
|
|
|
|
```
|
|
|
|
|
Делем тот же запрос через него:
|
|
|
|
|
```
|
|
|
|
|
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
|
2020-04-02 19:39:14 +00:00
|
|
|
|
* reverse proxy: https://en.wikipedia.org/wiki/Reverse_proxy
|
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/
|