이 간단한 스크립트를 사용하여 iptables로 자신 만의 방화벽을 만듭니다.

나는 잠시 동안 iptables에 대해 두 가지를 생각하고있었습니다.이 튜토리얼을 찾는 대부분의 사람들은 초보자이고 둘째로, 많은 사람들이 이미 상당히 간단하고 이미 정교해진 것을 찾고 있습니다.

이 예는 웹 서버용입니다.하지만 쉽게 더 많은 규칙을 추가하고 필요에 맞게 조정할 수 있습니다.

IP에 대한 "x"변경이 표시되면


#!/bin/bash

# iptables 테이블을 정리합니다. -F iptables -X # NAT iptables를 정리합니다. -t nat -F iptables -t nat -X # PPPoE, PPP 및 ATM과 같은 항목을위한 mangle 테이블 iptables -t mangle -F iptables -t mangle -X # 정책 나는 이것이 초보자에게 가장 좋은 방법이라고 생각하고 # 여전히 나쁘지 않습니다. # 나가는 연결이기 때문에 출력을 모두 설명하겠습니다. 입력은 모든 것을 버리고 서버는 전달하지 않아야합니다. iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP # 인트라넷 LAN 인트라넷 = eth0 #Extranet wan extranet = eth1 # 상태 유지. 이미 연결된 (설정된) 모든 것은 다음과 같이 남습니다. iptables -A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT # 루프 장치. iptables -A INPUT -i lo -j ACCEPT # http, https, 인터페이스를 지정하지 않습니다. # 모든 iptables에 적용되기를 원하기 때문입니다. -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp-dport 443 -j ACCEPT # ssh는 내부적으로 만이 범위의 ip의 iptables에서 -A INPUT -p tcp -s 192.168.xx / 24 -i $ intranet --dport 7659 -j ACCEPT # 모니터링 (예 : zabbix가있는 경우) 또는 다른 snmp 서비스 iptables -A INPUT -p tcp -s 192.168.xx / 24 -i $ intranet --dport 10050 -j ACCEPT # icmp, ping well it 's up to you iptables -A INPUT -p icmp -s 192.168.xx xx / 24-i $ intranet -j ACCEPT #mysql with postgres is port 5432 iptables -A INPUT -p tcp -s 192.168.xx --sport 3306 -i $ intranet -j ACCEPT #sendmail bueeeh if you want to send some mail #iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT # Anti-SPOOFING 09/07/2014 # SERVER_IP = "190.xxx"# ​​서버 IP-서버의 실제 IP LAN_RANGE = "192.168.xx / 21 "# 네트워크 또는 VLAN의 LAN 범위 # 엑스트라 넷에 들어가면 안되는 IP,순전히 WAN 인터페이스가있는 경우 # 논리를 사용하는 것입니다. 해당 인터페이스를 통해 # LAN 유형 트래픽을 입력해서는 안됩니다. SPOOF_IPS = "0.0.0.0/8 127.0.0.0/8 10.0.0.0/8 172.16.0.0/12 192.168.0.0 .16 / XNUMX "# 기본 동작-규칙이 일치 할 때 수행됨 ACTION ="DROP "# wan iptables를 통해 내 서버의 동일한 IP를 가진 패킷 -A INPUT -i $ extranet -s $ SERVER_IP -j $ ACTION # iptables -A OUTPUT -o $ extranet -s $ SERVER_IP -j $ ACTION # wan에 대한 LAN 범위가있는 패킷, # 특정 네트워크가있는 경우에 이렇게 넣었지만 다음 # 규칙 내부에 중복됩니다. the loop "for"iptables -A INPUT -i $ extranet -s $ LAN_RANGE -j $ ACTION iptables -A OUTPUT -o $ extranet -s $ LAN_RANGE -j $ ACTION ## 모든 SPOOF 네트워크는 ip에서 wan에 의해 허용되지 않습니다. $ SPOOF_IPS do iptables -A INPUT -i $ extranet -s $ ip -j $ ACTION iptables -A OUTPUT -o $ extranet -s $ ip -j $ ACTION done

