LabHub

네트워크 기초 — 리눅스 VM 에서 손으로 · 방화벽과 NAT · 실습

nftables 로 서버 하나를 잠근다

LabHub 에서 이어서 보기

이 실습은 VM 에서 돕니다

네임스페이스 srv 가 서버, cli 가 클라이언트입니다. 방화벽 규칙은 **srv
안에** 씁니다. VM 자신의 입력 체인을 잠그면 채점 에이전트까지 막히므로
루트 네임스페이스에는 규칙을 넣지 마세요.

목표

nftables 로 "기본은 막고 필요한 것만 연다" 를 만듭니다. 상태 추적으로 응답
패킷을 허용하고, 포트와 출처로 구멍을 내고, 버려지는 패킷을 세고, 규칙을
파일로 남깁니다.

왜 중요한가

방화벽은 규칙 목록이 아니라 순서와 기본값입니다. 기본이 drop 이면 빠뜨린
것이 막히고, accept 면 빠뜨린 것이 열립니다. 그리고 상태 추적을 모르면
"나가는 건 되는데 응답이 안 들어온다" 는 규칙을 쓰게 됩니다 — 실제로 가장
흔한 자기 잠금이 SSH 로 접속한 채 방화벽을 켜서 자기 세션의 응답까지 막는
것입니다. nftables 는 iptables 의 후속이고 쿠버네티스·도커·systemd 가 전부 이
위에서 규칙을 만들기 때문에, 읽을 줄 알아야 "누가 이 규칙을 넣었나" 를 찾습니다.

단계

1. 네임스페이스 cli·srv 와 veth cli0srv0 를 만들어 10.70.0.2/24·10.70.0.1/24 를 붙이고 ping 이 되게 하세요.
2. srv10.70.0.1:80 을 듣는 python3 -m http.server10.70.0.1:2222 를 듣는 nc -lk 를 띄우세요.
3. srv 에 테이블 inet fwinput 훅 체인(정책 drop)을 만들어 cli 에서 아무것도 안 되게 하세요.
4. input 체인에 lo 허용, ct state established,related 허용, icmp 허용 세 규칙을 넣어 ping 이 다시 되게 하세요.
5. tcp dport 80 허용 규칙을 넣어 cli 에서 웹은 되고 2222 는 여전히 안 되게 하세요.
6. ip saddr 10.70.0.2 에서 오는 tcp dport 2222 만 허용하는 규칙을 넣으세요.
7. 체인 끝에 counter drop 규칙을 두고 cli 에서 3333 포트를 두드린 뒤, 그 카운터가 보이는 nft list chain 출력을 /root/fw/dropped.txt 에 저장하세요.
8. srv 의 전체 규칙을 /root/fw/ruleset.nft 에 저장하세요. nft -c -f 로 문법이 통과해야 합니다.

참고

단계 8개

  1. 서버와 클라이언트
  2. 서비스 둘
  3. 기본은 막는다
  4. 기본 세 줄
  5. 80 만 연다
  6. 출처로 좁힌다
  7. 버려지는 것을 센다
  8. 규칙을 파일로