Creați propriul firewall cu iptables folosind acest script simplu

M-am gândit la două lucruri despre iptables pentru o vreme: majoritatea celor care caută aceste tutoriale sunt începători și, în al doilea rând, mulți caută deja ceva destul de simplu și deja elaborat.

Acest exemplu este pentru un server web, dar puteți adăuga cu ușurință mai multe reguli și le puteți adapta la nevoile dvs.

Când vedeți modificarea „x” pentru IP-urile dvs.


#!/bin/bash

# Curățăm tabelele iptables -F iptables -X # Curățăm NAT iptables -t nat -F iptables -t nat -X # tabla mangle pentru lucruri precum PPPoE, PPP și ATM iptables -t mangle -F iptables -t mangle -X # Politici Cred că acesta este cel mai bun mod pentru începători și # încă nu este rău, voi explica ieșirea (ieșirea) toate, deoarece acestea sunt conexiuni de ieșire #, intrare aruncăm totul și niciun server nu ar trebui să redirecționeze. iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP #Intranet LAN intranet = eth0 #Extranet wan extranet = eth1 # Keep state. Tot ceea ce este deja conectat (stabilit) este lăsat astfel: iptables -A INPUT -m state --state STABILIT, RELATAT -j ACCEPT # Buclă dispozitiv. iptables -A INPUT -i lo -j ACCEPT # http, https, nu specificăm interfața deoarece # vrem să fie toate iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp - dport 443 -j ACCEPT # ssh numai intern și din această gamă de iptables ip -A INPUT -p tcp -s 192.168.xx / 24 -i $ intranet --dport 7659 -j ACCEPT # monitorizare de exemplu dacă au zabbix sau alte servicii iptables snmp -A INPUT -p tcp -s 192.168.xx / 24 -i $ intranet --dport 10050 -j ACCEPT # icmp, ping bine depinde de tine iptables -A INPUT -p icmp -s 192.168.xx / 24 - i $ intranet -j ACCEPT #mysql cu postgres este portul 5432 iptables -A INPUT -p tcp -s 192.168.xx --sport 3306 -i $ intranet -j ACCEPT #sendmail bueeeh dacă doriți să trimiteți câteva mailuri iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT # Anti-SPOOFING 09/07/2014 # SERVER_IP = "190.xxx" # server IP - IP-ul real wan al serverului dvs. LAN_RANGE = "192.168.xx / 21 „Gama # LAN a rețelei sau a IP-urilor dvs. vlan care nu ar trebui să intre niciodată în extranet,este să folosim un pic de # logică dacă avem o interfață pur WAN, nu ar trebui să introducă niciodată # trafic de tip LAN prin acea interfață 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 "# Acțiune implicită - de efectuat atunci când orice regulă se potrivește cu ACTION =" DROP "# Pachete cu aceeași IP a serverului meu prin iptables wan -A INPUT -i $ extranet -s $ SERVER_IP -j $ ACTION # iptables -A OUTPUT -o $ extranet -s $ SERVER_IP -j $ ACTION # Pachete cu gama LAN pentru wan, am pus-o așa în cazul în care aveți # o anumită rețea, dar aceasta este redundantă cu următoarea # regulă în interior bucla "pentru" iptables -A INPUT -i $ extranet -s $ LAN_RANGE -j $ ACTION iptables -A OUTPUT -o $ extranet -s $ LAN_RANGE -j $ ACTION ## Toate rețelele SPOOF nu sunt permise de WAN pentru ip în $ SPOOF_IPS do iptables -A INPUT -i $ extranet -s $ ip -j $ ACTION iptables -A OUTPUT -o $ extranet -s $ ip -j $ ACTION done

Ca întotdeauna aștept comentariile dvs., rămâneți la curent cu acest blog, vă mulțumesc


12 comentarii, lasă-le pe ale tale

Lasă comentariul tău

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

*