항상 그렇듯이 귀하의 의견을 기다리고 있습니다.이 블로그를 계속 지켜봐주십시오. 감사합니다.


기사의 내용은 우리의 원칙을 준수합니다. 편집 윤리. 오류를보고하려면 여기에.

12 코멘트, 당신의 것을 남겨주세요

코멘트를 남겨주세요

귀하의 이메일 주소는 공개되지 않습니다. 필수 필드가 표시되어 있습니다 *

*

*

  1. 데이터 책임자 : Miguel Ángel Gatón
  2. 데이터의 목적 : 스팸 제어, 댓글 관리.
  3. 합법성 : 귀하의 동의
  4. 데이터 전달 : 법적 의무에 의한 경우를 제외하고 데이터는 제 XNUMX 자에게 전달되지 않습니다.
  5. 데이터 저장소 : Occentus Networks (EU)에서 호스팅하는 데이터베이스
  6. 권리 : 귀하는 언제든지 귀하의 정보를 제한, 복구 및 삭제할 수 있습니다.

  1.   HO2Gi

    계속해서 배우는 데 도움이됩니다. 감사합니다.

    1.    브로디달

      천만에요, 도움이되어 기쁩니다

  2.   자비에르

    정말 미안하지만 두 가지 질문이 있습니다 (그리고 하나는 선물로 😉).

    Apache를 실행하고 SSH를 제외한 나머지를 닫으려면이 구성으로 도착 하시겠습니까?

    # 테이블 청소
    iptables에-F
    iptables에-X

    NAT 청소

    iptables -t nat -F
    iptables -t nat -X

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

    ssh는 내부적으로 만이 IP 범위에서

    iptables -A INPUT -p tcp -s 192.168.xx / 24 -i $ 인트라넷 –dport 7659 -j ACCEPT

    두 번째 질문 : 7659가이 예에서 SSH에 사용되는 포트입니까?

    세 번째이자 마지막 :이 구성을 어떤 파일에 저장해야합니까?

    튜토리얼 주셔서 대단히 감사합니다, 당신이 그런 초보자이고 그것을 잘 활용할 수 없다는 것은 부끄러운 일입니다.

    1.    브로디달

      이것은 아파치에서 http에 필요한 규칙입니다.
      iptables -A INPUT -p tcp -dport 80 -j ACCEPT

      하지만 드롭 기본 정책을 선언해야합니다 (스크립트에 있음).
      iptables -P 입력 삭제
      iptables -P 출력 수락
      iptables -P 앞으로 드롭

      그리고 이것은 당신이 멀리 있으면 당신을 버릴 것이기 때문입니다.
      iptables -A INPUT -m state –state ESTABLISHED, RELATED -j ACCEPT

      예에서 7659가 해당 ssh의 포트 인 경우 기본적으로 22입니다.하지만 "잘 알려지지 않은"포트로 변경하는 것이 좋습니다.
      man 나는 당신이 원하는대로 ... firewall.sh를 넣고 rc.local (sh firewall.sh)에 넣으면 자동으로 실행됩니다. 사용하는 운영 체제에 따라 다르며 규칙을 직접 넣을 수있는 파일이 있습니다.

  3.   제게

    이봐, 당신의 스크립트는 그것을 분석하는 매우 훌륭합니다…. 당신은 내가 어떻게 특정 웹 사이트에 대한 내 사용자의 모든 요청을 거부 할 수 있는지 알고 있습니까?…. 하지만이 웹 사이트에는 많은 서버가 있습니다.

    1.    브로디달

      다른 옵션을 권장합니다.
      1) DNS에 가짜 영역을 만들 수 있습니다 ...
      2) acl로 프록시를 배치 할 수 있습니다.
      죄 금지
      iptables의 경우 이것을 좋아할 수 있습니다 ... 항상 최선의 선택은 아닙니다 (더 많은 방법이 있습니다)
      iptables -A INPUT -s blog.fromlinux.ne -j DROP
      iptables -A OUTPUT -d blog.fromlinux.net -j DROP

      효과가 있는지 말해줘

  4.   자비에르

    답변 주셔서 감사합니다. 모든 것이 해결되었습니다. 나는 7659를 사용하는 것에 놀랐 기 때문에 포트에 대해 물었다. 전용 포트는 49152에서 시작하고 어떤 서비스 나 무언가를 방해 할 수 있기 때문이다.
    다시 한 번 모든 것에 감사드립니다.

    인사말.

  5.   공격하다

    BrodyDalle, 어떻게 연락 할 수 있습니까? 스크립트가 매우 흥미 롭습니다.

  6.   카를로스

    마지막 줄 "iptables -A OUTPUT -o $ extranet -s $ ip -j $ ACTION"은 자신의 컴퓨터가 스푸핑하는 것을 방지하는 것입니까? 아니면 일부 감염된 패킷이 들어 와서 감염된 소스와 함께 떠날 수 있으며 이것이 규칙이 OUTPUT에도 포함 된 이유입니까?
    해명 해주셔서 감사합니다 !!!

  7.   프랜

    이것은 내 자신의 iptables 스크립트이며 매우 완벽합니다.

    # franes.iptables.airoso
    # doc.iptables.airoso : 레거시 및 nft 용 iptables
    #
    방화벽 포트 # 개
    ############################
    #! / bin / bash
    #
    # 화면 지우기
    ############################## /etc/f-iptables/default.cfg 시작 |||||
    맑은
    # 빈 줄을 남겨주세요
    에코
    내보내기 예 =»»아니오 =»반향 끄기»
    # 액세스를 허용하기 위해 변경할 수있는 변수
    ###################### $ yes 또는 $ no로 수정할 변수
    hayexcepciones 내보내기 =»$ no»
    # 예외가 있습니다 : 예외적 인 호스트를 허용하려면 $ yes, 비활성화하려면 $ no
    수출 건초 =»$ 아니오»
    # hayping : $ yes는 타사 ping을 허용하고 $ no는 거부합니다.
    haylogserver 내보내기 =»$ no»
    # haylogeosserver : $ yes to log to log tcp $ no to log to log tcp
    ######
    ###################### ","또는 ":"범위를 추가하여 수정할 변수
    수출 예외 =»baldras.wesnoth.org»
    # 예외는 방화벽에서 단일 또는 다중 호스트를 허용하거나 값이 없음
    로그 서버 내보내기 = 폐기, ipp, dict, ssh
    # 패킷이 들어올 때 기록되는 TCP 서버 포트
    redserver 내보내기 = 0/0
    # redserver : 서버 포트 용 네트워크, 선호하는 로컬 네트워크 또는 여러 IP
    클라이언트 내보내기 빨간색 = 0/0
    #clientnet : 모든 네트워크에 선호되는 클라이언트 포트 용 네트워크
    servidortcp 내보내기 = 폐기, ipp, dict, 6771
    # servidortcp : 지정된 tcp 서버 포트
    내보내기 serverudp = 폐기
    #udpserver : 지정된 udp 서버 포트
    export clientudp = 도메인, bootpc, bootps, ntp, 20000 : 45000
    #udp client : 지정된 udp 클라이언트 포트
    클라이언트 내보내기 tcp = 도메인, http, https, ipp, git, dict, 14999 : 15002
    # tcp 클라이언트 : 지정된 tcp 클라이언트 포트
    ############################# /etc/f-iptables/default.cfg 끝 |||||
    ############################### 수정할 변수의 끝
    수출 방화벽 = $ 1 변수 = $ 2
    if [ "$ 변수"= "$ NULL"]; 그런 다음 소스 /etc/f-iptables/default.cfg;
    그렇지 않으면 소스 / etc / f-iptables / $ 2; fi
    ############################## 또는 변수를 .cfg 파일로 덮어 씁니다.
    ################################################ ########################################
    수출 방화벽 = $ 1 수출 변수 = $ 2
    ######################################## 자동 시스템 변수
    if [ "$ firewall"= "연결 끊김"]; 그런 다음 FIREWALL DISCONNECTED를 에코합니다.
    export activateserver =»$ no»activateclient =»$ no»wet =»$ no»;
    elif [ "$ firewall"= "client"], 그런 다음 echo FIREWALL CLIENT;
    export activateserver =»$ no»activateclient =»»wet =»$ no»;
    elif [ "$ firewall"= "서버"]; 그런 다음 FIREWALL SERVER를 에코합니다.
    export activateserver =»»activateclient =»$ no»wet =»$ no»;
    elif [ "$ firewall"= "클라이언트 및 서버"]; 그런 다음 방화벽 클라이언트 및 서버를 에코합니다.
    내보내기 활성화 서버 =»»; export activateclient =»»; export wet =»$ no»;
    elif [ "$ 방화벽"= "허용"]; 그런 다음 PERMISSIVE FIREWALL을 에코합니다.
    export activateserver =»$ no»activateclient =»$ no»wet =»»;
    그렇지 않으면
    $ sudo echo iptables-legacy 확인 :
    $ sudo iptables-legacy -v -L INPUT 확인
    $ sudo iptables-legacy -v -L OUTPUT 확인
    $ sudo echo iptables-nft 확인 :
    $ sudo iptables-nft -v -L INPUT 확인
    $ 확인 sudo iptables-nft -v -L OUTPUT
    에코 _____ 매개 변수 ____ $ 0 $ 1 $ 2
    echo "매개 변수없이 캐스트는 iptables를 나열하는 것입니다."
    echo "첫 번째 매개 변수 (iptables 활성화) : 연결 해제 됨 또는 클라이언트 또는 서버 또는 클라이언트와 서버 또는 허용."
    echo "두 번째 매개 변수 : (선택 사항) : 기본 .cfg 파일은 /etc/f-iptables/default.cfg를 선택합니다."
    echo "변수 설정 :"$ (ls / etc / f-iptables /)
    출구 0; fi
    #################
    에코
    echo $ 0 연결 해제 또는 클라이언트 또는 서버 또는 클라이언트와 서버 또는 허용 또는 변수를 던지거나 매개 변수를 사용하지 않고 iptables를 나열합니다.
    echo $ 0 파일에는 내부에 편집 가능한 변수가 들어 있습니다.
    ############################### 위의 변수가 활성화 됨
    ###############################
    iptables 변수를 설정하는 echo
    에코 활성화 변수
    에코
    ############################ iptables 규칙
    echo iptables-legacy 설정
    sudo / usr / sbin / iptables-legacy -t 필터 -F
    sudo / usr / sbin / iptables-legacy -t nat -F
    sudo / usr / sbin / iptables-legacy -t mangle -F
    sudo / usr / sbin / ip6tables-legacy -t 필터 -F
    sudo / usr / sbin / ip6tables-legacy -t nat -F
    sudo / usr / sbin / ip6tables-legacy -t mangle -F
    sudo / usr / sbin / ip6tables-legacy -A INPUT -j DROP
    sudo / usr / sbin / ip6tables-legacy -A OUTPUT -j DROP
    sudo / usr / sbin / ip6tables-legacy -A FORWARD -j DROP
    sudo / usr / sbin / iptables-legacy -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT> / dev / null
    $ haylogserver sudo / usr / sbin / iptables-legacy -A INPUT -p tcp -m multiport –dports $ logserver -j LOG> / dev / null
    $ hayeexceptions sudo / usr / sbin / iptables-legacy -A INPUT -s $ exceptions -j ACCEPT> / dev / null
    $ 활성화 sudo 서버 / usr / sbin / iptables-legacy -A INPUT -p udp -m multiport –dports $ serverudp -s $ redserver -d $ redserver -j ACCEPT> / dev / null
    $ 활성화 서버 sudo / usr / sbin / iptables-legacy -A INPUT -p tcp -m multiport –dports $ serverrtcp -s $ redserver -d $ redserver -j ACCEPT> / dev / null
    $ activateclient sudo / usr / sbin / iptables-legacy -A INPUT -p udp -m multiport –sports $ clientudp -m state –stateEstablished -s $ clientnet -d $ clientnet -j ACCEPT> / dev / null
    $ activateclient sudo / usr / sbin / iptables-legacy -A INPUT -p tcp -m multiport –sports $ clienttcp -m state –stateEstablished -s $ clientnet -d $ clientnet -j ACCEPT> / dev / null
    $ hayping sudo / usr / sbin / iptables-legacy -A INPUT -p icmp –icmp-type echo-reply -j ACCEPT> / dev / null
    sudo / usr / sbin / iptables-legacy -A INPUT -j DROP> / dev / null
    sudo / usr / sbin / iptables-legacy -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT> / dev / null
    $ hayeexceptions sudo / usr / sbin / iptables-legacy -A OUTPUT -d $ exceptions -j ACCEPT> / dev / null
    $ 활성화 sudo 서버 / usr / sbin / iptables-legacy -A OUTPUT -p udp -m multiport –sports $ serverudp -s $ redserver -d $ redserver -j ACCEPT> / dev / null
    $ 활성화 서버 sudo / usr / sbin / iptables-legacy -A OUTPUT -p tcp -m multiport –sports $ serverrtcp -s $ redserver -d $ redserver -j ACCEPT> / dev / null
    $ activateclient sudo / usr / sbin / iptables-legacy -A OUTPUT -p udp -m multiport –dports $ clientudp -s $ clientnet -d $ clientnet -j ACCEPT> / dev / null
    $ activateclient sudo / usr / sbin / iptables-legacy -A OUTPUT -p tcp -m multiport –dports $ clienttcp -s $ clientnet -d $ clientnet -j ACCEPT> / dev / null
    $ hayping sudo / usr / sbin / iptables-legacy -A OUTPUT -p icmp –icmp-type echo-request -j ACCEPT> / dev / null
    sudo / usr / sbin / iptables-legacy -A OUTPUT -j DROP
    sudo / usr / sbin / iptables-legacy -A FORWARD -j DROP
    echo iptables-legacy 활성화
    에코
    echo 설정 iptables-nft
    sudo / usr / sbin / iptables-nft -t 필터 -F
    sudo / usr / sbin / iptables-nft -t nat -F
    sudo / usr / sbin / iptables-nft -t mangle -F
    sudo / usr / sbin / ip6tables-nft -t 필터 -F
    sudo / usr / sbin / ip6tables-nft -t nat -F
    sudo / usr / sbin / ip6tables-nft -t mangle -F
    sudo / usr / sbin / ip6tables-nft -A INPUT -j DROP
    sudo / usr / sbin / ip6tables-nft -A OUTPUT -j DROP
    sudo / usr / sbin / ip6tables-nft -A FORWARD -j 드롭
    sudo / usr / sbin / iptables-nft -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT> / dev / null
    $ haylogserver sudo / usr / sbin / iptables-nft -A INPUT -p tcp -m multiport –dports $ logserver -j LOG> / dev / null
    $ hayeexceptions sudo / usr / sbin / iptables-nft -A INPUT -s $ exceptions -j ACCEPT> / dev / null
    $ 활성화 서버 sudo / usr / sbin / iptables-nft -A INPUT -p udp -m multiport –dports $ serverudp -s $ redserver -d $ redserver -j ACCEPT> / dev / null
    $ 활성화 서버 sudo / usr / sbin / iptables-nft -A INPUT -p tcp -m multiport –dports $ serverrtcp -s $ redserver -d $ redserver -j ACCEPT> / dev / null
    $ activateclient sudo / usr / sbin / iptables-nft -A INPUT -p udp -m multiport –sports $ clientudp -m state –stateEstablished -s $ clientnet -d $ clientnet -j ACCEPT> / dev / null
    $ activateclient sudo / usr / sbin / iptables-nft -A INPUT -p tcp -m multiport –sports $ clienttcp -m state –stateEstablished -s $ clientnet -d $ clientnet -j ACCEPT> / dev / null
    $ hayping sudo / usr / sbin / iptables-nft -A INPUT -p icmp –icmp-type echo-reply -j ACCEPT> / dev / null
    sudo / usr / sbin / iptables-nft -A INPUT -j DROP> / dev / null
    sudo / usr / sbin / iptables-nft -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT> / dev / null
    $ hayeexceptions sudo / usr / sbin / iptables-nft -A OUTPUT -d $ exceptions -j ACCEPT> / dev / null
    $ 활성화 서버 sudo / usr / sbin / iptables-nft -A OUTPUT -p udp -m multiport –sports $ serverudp -s $ redserver -d $ redserver -j ACCEPT> / dev / null
    $ 활성화 서버 sudo / usr / sbin / iptables-nft -A OUTPUT -p tcp -m multiport –sports $ serverrtcp -s $ redserver -d $ redserver -j ACCEPT> / dev / null
    $ enable client sudo / usr / sbin / iptables-nft -A OUTPUT -p udp -m multiport –dports $ clientudp -s $ clientnet -d $ clientnet -j ACCEPT> / dev / null
    $ activateclient sudo / usr / sbin / iptables-nft -A OUTPUT -p tcp -m multiport –dports $ clienttcp -s $ clientnet -d $ clientnet -j ACCEPT> / dev / null
    $ hayping sudo / usr / sbin / iptables-nft -A OUTPUT -p icmp –icmp-type echo-request -j ACCEPT> / dev / null
    sudo / usr / sbin / iptables-nft -A 출력 -j 드롭
    sudo / usr / sbin / iptables-nft -A FORWARD -j 드롭
    echo iptables-nft 활성화
    에코
    $ wet sudo / usr / sbin / iptables-legacy -F> / dev / null
    $ wet sudo / usr / sbin / iptables-legacy -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT> / dev / null
    $ wet sudo / usr / sbin / iptables-legacy -A INPUT -m state –stateEstablish -j ACCEPT> / dev / null
    $ wet sudo / usr / sbin / iptables-legacy -A INPUT -j DROP> / dev / null
    $ wet sudo / usr / sbin / iptables-legacy -A OUTPUT -j ACCEPT> / dev / null
    $ wet sudo / usr / sbin / iptables-legacy -A FORWARD -j DROP> / dev / null
    $ 젖은 sudo / usr / sbin / iptables-nft -F> / dev / null
    $ wet sudo / usr / sbin / iptables-nft -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT> / dev / null
    $ wet sudo / usr / sbin / iptables-nft -A INPUT -m state –state 확립 됨 -j ACCEPT> / dev / null
    $ wet sudo / usr / sbin / iptables-nft -A INPUT -j DROP> / dev / null
    $ wet sudo / usr / sbin / iptables-nft -A OUTPUT -j ACCEPT> / dev / null
    $ wet sudo / usr / sbin / iptables-nft -A FORWARD -j DROP> / dev / null
    #########################
    당신이 던진 에코 $ 0 $ 1 $ 2
    # 스크립트를 종료합니다.
    0 번 출구

  8.   루이스 듀란

    이 방화벽이 게이트웨이에 사용하고 LAN 내부에 오징어가있는 경우 규칙을 어떻게 설정합니까?