IPTABLE

:)·2024년 6월 18일
0

보안 

목록 보기
25/28

IPTABLE

  • IPS: 탐지, 차단은 선택/IDS: 탐지 중점, 차단 가능은 함

    • 방화벽: 3,4 혹은 7계층까지 가능. but 특화된 것도 없어서 전문적 차단은 어려움 그래서 IPS 사용
  • 기본 개념

    • 기능
      1. 패킷필터링 ( netfilter )
      2. 로그기능 ( logging )
      3. NAT ( SNAT/DNAT=포트포워딩 )
      4. 확장 기능 (다양한 모듈 = mangle )
    • INPUT : 도착지가 IPTABLE인 패킷 - 10 -> IPTABLE
    • OUTPUT : 출발지가 IPTABLE인 패킷 - IPTABLE -> 10
    • FORWARD : 경유지(via)가 IPTABLE인 패킷 - 10 ->20
    • INPUT, FORWARD, OUTPUT 셋 다 별개의 정책이자 개념
      • iptable 입장에서는 서버는 나에게 주는 놈(IN), 클라이언트는 내가 줘야하는 놈(OUT)
      • 밖에서 안으로 들어오는 건 IN, 내부를 통해서 나가는 건 OUT으로 잡아야 함 / 내부는 자유롭게 돌아다니기에..
    • IPTABLES 적용 순서: 먼저 적용된 것이 무조건 우선
    • 생각을 할 때 ip 기준에서 x, iptable 입장에서 고려
    • 정책은 반드시 하나는 거쳐야 함, 아닐 시 drop
  • 기본 정책

    :INPUT ACCEPT [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]

    • ACCEPT : 허가 → 디폴트
    • REJECT : 반송
    • DROP : 폐기 → 주로 쓰임
    • LOG : 로그기록
    • RETURN : 룰 연계
  • iptables 룰

    • -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
      • 내부로 접근하는 tcp 중 (- A INPUT -p tcp )
      • 새로운 연결을 요청하는 (-m state --state NEW )
      • 도착 포트 22/tcp 허가 (-m tcp --dport22 -j ACCEPT )
    • 룰 정책 - first
      • 룰의 순서 중요
        • -A (--append) : 규칙 추가
        • -P (--policy) : 기본 정책 변경
        • -F (--flush) : chain으로부터 규칙 모두 삭제
        • -D (--delete) : 규칙을 삭제
          • iptables -D FORWARD 1
          • 정책 삭제 시 한칸씩 당겨짐
        • -C (--check) : 패킷 테스트
        • -R (--replace) : 새로운 규칙으로 교체
        • -I (--insert) : 새로운 규칙 삽입
        • -L (--list) : 규칙 출력
          • 자세히보기: iptables -L -v --line
        • -Z (--zero) : 모든 chain의 패킷과 바이트 카운터 값을 0으로 만듬
        • -N (--new) : 새로운 chain 생성
        • -X (--delete-chain) : chain 삭제
    • 장치 및 상태 옵션
      • -s (--source ) : 출발지 IP주소/네트워크
      • -d (--destination) : 목적지 IP주소/네트워크
      • -p (--protocol) : 프로토콜
      • 패킷 볼 때 중요: 출발지, 목적지, 프로토콜
      • 장치
        • -i (--in-interface) : 입력 장치 (내부 장치)
        • -o (--out-interface) : 출력 장치 (외부 장치)
      • 모듈
        • -m (--match) 특정 모듈
          • -m tcp --dport
            --sport
        • --state : 연결 상태

          ESTABLISHED : 연결이 되어있는 패킷
          NEW : 새로운 연결을 요청하는 패킷
          RELATED : 기존 연결 이외 다른 새로운 연결 요청 (ex: FTP데이터 전송포트(20/tcp)를 다른 포트로 사용하고자할때 / 꺼지기 전까지는 연결된 상태 유지)
          INVALID : 어디에도 속하지 않은 패킷

        • --j (--jump): 규칙 적용
        • --reject-with icmp-host-prohibited : 거부하고 ICMP를 금지 ⇒ 다른 호스트로 보내는 ICMP를 허가 X
          • -A INPUT -j REJECT --reject-with icmp-host-prohibited
          • -A FORWARD -j REJECT --reject-with icmp-host-prohibited
  • 백업 : iptables-save > /backup/ip.bak

  • 초기화 : iptables -F → service iptables-save (저장) → service iptables restart (적용)

  • 복구 : iptables-restore /backup/ip.bak

  • 정책 enum확인 : iptables -L INPUT --line

  • 내부 핑 허용 iptables -A INPUT -i lo -j ACCEPT

  • ssh 접속을 위한 옵션 iptables -A INPUT -p tcp --dport 22 -j ACCEPT

  • 예제 1. 도착지 X 출발지 패킷만 허용

    iptables -A FORWARD -s 10.10.10.10 -p icmp -j ACCEPT
    iptables -A FORWARD -s 20.20.20.20 -p icmp -j ACCEPT

    icmp 는 request:8

    reply:0

    • --icmp-type 8
      --icmp-type 0
      칼리에서 서버 ping X
      서버에서 칼리로 ping O
    • iptables -A FORWARD -s 10.10.10.10 -p icmp -m icmp --icmp-type 8 -j ACCEPT
      iptables -A FORWARD -s 20.20.20.20 -p icmp -j ACCEPT
      (iptables -A FORWARD -s 20.20.20.20 -p icmp --icmp-type 0 -j ACCEPT)
      service iptables save
      service iptables restart
  • 네트워크 대역 허용

    iptables -A FORWARD -s 10.10.10.0/24 -p icmp -j ACCEPT
    iptables -A FORWARD -s 20.20.20.0/24 -p icmp -j ACCEPT

  • 인터페이스 허용 (모든 포트 개방)

    1. 내부로 연결 허용 (icmp)
      iptables -A INPUT -i lo -p icmp -j ACCEPT
    2. 외부
      iptables -A FORWARD -i ens36 -j ACCEPT
      iptables -A FORWARD -o ens36 -j ACCEPT
    3. interface > ip > 포트 (icmp,tcp,udp) > -m 모듈
  • 예제
    • 전제
      • 기본정책 INPUT= DROP OUTPUT,FORWARD= ACCEPT
      • 내부로 icmp 허용
      • ssh 접속 가능
      • 칼리와 서버는 IPTABLE로 PING 금지 (기본값)
      • IPTABLES 는 칼리 서버 PING 가능 (기본값)
      • 서버는 칼리로 PING 가능 (서버: 10/ 칼리: 20 )
      • 칼리는 서버로 PING 불가
      • iptables -P INPUT DROP
        iptables -P OUTPUT ACCEPT
        iptables -P FORWARD ACCEPT
        -A INPUT -i lo -p icmp -j ACCEPT
        -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
        -A FORWARD -p icmp -m icmp --icmp-type 8 -s 20.20.20.20 -d 10.10.10.10 -j DROP
        service iptables save
        service iptables restart
  • 기본 세팅
    • iptables -A INPUT -i lo -j ACCEPT
    • iptables -A INPUT -p icmp -j ACCEPT
    • iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    • iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  • ip 알리아싱 ifconfig ens33:0 192.168.10.100 -> ens33:0
  • DNAT 세팅
    • iptables -A FORWARD -o ens36 -p tcp -m tcp --dport 80 -j ACCEPT
    • iptables -t nat -A PREROUTING -d 192.168.10.100 -p tcp --dport 80 -j DNAT --to 10.10.10.10:80

  • DNAT: 서버
  • SNAT: 사설 -> 공인 (인터넷 사용)
  • -A FORWARD -i ens32 -j ACCEPT → ens32 를 향해 들어오는 것들 모두 허용
    -A FORWARD -o ens32 -p udp -m udp --sport 53 -j ACCEPT → udp/53으로 시작했던 애들만 나갈 수 있게 허용
    -A FORWARD -o ens32 -p udp -m udp --dport 53 -j ACCEPT → udp/53을 향해 가는 애들만 나갈 수 있게 허용
  • NAT까지 설정된 vi /etc/sysconfig/iptables
    # Generated by iptables-save v1.4.21 on Thu Jun 13 14:34:18 2024
    *nat
    :PREROUTING ACCEPT [210:13992]
    :INPUT ACCEPT [0:0]
    :OUTPUT ACCEPT [2:152]
    :POSTROUTING ACCEPT [12:624]
    -A PREROUTING -d 192.168.10.100/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.10.10.10:80
    -A POSTROUTING -o ens33 -j MASQUERADE
    COMMIT
    # Completed on Thu Jun 13 14:34:18 2024
    # Generated by iptables-save v1.4.21 on Thu Jun 13 14:34:18 2024
    *filter
    :INPUT DROP [0:0]
    :FORWARD DROP [66:4812]
    :OUTPUT ACCEPT [113:14856]
    -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    -A INPUT -i lo -j ACCEPT
    -A INPUT -p icmp -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
    -A FORWARD -i ens32 -p udp -m udp --dport 53 -j ACCEPT
    -A FORWARD -o ens32 -p udp -m udp --sport 53 -j ACCEPT
    -A FORWARD -i ens32 -p tcp -m tcp --dport 443 -j ACCEPT
    -A FORWARD -o ens32 -p tcp -m tcp --sport 443 -j ACCEPT
    -A FORWARD -i ens32 -p tcp -m tcp --dport 80 -j ACCEPT
    -A FORWARD -o ens32 -p tcp -m tcp --sport 80 -j ACCEPT
    -A FORWARD -o ens32 -p tcp -m tcp --dport 80 -j ACCEPT
    -A FORWARD -i ens32 -p tcp -m tcp --sport 80 -j ACCEPT
    COMMIT
    # Completed on Thu Jun 13 14:34:18 2024
    외부에서 들어오는 내용만 잘 처리하면 됨
    내부에서 나가는것은 이미 신뢰할 수 있는 자료이고 별도의 절차를 거치기에 한줄로 요약 가능
    • A FORWARD -i ens32 -j ACCEPT
      -A FORWARD -o ens32 -p udp -m udp --sport 53 -j ACCEPT
      -A FORWARD -o ens32 -p tcp -m tcp --sport 443 -j ACCEPT
      -A FORWARD -o ens32 -p tcp -m tcp --sport 80 -j ACCEPT

      NAT 지우기
      tptables -t nat -F

  • 실습
    • 전제 조건 DNS web db ( 10.10.10.10 )
      db.sevas10.com => localhost root '' DB = sevas DNS
      ns.sevas10.com 192.168.10.200
      www.sevas10.com 192.168.10.100 으로 접속
      fw.sevas10.com 192.168.10.10 웹페이지 192.168.10.100 (= 10.10.10.10 )으로 접속하고 (http,https (인증서호스트 www.sevas10.com 포함)
      칼리(DNS 192.168.10.200) 에서 web을 사용해서 회원가입 로그인
    • vi /etc/sysconfig/iptables
      # Generated by iptables-save v1.4.21 on Thu Jun 13 16:41:18 2024
      *nat
      :PREROUTING ACCEPT [0:0]
      :INPUT ACCEPT [0:0]
      :OUTPUT ACCEPT [0:0]
      :POSTROUTING ACCEPT [0:0]
      -A PREROUTING -d 192.168.10.100/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.10.10.10:80
      -A PREROUTING -d 192.168.10.100/32 -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.10.10.10:443
      -A PREROUTING -d 192.168.10.200/32 -p udp -m udp --dport 53  -j DNAT --to-destination 10.10.10.10:53
      -A POSTROUTING -o ens33 -j MASQUERADE
      COMMIT
      # Completed on Thu Jun 13 16:41:18 2024
      # Generated by iptables-save v1.4.21 on Thu Jun 13 16:41:18 2024
      *filter
      :INPUT DROP [0:0]
      :FORWARD DROP [0:0]
      :OUTPUT ACCEPT [24:2576]
      -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
      -A INPUT -i lo -j ACCEPT
      -A INPUT -p icmp -j ACCEPT
      -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
      -A FORWARD -i ens34 -j ACCEPT		<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<칼리 인터넷
      -A FORWARD -o ens34 -p udp -m udp --sport 53 -j ACCEPT
      -A FORWARD -o ens34 -p tcp -m tcp --sport 80 -j ACCEPT
      -A FORWARD -o ens34 -p tcp -m tcp --sport 443 -j ACCEPT
      -A FORWARD -i ens32 -j ACCEPT		<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<서버 인터넷
      -A FORWARD -o ens32 -p udp -m udp --sport 53 -j ACCEPT
      -A FORWARD -o ens32 -p tcp -m tcp --sport 80 -j ACCEPT
      -A FORWARD -o ens32 -p tcp -m tcp --sport 443 -j ACCEPT
      -A FORWARD -o ens32 -p tcp -m tcp --dport 443 -j ACCEPT <<<<<<< 서비스 DNAT 포트 
      -A FORWARD -o ens32 -p tcp -m tcp --dport 80 -j ACCEPT
      -A FORWARD -o ens32 -p udp -m udp --dport 53 -j ACCEPT
      COMMIT
      # Completed on Thu Jun 13 16:41:18 2024
    • sevas10.zone
      $TTL 1D
      @       IN SOA  @                       root.sevas10.com. (
                                              0       ; serial
                                              1D      ; refresh
                                              1H      ; retry
                                              1W      ; expire
                                              3H )    ; minimum
              IN      NS      @
              IN      A       10.10.10.10
      
      ns      IN      A       192.168.10.200
      www     IN      A       192.168.10.100
      fw      IN      A       192.168.10.10

  • DOS공격 차단 정책 ⇒ ping 속도 제한 ( ping -i 0.1 )

    • -m limit : 적용 검사의 속도 제한 (기본값 5)
    • --limit: /s /m /h /d 등 단위 지정 ex) 3/m => 분당 세 번
    • --limit-burst → 기본 값은 5 , 적용 검사 1회시 한번에 처리하는 최대 패킷수
      • ping 제한
        • 192.168.10.50 의 input 방식 리미트 → ping -i 0.1 192.168.10.100

          -A INPUT -p icmp -m limit --limit 40/min -j ACCEPT -- 일부 승인후 지연(1분에 40개)

          -A INPUT -p icmp -m limit --limit 10/min --limit-burst 10 -j ACCEPT -- 10개 검사 후, 일부 승인 후 지연(1분에 10개)

          -A INPUT -p icmp -m limit --limit 60/min --limit-burst 20 -j ACCEPT -- 일반 ping은 통과, ping 0.1 은 지연을 검

          -A INPUT -p icmp -j DROP -- 이외는 거부 → 마지막에 필수/위의 제한들은 한개씩

  • 연결 제한

    • -m connlimit (DROP) [연결세션제한 = 세션수 ]
    • --connlimit-above [숫자]
    • -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
  • 로그 남기기

    • -m recent [ 제한 시간 & 허용 카운트 ] 특정 시간 동안 특정 갯수 이상의 패킷을 받으면 적용
    • --update --seconds 5 --hitcount 10 5초 동안 10번 들어오는 패킷들은 차단 (5초 뒤 다시 접속 가능)
    • 웹이 나오게끔 설정 후 동작 ( 10초 동안 10번 들어오는 패킷들을 차단 )

      -A FORWARD -d 10.10.10.10 -p tcp --dport 80 -m recent --set --name flood_list
      -A FORWARD -d 10.10.10.10 -p tcp --dport 80 -m recent --update --seconds 10 --hitcount 10 --name flood_list -j LOG --log-prefix "[http flood attack]"
      -A FORWARD -d 10.10.10.10 -p tcp --dport 80 -m recent --update --seconds 10 --hitcount 10 --name flood_list -j DROP

  • -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT → 제한은 해당 문구 위에서 진행

  • iptables 로그 만들기

    1. vi /etc/rsyslog.conf
      #IPTABLES
      kern.* /var/log/iptables.log
    2. service rsyslog restart
    3. tail -f /var/log/iptables.log
  • ALL SYN 차단(nmap 등.. SYN ATTACK, flooding)

    • -A INPUT -p tcp -m tcp --tcp-flags SYN SYN -m limit --limit 3/s --limit-burst 5 -j ACCEPT
      -A OUTPUT -p tcp -m tcp --tcp-flags ALL SYN,ACK -m limit --limit 3/s --limit-burst 5 -j ACCEPT
      -A FORWARD -p tcp -m tcp --tcp-flags SYN SYN -m limit --limit 3/s --limit-burst 5 -j ACCEPT
      -A INPUT -p tcp --tcp-flags ALL SYN -j DROP
      -A OUTPUT -p tcp -m tcp --tcp-flags ALL SYN,ACK -j DROP
    • 호스트로 주지 않는 이유: 공격자를 특정할 수 없기에 syn 자체를 막음
profile
:) GITHUB: https://github.com/YJ2123412

0개의 댓글