Skip to content

Commit

Permalink
2024-02-28
Browse files Browse the repository at this point in the history
  • Loading branch information
Lim committed Feb 28, 2024
1 parent c668f3a commit a44870e
Showing 1 changed file with 186 additions and 0 deletions.
186 changes: 186 additions & 0 deletions docs/sk-lim19f/2024-02-28.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,186 @@
### 10.1.3 리눅스 방화벽 정책 확인

```
// iptables의 설정값을 확인하는 명령은 -L (--list) 옵션을 사용
$ iptables -L
```

```
ACCEPT all-- anywhere anywhere state RELATED, ESTABLISHED
```

- INPUT 체인 1번 정책
- 첫 번째 허용 정책을 보면 RELATED, ESTABLISHED 상태인 모든 출발지에 대해 허용하도록 룰이 설정되어 있음
- 이미 세션이 맺어져 있거나(ESTABLISHED) 연계된 세션이 있을 때, 어떤 출발지나 목적지인 패킷이더라도 허용하는 정책
- FTP는 원시적인 프로토콜이어서 컨트롤 프로토콜과 데이터 프로토콜이 별도로 동작
- 처음 연결된 이후 로그온, 항목 리스트 등의 실제 파일을 다운로드하기 전까지 컨트롤 프로토콜을 사용하고 실제로 데이터 다운로드 명령이 내려지면 별도로 세션을 만들어 다운로드를 시작
- 두 개의 연결이 별도로 이루어지다보니 방화벽 입장에서는 이 두 개의 연결을 연계시키지 못하면 제대로 통신을 할 수 없음
- RELATE state를 이용해 이 두 가지의 연결을 하나로 간두하게 됨

```
ACCEPT icmp-- anywhere anywhere
```

- INPUT 체인 2번 정책
- ICMP에 대한 허용 정책
- 이 정책을 통해 ping과 같은 서비스를 사용할 수 있음

```
ACCEPT tcp-- anywhere anywhere state NEW tcp dpt:ssh
```

- INPUT 체인 4번 정책
- 신규 세션인 NEW state 중 목적지 서비스 포트가 SSH인 경우만 허용
- 간단히 표현하면 외부에서 서버로 SSH(22) 접속을 허용하는 정책

```
REJECT all-- anywhere anywhere reject-with icmp-host-prohibited
```

- INPUT 체인 5번 정책
- 다섯 번째 정책은 위의 첫 번째부터 네 번째 정책에 매치되지 않은 패킷들을 차단하는 정책
- INPUT 체인 자체는 기본 정책이 ACCEPT로 선언되어 있지만 이 정책 때문에 화이트리스트 기반 방화벽처럼 동작하게 됨
- REJECT는 곧바로 폐기하는 DROP과 달리 ICMP 프로토콜을 이용해 패킷 차단 이유를 출발지에 전달
- iptables의 기본 룰에서는 icmp-host-prohibited 메시지를 이용해 해당 패킷이 차단되었음을 알려줌

```
ACCEPT all-- anywhere anywhere
```

- INPUT 체인 3번 정책
- iptables -L의 내용만으로 보면 모든 출발지의 모든 트래픽에 대해 허용하므로 마치 Any Open 정책처럼 보임
- 하지만 실제로 외부에서 들어오는 패킷은 해당 정책을 거치지 않고 최하단의 DROP 정책에서 대부분 걸러짐
- iptables 설정확인

```
$ iptables -S
```

- 모든 정책에 대해 허용하는 것으로 되어 있지만 실제로 해당 정책이 적용되는 인터페이스가 루프백 인터페이스(lo)임을 알 수 있음
- 실제 정책이 어떻게 정의되어 있는지 확인하려면 -S이나 iptables 파일을 직접 확인해야 함

### 10.1.4 리눅스 방화벽 관리

- iptables에 웹 서비스가 가능하도록 http 서비스 포트를 열어주는 정책 추가

```
$ iptables -A INPUT -p tcp --dport 80 -j ACCEPT
```

