ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 리눅스 방화벽 설정 iptables -특정포트차단
    IT 관련/Linux & NAS & IoT 2012. 7. 19. 15:14

    회사에서 Proxy 쓰면서 MSN막으려고 시도해본 iptables. 참고자료 스크랩.

    아래와 같이 사이트들을 막아주니 메신져 로긴 안되었음(프록시 설정에서는 웹페이지만 막힘 근본적 포트차단은 안되던)

    구성 : 웹 - Proxy서버 - 사내망(Proxy서버에 아래와 같이 넣어줌 : Source의 해당아이피에서 올때 Drop 시킴)

     iptables -A INPUT -i eth0 -s 64.4.0.0/16 -j DROP 

     iptables -A INPUT -i eth0 -s 207.46.73.0/24 -j DROP 

     iptables -A INPUT -i eth0 -s 64.4.45.0/24 -j DROP 

     iptables -A INPUT -i eth0 -s 64.4.61.0/24 -j DROP 

     iptables -A INPUT -i eth0 -s 207.46.49.0/24 -j DROP 



    http://blog.naver.com/khs8338/70024248047

    원본출처링크:

    http://www.mojily.com/bbs/view.php?id=linux&no=189


     - iptables


    #iptables 명령어 실행시 시스템에 적용되는 시기

    - iptables 명령어를 실행하면 재부팅하지 않더라도 즉시 시스템에 적용된다.

    - iptables -A INPUT -s 0/0 -j DROP를 하면 그 즉시 모든 접속이 차단된다.

    - iptables -D INPUT -s 0/0 -j DROP를 하면 그 즉시 접속 차단 명령이 삭제된다.

    - iptables -L로 명령어가 시스템에 적용중인지 확인 가능


    #재부팅시 iptables 내용 보존하여 실행하기

    1. 스크립트 파일 만들어서 실행

       1) cd /etc/sysconfig

          - 스크립트파일 만들어질 디렉토리로 이동 (다른 디렉토리에 만들어도 됨)

       2) touch iptablesscript

          - /etc/sysconfig디렉토리에 iptablesscript라는 파일이 생성됨

            (다른 파일명으로 만들어도 됨)

       3) vi /etc/sysconfig/iptablesscript

          - 만들어진 파일을 open

       4) /sbin/iptables -A INPUT -s 100.100.100.100 -j DROP

          /sbin/iptables -A OUTPUT -s 200.200.200.200 -j ACCEPT

          - 실행하고자 하는 내용을 입력

          - 맨 윗줄에 #! /bin/bash나 맨 아랫줄에 exit 0는 입력할 필요 없음

       5) chmod 700 iptablesscript

          - 실행가능한 파일로 속성을 변경

       6) vi /etc/rc.d/rc.local

          - 재부팅시 자동으로 실행되는 내용이 들어가도록 하는 rc.local파일을 open

       7) /etc/sysconfig/iptablesscript

          - rc.local파일의 맨 아랫줄에 입력

       8) 재부팅

    2. /etc/rc.d/rc.local 파일에 직접 기록

       /sbin/iptables -A INPUT -s 100.100.100.100 -j DROP

       /sbin/iptables -A OUTPUT -s 200.200.200.200 -j ACCEPT

       위 두줄을 /etc/rc.d/rc.local파일 맨 아랫줄에 직접 입력
       (파일에 직접 기록하는 방식은 다른 자동 실행 파일이 있는 경우 혼동 가능성이 있으므로 스크립트 파일로 만드는 것이 좋음)



    #iptables -A INPUT -s 200.200.200.1 -j DROP

    200.200.200.1 이라는 source IP(-s)로부터 오는(INPUT) 모든 패킷을 막는(DROP) 규칙을 추가(A)한다.

    * ACCEPT  : 패킷을 허용

    * DENY    : 패킷을 허용하지 않는다는 메시지를 패킷을 보낸 PC에 돌려보냄

    * DROP    : 패킷을 허용하지 않으며, 허용하지 않는다는 메시지 자체도 안보냄

    * REJECT  : match된 경우 -------- 거절한다는 에러 메시지를 돌려보냄

                match되지 않은 경우 - DROP과 동일한 작동을 함

    * INPUT   : 내가 외부의 패킷을 받을지 결정

              : INPUT을 막을 경우 외부에서 나한테 패킷을 보낼 수 없음

    * OUTPUT  : 내가 외부에 패킷을 보낼지 결정

              : OUTPUT을 막을 경우 내가 외부에 패킷을 보낼 수 없음

    * FORWARD : 내가 받을 패킷을 어디로 RELAY할지 결정



    iptables -A INPUT -p tcp --sport 25 -j ACCEPT

    25번이라는 source포트(--sport)에서 오는(INPUT) protocol이(-p) tcp인 모든 접속을 허락하는(ACCEPT) 규칙을 추가(A)한다.

    iptables –A INPUT –s 200.200.200.1 –p tcp --destination-port telnet –j DROP 
    200.200.200.1 이라는 source IP(-s)로부터 오는(INPUT) protocol이(-p) tcp이고

    목적지 port(--destination-port)가 telnet인 패킷의 접속을 막는(DROP) 규칙을 추가(A)한다.

    iptables -A INPUT -i eth1 -s 192.168.1.0/24 -d 0/0 -j ACCEPT 
    192.168.1.0/24라는 source IP(-s)로부터 오는(INPUT) 

    서버안으로 들어오는 인터페이스(-i)가 eth1이고 destination IP(-d)가

    어떤 IP라도(0/0) 접속을 허락하는(ACCEPT) 규칙을 추가(A)한다.

    (서버자체에 대한 접속이 아니라 마스커레이딩등을 이용하여 랜카드 두 개를 장착한 경우 eth1에 연결된 내부 PC에서 외부로의 접속 허용)

    * 0/0 : 모든 IP가 해당 (/뒤의 숫자는 서브넷마스크를 의미함)

      /8  = /255.0.0.0  (/8이나 /255.0.0.0 중 어느 것을 입력해도 같음)

      /9  = /255.128.0.0

      /18 = /255.192.0.0

      /24 = /255.255.255.0

      /27 = /255.255.255.224

      /28 = /255.255.255.240

      /29 = /255.255.255.248

      /30 = /255.255.255.252

    * '/'다음에 숫자가 올 경우 비트가 1로 채워진 갯수를 의미하는데 /24인 경우 왼쪽에서 24개의 비트가 1이다.
    (11111111.11111111.11111111.00000000 = 255.255.255.0)

      따라서 192.168.1.0/24 는 192.168.1.0/255.255.255.0과 같다

    iptables -A INPUT –p tcp --destination-port telnet –i ppp0 –j DROP 

    protocol이(-p) tcp이고 목적지 port(--destination-port)가 telnet이며, 서버안으로 들어오는 인터페이스(-i)가 ppp0인 패킷의 접속을 막는(DROP) 규칙을 추가(A)한다.

    iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT

    iptables -A INPUT -p icmp --icmp-type 8 -j REJECT

    protocol이(-p) icmp이고 icmp 의 type이 echo-request인 패킷이 오는(INPUT) 것을

    거절하는(REJECT) 규칙을 추가(A)한다.

    (외부에서의 ping을 거절하는 방법임 / echo-request대신에 8을 해도 됨)

    * icmp type

      number    name                        icmp 보낸 program

        0       echo-reply                  ping

        3       destination-unreachable     Any TCP/UDP traffic

        5       redirect                    routing if not running routing daemon

        8       echo-request                ping

       11       time-exceeded               traceroute

    * echo-request : ping프로그램으로 사용자가 목적지 서버에 보내는 패킷

    * echo-reply : echo-request에 대하여 목적지시스템이 사용자에게 회신하는 패킷



    iptables -A INPUT -p tcp --dport 20:30 -j DROP 
    protocol이(-p) tcp이고 목적지 port(--dport)가 20번부터 30번까지인 패킷이

    오는(INPUT) 것을 막는(DROP) 규칙을 추가(A)한다.



    iptables -A INPUT -m state --state INVALID -j DROP
    network상태가(state --state)가 INVALID인 패킷이 오는(INPUT) 것을 막는(DROP) 규칙을 추가(A)한다.

    * -m : -match로 해도 됨 (match 여부로 패킷의 방향을 결정하는 옵션임)

    * state --state INVALID     : 패킷이 network연결되어 있는지 모르는 상태

    * state --state ESTABLISHED : 패킷이 network 연결되어 있는 상태

    * state --state NEW         : 패킷이 network 새로 연결되어 있는 상태

    * state --state RELATED     : 패킷이 network새로 연결되어 있으나 이미 연결되어 있는 network와 연관성이 있는 상태

    iptables -A INPUT -p tcp --tcp-flags ACK ACK --dport 80 

    -m string --string "/default.ida?" 

    -j REJECT --reject-with tcp-reset

    protocol이(-p) tcp이고 목적지가 80번 포트(--dport 80)로 오는(INPUT) 

    신호가 ACK이고 /default.ida?라는 문자열이 들어있는 패킷은

    연결을 해제하고(tcp-reset) 거절하는(REJECT) 규칙을 추가(A)한다.

    * tcp프로토콜의 접속 제어 flag

      - SYN (SYNchronize Sequence Numbers) : 연결을 요청하는 flag(신호)

      - ACK (Acknowledgement) : 알았다는 신호

      - RST (Reset) : 연결을 해제하는 신호

      - FIN (Finish) : 접속을 종료하고 전송을 끝내는 신호

    * HOST A > (SYN) > HOST B > (SYN ACK) > HOST A > (ACK) > HOST B

      1) HOST A는 HOST B에 SYN을 보내 연결을 요청

      2) HOST B는 HOST A에 SYS ACK를 보내 연결을 허락한다고 회신

      3) HOST A는 HOST B에 ACK를 보냄으로써 연결이 이루어짐

    * SYN,ACK,FIN,RST SYN : 앞의 네 개 FLAG인 SYN,ACK,FIN,RST를 검사하여

      맨뒤의 SYN의 방향을 결정함 (위의 명령어의 경우는 앞의 ACK만 검사하여

      뒤의 ACK의 방향을 결정함)

    * 는 명령어가 길어 아랫줄로 계속 이어서 입력할 경우 사용하는 backspace왼쪽의 기호 key임

      80과 사이에 하나의 공백이 있어야 함 공백이 없을 경우 80 -m이 안되고 80-m으로 계속 이어지는 형태로 error발생

    * --reject-with tcp-reset : RST 패킷을 돌려보내서 연결을 해제토록 함

    * --reject-with icmp-net-unreachable   : error 메시지를 돌려보냄

    * --reject-with icmp-host-unreachable  : error 메시지를 돌려보냄

    * --reject-with icmp-port-unreachable  : error 메시지를 돌려보냄

    * --reject-with icmp-proto-unreachable : error 메시지를 돌려보냄

    * --reject-with icmp-net-prohibitedor  : error 메시지를 돌려보냄

    * --reject-with icmp-host-prohibited   : error 메시지를 돌려보냄



    iptables -A input -i eth0 -s 10.0.0.0/8 -d 0/0 -j DENY

    iptables -A input -i eth0 -s 127.0.0.0/8 -d 0/0 -j DENY

    iptables -A input -i eth0 -s 172.16.0.0/16 -d 0/0 -j DENY

    iptables -A input -i eth0 -s 192.168.0.0/24 -d 0/0 -j DENY

    외부에서 내부 네트워크 IP자격으로 접근하여 ip spoofing하는 것 방지



    iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE 

    IP 주소를 할당 받은후 (POSTROUTING) NAT 테이블에 (-t nat) 서버밖으로 나가는 인터페이스(-o)가 ppp0인 모든 패킷들이
    마스쿼레이드 되도록 (-j MASQUERADE) 규칙을 추가(-A) 한다.

    * ppp0는 활성화된 외부 디바이스(External Interface)가 유동IP인 경우이며, 고정IP인 경우 ppp0대신에 eth0사용
      (/sbin/ifconfig를 이용하여 활성화된 외부 디바이스 확인 가능)


    마스커레이딩

                                                   ┌---- PC1 (192.168.0.6)

    * 인터넷망 - SERVER LAN1 - SERVER LAN2 - HUB - |----- PC2 (192.168.0.7)

                                                   └---- PC3 (195.168.0.8)

    * 패킷 발송 절차

      - 패킷에는 발신지, 수신지 IP주소와 포트번호가 포함되어 있습니다.

      1) PC1에서 서버로 패킷 보냄

      2) 서버는 수신된 패킷의 원래 IP(192.168.0.6)와 포트번호를 내부에 저장

      3) 서버는 수신된 패킷에 외부연결된 IP 및 새로운 발신포트번호를 부여

         <일반적인 web은 80번 포트를 사용하지만 80이 아닌 새로운 발신포트를 사용해도 일반적으로는 접속 가능합니다. 

           목적지 서버에서 웹서버만 운영하기 위해 80포트만 열어놓는 것은 패킷의 발신포트(source port)가
          아닌 목적지 포트(destination port)를 80만 열어놓는 것이므로 발신포트가 예를들면 100이라도 접속 가능>

      4) 패킷은 새로받은 IP와 포트번호로 외부로 나감

    * 패킷 수신 절차

      1) 외부에서 서버로 패킷이 들어옴

      2) 서버는 패킷의 포트번호를 검사하여 PC1의 포트인지 확인후 패킷에 원래 IP(192.168.0.6)와 포트번호를 부여

      3) 패킷은 PC1로 전달됨

    * 유동(또는 고정) IP 한개인 서버를 통해 IP가 없는 PC에 인터넷 연결하는 방식

      /etc/rc.d/rc.local 의 하단에 아래 두줄 추가하여 구축 가능

      iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

      echo 1 > /proc/sys/net/ipv4/ip_forward  

    (ip_forward 파일의 내용을 1로 바꿈으로써 ipforwarding이 가능하게 한다. vi /proc/sys/net/ipv4/ip_forward로 보면 바꾸기 전에 기본으로는 0으로 되어 있음)

    * PREROUTING  : 서버안으로 들어오는 패킷에 해당되며, 들어오는 인터페이서(-i)만 선택 가능

      POSTROUTING : 서버밖으로 나가는 패킷에 해당되면, 나가는 인터페이서(-o)만 선택 가능

    * nat (Network Address Translation)

      - 패킷의 목적지나 시작점을 바꾸는 방법

      - 시작점 NAT(Source NAT) (SNAT) : 패킷의 시작점을 바꾸는 방법

        iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4 

        (외부로 나가는 패킷의 출발지를 현재 내 PC의 IP주소인 200.200.200.200이 아닌 1.2.3.4로 변경)

      - 목적지 NAT(Destination NAT) (DNAT) : 패킷의 목적지를 바꾸는 방법

        iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 51210 -j DNAT

        --to 192.168.0.2 

        (외부에서 내부로 들어오는 패킷의 목적지를 내부 서브네트워크중 하나인 192.168.0.2로 변경)

    댓글

Designed by Tistory.