iptables?

0. 백업/복구 하기

백업

iptables-save > <>
  • iptables의 정책들을 위치에 저장함

  • 예시

iptables-save > /data/main/backup/iptables.backup

복구

iptables-restore < <>
  • iptables 백업본을 가지고 복구함

  • 예시

iptables-restore < /data/main/backup/iptables.backup

1. 확인하기

iptables -L

  • 뭔가 이것저것 많이 올라옴

  • 특정 테이블이 적용된 체인만 보기

iptables -t <테이블> -L 
  • 특정 체인에 걸린 정책들을 앞에 번호를 붙여서 표시
    • 여기서 나온 번호를 가지고 나중에 정책을 삭제할 수 있음
iptables -L <체인> -n --line-number

2. 정책 추가 / 수정하기

1) 화이트리스트 방식으로 만들기

  • 일단 기존 정책 싹 다 지움
iptables -F
iptables -X
  • 확인해보면 훨씬 정책이 줄어든걸 볼 수 있음

  • 이걸 이제 들어오는걸 막고 나가는거만 허용할거임
iptable -P INPUT DROP
iptable -P OUTPUT ACCEPT
iptable -P FORWARD DROP
  • 아래처럼 들어오는게 막히고 나가는게 허용됨

2) 정책 추가하기

특정 인터페이스에 대한 정책

  • 조건을 추가하려면 아래의 양식대로 작성
iptables -A <> -i(또는 -o) <인터페이스> -j <다음_행동>
  • -A <체인> : 지정한 체인에 있는 룰 뒤에다가 덧붙임 (Append)

  • -i <인터페이스> : 지정한 인터페이스로 들어온 데이터에 해당 규칙을 적용함 (Input)

    • 참고 : -i 는 INPUT이랑 FORWARD 체인에 사용함
  • -o <인터페이스> : 지정한 인터페이스로 나가려는 데이터에 해당 규칙을 적용함 (Output)

    • 참고 : -o는 OUTPUT이랑 FORWARD 체인에 사용함
  • -j <다음_행동> : 다음 행동으로 어떤걸 할지 지정함 (Drop or Accept) (Jump)

  • 예시

iptables -A INPUT -i lo -j ACCEPT
  • 루프백 인터페이스로 들어오는거는 허용

특정 IP에 관해 적용하는 정책

iptables -A <> -s(또는 -d) <아이피> -j <다음_행동>
  • -A <체인> : 지정한 체인에 있는 룰 뒤에다가 덧붙임 (Append)

  • -s <아이피> : 출발 아이피가 해당 아이피인 경우 (Source)

  • -d <아이피> : 도착 아이피가 해당 아이피인 경우 (Destination)

  • -j <다음_행동> : 다음 행동으로 어떤걸 할지 지정함 (Drop or Accept) (Jump)

  • 예시

  • 지금 일부러 모든 INPUT 의 ACCEPT 를 막아놨음

  • 실제로 핑을 날려보면 안감

iptables -A INPUT -s 192.168.10.20 -j ACCEPT
  • 저번에 VLAN 때 만들어 둔 Rocky Linux 9 의 IP를 허용으로 추가해놨음

  • 참고 : 정책은 1번부터 숫자가 커지는 순서대로 체크하기 때문에, DROP이 위에 있으면 다 떨궈짐!

  • 허용으로 추가되었기 때문에 이제 타임아웃이 안걸림

특정 포트에 관해 적용하는 정책

iptables -A <> -p <프로토> --sport(또는 --dport) <포트>
  • -A <체인> : 지정한 체인에 있는 룰 뒤에다가 덧붙임 (Append)

  • -p <프로토콜> : tcp, udp, icmp 등 프로토콜 (Protocol)

  • —sport <포트> : 출발 포트가 해당 포트인 경우 (Source)

  • —dport <포트> : 도착 포트가 해당 포트인 경우 (Destination)

  • -j <다음_행동> : 다음 행동으로 어떤걸 할지 지정함 (Drop or Accept) (Jump)

  • 참고 : —sport, —dport 는 -p 로 프로토콜을 지정해주지 않으면 안됨

  • 예시

# SSH 허용 예시
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
 
# HTTP / HTTPS 허용 예시
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
  • 제대로 들어갔나 확인
iptables -L INPUT -n --line-numbers

특정 조건을 부합했을 때 적용하는 정책

iptables -A <> -m <매칭_조> -j <다음_행>
  • -m <매칭_조건> : 기본적으로 제공되는 기능 (특정 포트, 특정 IP) 이 아니고 다른 추가적인걸 써야 할 때 사용함
모듈용도
conntrack연결 상태 추적
state(구버전) 연결 상태
limit패킷 속도 제한
recent최근 접속 IP 기록
multiport여러 포트 한 번에
tcpTCP 플래그 검사
  • 현재 연결되어있는 연결 (말이 제법 웃기지만), 그리고 그 부분과 연관된 연결에 대해서는 허용으로 전환하는 예시
iptables -A INPUT -m conntrack --cstate ESTABLISHED, RELATED -j ACCEPT

로그를 남기기 위한 정책

iptables -A ........ -j LOG --log-prefix <접두>
  • 위에서 써둔 방식 뒤에 -j LOG 를 붙이면 journalctl로 확인이 가능함

  • 예시

iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH LOG : "

NAT 구현

DNAT

iptables -t nat -A <> <조건> \
	-j DNAT --to-destination <IP:Port>
  • 참고 : DNAT은 PREROUTING, OUTPUT 체인에서 사용 가능함

  • 예시

iptables -t nat -A PREROUTING -p tcp --dport 80 \
	-j DNAT --to-destination 192.168.0.10:8080

SNAT

iptables -t nat -A <> <조건> \
	-j SNAT --to-source <IP>
  • 참고 : SNAT은 POSTROUTING 에서만 가능함

  • 예시

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 \
	-j SNAT --to-source 1.2.3.4

MASQUERADE (SNAT IP 자동설정)

iptables -t nat -A <> <조건> \
	-o <인터페이> -j MASQUERADE
  • 예시
iptables -t nat -A POSTROUTING -s 192.168.0.0./24 \
	-o enp0s1 -j MASQUERADE

3. 정책 삭제하기

  • 정책의 숫자를 사용해서 삭제하는게 편함
iptables -L <체인> -n --line-number
iptables -D <체인> <>
  • 예시
  • 아래 사진에서 9번째 조건을 삭제하고 싶다면 아래의 명령어 실행

iptables -D INPUT 9