*

  1. Responsabil pentru date: Miguel Ángel Gatón
  2. Scopul datelor: Control SPAM, gestionarea comentariilor.
  3. Legitimare: consimțământul dvs.
  4. Comunicarea datelor: datele nu vor fi comunicate terților decât prin obligație legală.
  5. Stocarea datelor: bază de date găzduită de Occentus Networks (UE)
  6. Drepturi: în orice moment vă puteți limita, recupera și șterge informațiile.

  1.   HO2Gi el a spus

    Mă ajută să continui să învăț ceva mai mult copiat.

    1.    brodydalle el a spus

      ești binevenit, bucuros să fii de ajutor

  2.   Xavier el a spus

    Îmi pare rău, dar am două întrebări (și una ca cadou 😉):

    Ați ajunge cu această configurație pentru ca Apache să ruleze și să închidă restul, cu excepția SSH?

    #Curățăm mesele
    iptables -F
    iptables -X

    Curățăm NAT

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

    iptables -A INTRARE -p tcp –dport 80 -j ACCEPT

    ssh numai intern și din această gamă de IP-uri

    iptables -A INPUT -p tcp -s 192.168.xx / 24 -i $ intranet –port 7659 -j ACCEPT

    A doua întrebare: Este 7659 portul utilizat în SSH în acest exemplu?

    Și al treilea și ultimul: în ce fișier trebuie salvată această configurație?

    Vă mulțumesc foarte mult pentru tutorial, este păcat că sunteți un începător și nu puteți profita bine de el.

    1.    brodydalle el a spus

      aceasta este regula de care aveți nevoie pentru http de la apache
      iptables -A INTRARE -p tcp –dport 80 -j ACCEPT

      dar trebuie să declarați și politicile implicite de renunțare (este în script)
      iptables -P INPUT DROP
      iptables -P ACCEPT IEȘIRE
      iptables -P FORDARD DROP

      și asta pentru că dacă ești îndepărtat, te va arunca.
      iptables -A INPUT -m state –stATE STABILIT, RELATAT -j ACCEPT

      dacă 7659 este portul acelui ssh în exemplu, în mod implicit este 22, deși vă recomand să schimbați un port "nu prea cunoscut"
      Omule, nu știu, așa cum vrei ... firewall.sh și îl plasezi în rc.local (sh firewall.sh) astfel încât să ruleze automat, depinde de ce sistem de operare ai, sunt fișiere unde puteți plasa regulile direct.

  3.   jge el a spus

    Hei, scriptul dvs. este foarte bun, îl analizăm .... Știți cum aș putea respinge toate cererile de la utilizatorii mei către un anumit site web? dar acest site web are o mulțime de servere ....

    1.    brodydalle el a spus

      Vă recomand și alte opțiuni:
      1) Puteți crea o zonă falsă în DNS-urile dvs. ...
      2) Puteți plasa un proxy cu acl
      embargou de păcat
      Pentru iptables vă poate plăcea asta ... nu este întotdeauna cea mai bună opțiune (există mai multe moduri)
      iptables -A INPUT -s blog.desdelinux.ne -j DROP
      iptables -A OUTPUT -d blog.desdelinux.net -j DROP

      Spune-mi dacă a funcționat

  4.   Xavier el a spus

    Mulțumim pentru răspuns, totul s-a lămurit. Întrebam despre port pentru că am fost surprins să folosesc 7659, deoarece porturile private încep de la 49152 și ar putea interfera cu un serviciu sau altceva.
    Din nou, mulțumesc pentru tot, e frumos!

    Salutări.

  5.   sic el a spus

    BrodyDalle, cum pot lua legătura cu tine? Foarte interesant scenariul tău.

  6.   Carlos el a spus

    Ultima linie dinainte „iptables -A OUTPUT -o $ extranet -s $ ip -j $ ACTION” este aceea de a împiedica falsificarea propriei mașini? Sau este posibil ca un pachet otrăvit să intre și să poată ieși cu acea sursă otrăvită și de aceea regula este inclusă și în OUTPUT?
    Multumesc mult pentru clarificare !!!

  7.   fran el a spus

    acesta este propriul meu script iptables, este foarte complet:

    # franes.iptables.airy
    # doc.iptables.airoso: iptables pentru moștenire și pentru nft
    #
    # porturi firewall
    #############################
    #! / Bin / bash
    #
    # ștergeți ecranul
    ################################ începutul /etc/f-iptables/default.cfg |||||
    clar
    # lăsați o linie goală
    ecou
    export da = »» nu = »ecou oprit»
    # variabilele pe care le puteți modifica pentru a permite accesul
    ####################### variabilele de modificat cu $ da sau $ nu
    export hayexcepciones = »$ nu»
    # există excepții: $ da pentru a permite gazdelor excepționale și $ nu pentru a dezactiva
    export de fânare = »$ nu»
    # hayping: $ da pentru a permite ping-urilor terților și $ nu pentru a nega
    export haylogserver = »$ nu»
    # haylogeosserver: $ da pentru a putea înregistra tcp $ nu pentru a nu putea înregistra tcp
    ######
    ####################### variabile de modificat adăugând „,” sau cu intervale de „:”
    excepții la export = »baldras.wesnoth.org»
    # excepții permit gazde unice sau multiple din firewall sau fără valoare
    export logserver = aruncați, ipp, dict, ssh
    # porturi server tcp care sunt înregistrate la intrarea pachetelor
    export redserver = 0/0
    # redserver: rețeaua pentru porturile serverului rețea locală preferabilă sau mai multe IP-uri
    export client roșu = 0/0
    #clientnet: rețeaua pentru porturile client preferabilă tuturor rețelelor
    export servidortcp = discard, ipp, dict, 6771
    # servidortcp: porturile serverului tcp specificate
    export serverudp = aruncați
    #udpserver: porturile de server UDP specificate
    export clientudp = domeniu, bootpc, bootps, ntp, 20000: 45000
    #udp client: porturile clientului UDP specificate
    export clienttcp = domeniu, http, https, ipp, git, dict, 14999: 15002
    # tcp client: porturile clientului tcp specificate
    ############################### sfârșitul /etc/f-iptables/default.cfg |||||
    ################################ sfârșitul variabilelor de modificat
    firewall de export = variabile $ 1 = $ 2
    dacă ["$ variabile" = "$ NULL"]; apoi sursa /etc/f-iptables/default.cfg;
    else source / etc / f-iptables / $ 2; fi
    ################################ sau va suprascrie variabilele cu un fișier .cfg
    ###################################################### ############################################
    firewall de export = 1 $ variabile de export = 2 $
    ########################################## variabile de sistem automate
    if ["$ firewall" = "deconectat"]; apoi ecou DE PARET DE FOC DECONECTAT;
    export activateserver = »$ nu» activateclient = »$ nu» umed = »$ nu»;
    elif ["$ firewall" = "client"]; apoi ecou FIREWALL CLIENT;
    export activateserver = »$ nu» activateclient = »» ud = »$ nu»;
    elif ["$ firewall" = "server"]; apoi ecou FIVERWALL SERVER;
    export activateserver = »» activateclient = »$ nu» umed = »$ nu»;
    elif ["$ firewall" = "client și server"]; apoi ecou CLIENT ȘI SERVER DE FIREWALL;
    export activate server = »»; export activateclient = »»; export umed = »$ nu»;
    elif ["$ firewall" = "permisiv"]; apoi ecou PERETE DE FOC PERMISIV;
    export activateserver = »$ nu» activateclient = »$ nu» umed = »»;
    altfel
    $ verifica sudo echo iptables-legacy:
    $ verifica sudo iptables-legacy -v -L INPUT
    $ verifica sudo iptables-legacy -v -L OUTPUT
    $ verifica sudo echo iptables-nft:
    $ verifica sudo iptables-nft -v -L INPUT
    $ verifica sudo iptables-nft -v -L OUTPUT
    ecou _____parametri____ 0 $ 1 $ 2 $
    echo „aruncat fără parametri este să listezi iptables.”
    ecou "Primul parametru (activați iptables): deconectat sau client sau server sau client și server sau permisiv."
    ecou "Al doilea parametru: (opțional): fișierul default.cfg alege /etc/f-iptables/default.cfg"
    echo "Setări variabile:" $ (ls / etc / f-iptables /)
    ieșire 0; fi
    ##################
    ecou
    echo Aruncă 0 $ deconectat sau client sau server sau client și server sau permisiv sau variabile sau fără a utiliza parametrul pentru a lista iptables.
    echo Fișierul $ 0 conține câteva variabile editabile în interior.
    ################################# activează variabilele de mai sus
    ###################################
    setarea ecoului variabilelor iptables
    variabile activate de ecou
    ecou
    ############################# regulile iptables
    echo Setarea iptables-moștenire
    sudo / usr / sbin / iptables-legacy -t filter -F
    sudo / usr / sbin / iptables-legacy -t nat -F
    sudo / usr / sbin / iptables-legacy -t mangle -F
    sudo / usr / sbin / ip6tables-legacy -t filter -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
    $ activați sudo server / usr / sbin / iptables-legacy -A INPUT -p udp -m multiport –porturi $ serverudp -s $ redserver -d $ redserver -j ACCEPT> / dev / null
    $ activate server 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 –state stabilit -s $ clientnet -d $ clientnet -j ACCEPT> / dev / null
    $ activateclient sudo / usr / sbin / iptables-legacy -A INPUT -p tcp -m multiport –sports $ clienttcp -m state –state stabilit -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
    $ activate sudo server / usr / sbin / iptables-legacy -A OUTPUT -p udp -m multiport –sports $ serverudp -s $ redserver -d $ redserver -j ACCEPT> / dev / null
    $ activate server 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 –porturi $ 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
    eco iptables-legacy activat
    ecou
    echo Setarea iptables-nft
    sudo / usr / sbin / iptables-nft -t filter -F
    sudo / usr / sbin / iptables-nft -t nat -F
    sudo / usr / sbin / iptables-nft -t mangle -F
    sudo / usr / sbin / ip6tables-nft -t filter -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 DROP
    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
    $ activate server sudo / usr / sbin / iptables-nft -A INPUT -p udp -m multiport –dports $ serverudp -s $ redserver -d $ redserver -j ACCEPT> / dev / null
    $ activate server 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 –state stabilit -s $ clientnet -d $ clientnet -j ACCEPT> / dev / null
    $ activateclient sudo / usr / sbin / iptables-nft -A INPUT -p tcp -m multiport –sports $ clienttcp -m state –state stabilit -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
    $ activate server sudo / usr / sbin / iptables-nft -A OUTPUT -p udp -m multiport –sports $ serverudp -s $ redserver -d $ redserver -j ACCEPT> / dev / null
    $ activate server sudo / usr / sbin / iptables-nft -A OUTPUT -p tcp -m multiport –sports $ serverrtcp -s $ redserver -d $ redserver -j ACCEPT> / dev / null
    $ activateclient 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 –porturi $ 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 OUTPUT -j DROP
    sudo / usr / sbin / iptables-nft -A FORWARD -j DROP
    echo iptables-nft activat
    ecou
    $ ud sudo / usr / sbin / iptables-legacy -F> / dev / null
    $ sudo umed / usr / sbin / iptables-legacy -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT> / dev / null
    $ umed sudo / usr / sbin / iptables-legacy -A INPUT -m state –state stabilit -j ACCEPT> / dev / null
    $ ud sudo / usr / sbin / iptables-legacy -A INPUT -j DROP> / dev / null
    $ umed sudo / usr / sbin / iptables-legacy -A OUTPUT -j ACCEPT> / dev / null
    $ umed sudo / usr / sbin / iptables-legacy -A FORWARD -j DROP> / dev / null
    $ umed sudo / usr / sbin / iptables-nft -F> / dev / null
    $ sudo umed / usr / sbin / iptables-nft -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT> / dev / null
    $ umed sudo / usr / sbin / iptables-nft -A INPUT -m state –state stabilit -j ACCEPT> / dev / null
    $ umed sudo / usr / sbin / iptables-nft -A INPUT -j DROP> / dev / null
    $ umed sudo / usr / sbin / iptables-nft -A OUTPUT -j ACCEPT> / dev / null
    $ umed sudo / usr / sbin / iptables-nft -A FORWARD -j DROP> / dev / null
    #############################
    ecou ați aruncat $ 0 $ 1 $ 2 $
    # iese din script
    iesirea 0

  8.   louis duran el a spus

    Cum aș seta o regulă dacă acest firewall l-ar folosi pentru gateway-ul meu și ar avea un calamar în interiorul LAN ???