- 정책을 추가하려면 -A나 --append 옵션을 사용
- 옵션 뒤에는 어떤 체인에 적용할 것인지를 지정
- 체인명 뒤에는 넣을 정책을 정의
- 프로토콜을 지정하기 위해 -p(또는 --protocol) 옵션을 사용
- 목적지 포트를 제어하기 위해 --dport 옵션을 사용
- 출발지 포트는 --sport 옵션을 사용
- 출발지나 목적지의 IP 주소를 제어하기 위해 -s(또는 --source), -d(--destination) 옵션을 사용
- IP 주소 설정을 별도로 하지 않으면 anywhere로 적용
- 정책에 일치하는 패킷을 어떻게 처리할 것인지를 정하는 타깃 지정은 -j 옵션 사용
- iptables의 정책 삭제는 -A 대신 -D나 --delete 옵션을 사용

```
$ iptables -D INPUT -p tcp --dport 21 -j ACCEPT
```

- 정책이 너무 많을 때는 -L 옵션으로 일치하는 정책이 있는지 확인하기 어려우므로 -C나 --check 옵션을 사용해 해당 정책이 있는지 확인할 수 있음

```
$ iptables -C INPUT -p tcp --dport 21 -j ACCEPT
```

- 특정 위치에 정책을 추가하려면 정책의 줄 번호를 지정해야 함
- 기본 정책 확인 명령어로는 방화벽 정책의 줄 번호를 확인할 수 없으므로 -L 옵션 뒤에 --line-number 옵션을 추가해 현재 정책의 줄 번호를 확인

```
$ iptables -L --line-number
```

- 기존 tables에 추가할 때는 -A 옵션을 사용했지만 특정 위치에 정책을 추가하기 위해서는 -I나 --insert 옵션을 사용

```
$ iptables -I INPUT 5 -p tcp --dport 80 -j ACCEPT
```

- 특정 서비스 포트에 대해 특정 IP만 허용

```
$ iptables -A INPUT -i eth0 -p tcp -s 172.16.10.10/32 --dport 22 -j ACCEPT
$ iptables -A INPUT -i eth0 -p tcp --dport 22 -j DROP
```

- IP 주소를 범위로 지정

```
$ iptables -A INPUT -p all -m iprange --src-range 192.168.0.0-192.168.255.255 -j DROP
```

- iptable에서 주소를 범위로 지정하는 방법

```
-m iprange --src-range 시작 IP 주소-끝 IP 주소
-m iprange --dst-range 시작 IP 주소-끝 IP 주소
```

- 서비스 포트를 범위로 지정

```
$ iptables -A INPUT -p tcp -m multiport --dport 3001:3010 -j DROP
```

- -F 옵션을 사용하면 iptables에 적용된 정책을 한꺼번에 삭제 가능

```
$ iptables -F
$ iptables --flush
```

- -p 옵션은 각 체인의 기본 정책을 변경

```
$ iptables -P INPUT DROP
$ iptables -P FOWARD DROP
$ iptables -P OUTPUT DROP
```

- iptables 정책 파일은 다음의 위치에 있음

```
/etc/sysconfig/iptables
```

### 10.1.5 리눅스 방화벽 로그 확인

- iptables도 일반 방화벽과 마찬가지로 로그를 통해 iptables 정책에 의해 차단되거나 허용된 내용을 확인할 수 있음
- iptables의 로그는 /var/log/messages에 남으므로 메시지 파일을 보려면 다음과 같이 로그 내용을 확인할 수 있음

```
$ tail -f /var/log/messages
```

- 하지만 메시지 파일에는 iptables 로그 외에 다른 로그들도 포함되어 있음
- iptables 로그만 확인하려면 다음과 같은 설정이 필요
- rsyslog.conf 파일에 다음과 같이 추가

```
kern.* /var/log/iptables.log
```

- rsyslog 서비스를 재시작

```
$ systemctl restart rsyslog.service
```

- warning 수준의 로그를 남기기 위해 log-level을 4로 하고 로그를 구분하는 식별자 추가

```
$ iptables -I INPUT LOG --log-level 4 --log-prefix '## ZIGI-Log ##
```

- --log-prefix 옵션을 사용하지 않아도 로그를 남길 수 있지만 prefix를 정해두면 로그를 구분할 수 있음
- iptables 정책을 확인하는 -L 옵션 뒤에 -v 옵션을 사용하면 통과하는 패킷과 바이트 수를 확인할 수 있음

```
$ iptables -L -v
```

0 comments on commit a44870e

Please sign in to comment.