Gabay

Pag-set up ng ufw sa Linux: firewall sa server at mga batayan ng nftables

Na-update: · Skillaria.Top

Ang pag-set up ng ufw ay tatlong hakbang: itakda ang default policy (sudo ufw default deny incoming at allow outgoing), payagan ang SSH at ang kailangang port (sudo ufw allow 22/tcp, sudo ufw allow 443/tcp), at saka i-enable ang firewall gamit ang sudo ufw enable. Sinusuri ang mga rule gamit ang sudo ufw status numbered, at sa ilalim, kinokontrol ng ufw ang netfilter sa pamamagitan ng iptables o nftables.

Nagpapasya ang firewall sa Linux kung aling network packet ang papapasukin sa server at alin ang itatapon. Ginagawa ito ng netfilter subsystem ng kernel, at kinokontrol ito ng mga utility gaya ng mababang antas na iptables at nftables, at ng mas simpleng ufw (Uncomplicated Firewall). Para sa karamihan ng server sa Ubuntu at Debian, limang minuto lang ang ufw setup: isara ang lahat ng papasok, buksan ang SSH at ang port ng mga serbisyo, at i-enable. Sa ibaba ang hakbang-hakbang na gabay, mga karaniwang pagkakamali, at ang kaunting nftables para maunawaan kung ano ang nangyayari sa ilalim.

Paano gumagana ang firewall sa Linux

Nasa kernel ang pag-filter ng packet, at ito ang netfilter. Nagbibigay ito ng mga hook: ang papasok na trapiko papunta sa mismong host, ang palabas, at ang dumadaan lamang (forward). Ang mga user utility ay nagsusulat lamang ng mga rule sa kernel para sa mga hook na ito.

ToolAntasKailan gamitin
ufwnasa itaas, simpleng syntaxiisang server sa Ubuntu/Debian, karaniwang rule
firewalldnasa itaas, may zoneRHEL, Rocky, Fedora
nftables (nft)mababa, modernokumplikadong rule, NAT, set ng address
iptablesmababa, unti-unting nawawalamga lumang system at script

Mahalaga: gumamit ng isang tool lamang sa pamamahala. Kung sabay mong ine-edit ang rule sa ufw at sa iptables nang manu-mano, mag-o-overwrite sila sa isa't isa, at magiging hindi mahulaan ang resulta.

Pag-install at pagsusuri ng ufw

Karaniwang naka-install na ang ufw sa Ubuntu pero naka-off. Sa Debian, kailangan itong i-install nang hiwalay:

$ sudo apt update
$ sudo apt install ufw
$ sudo ufw status
Status: inactive

Ang estadong inactive ay nangangahulugang hindi ina-apply ang mga rule ng ufw. Huwag pa itong i-enable: payagan muna ang SSH, dahil kung nasa malayong server ka, puputulin mo ang sarili mong access.

Hakbang-hakbang na ufw setup sa server

Hakbang 1. Mga default policy

Ang default policy ang gagawin sa packet kapag walang rule na tumugma. Ligtas na setup para sa server: bawal ang papasok, pinapayagan ang palabas.

$ sudo ufw default deny incoming
Default incoming policy changed to 'deny'
$ sudo ufw default allow outgoing
Default outgoing policy changed to 'allow'

Awtomatikong pinapasok ang mga sagot sa sarili mong palabas na koneksyon: sinusubaybayan ng ufw ang estado ng koneksyon (connection tracking), kaya hindi na kailangang magbukas ng port para sa mga sagot.

Hakbang 2. Payagan ang SSH

$ sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)

Ang OpenSSH ay application profile. Kung nakikinig ang SSH sa hindi karaniwang port, tahasang payagan ito: sudo ufw allow 2222/tcp. Para malaman kung aling port talaga ang gamit ng sshd, patakbuhin ang sudo ss -tlnp | grep sshd.

Hakbang 3. Buksan ang port ng mga serbisyo

$ sudo ufw allow 80/tcp
$ sudo ufw allow 443/tcp

Ilagay ang protocol: kapag walang /tcp, bubuksan ng ufw ang port para sa TCP at UDP nang sabay, at ang dagdag na bukas na pinto ay hindi kailangan.

Hakbang 4. I-enable ang firewall

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

Agad na tatakbo ang ufw at awtomatikong magsisimula sa bawat boot. Huwag isara ang kasalukuyang SSH session: magbukas ng pangalawa at tiyaking gumagana ang koneksyon.

Hakbang 5. Suriin ang mga rule

$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp (OpenSSH)           ALLOW IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
443/tcp                    ALLOW IN    Anywhere
22/tcp (OpenSSH (v6))      ALLOW IN    Anywhere (v6)
80/tcp (v6)                ALLOW IN    Anywhere (v6)
443/tcp (v6)               ALLOW IN    Anywhere (v6)

Awtomatikong gumagawa ng rule para sa IPv6 ang ufw kung nakatakda sa /etc/default/ufw ang IPV6=yes (ito ang default).

Paano magbukas ng port sa ufw: lahat ng syntax

Naiintindihan ng ufw allow ang maikli at buong anyo. Ang maikli ay para sa karaniwang kaso, ang buo naman ay kapag kailangang tukuyin ang pinagmulan, interface o destinasyong address.

GawainCommand
TCP portsudo ufw allow 443/tcp
UDP portsudo ufw allow 51820/udp
Saklaw ng mga portsudo ufw allow 6000:6007/tcp
Sa pamamagitan ng pangalan ng serbisyosudo ufw allow https
Mula sa isang IPsudo ufw allow from 203.0.113.10
Mula sa subnet papunta sa portsudo ufw allow from 10.0.0.0/24 to any port 5432 proto tcp
Sa partikular na interfacesudo ufw allow in on eth1 to any port 3306 proto tcp
Ipagbawalsudo ufw deny 23/tcp
Tanggihan nang may sagotsudo ufw reject 25/tcp

Ang pagkakaiba ng deny at reject: tahimik na itinatapon ng deny ang packet kaya naghihintay ang kliyente hanggang mag-timeout; nagpapadala naman ng sagot ang reject na sarado ang port. Para sa labas, karaniwang deny ang pinipili; para sa internal na network, mas maginhawa ang reject dahil agad na nakikita ng mga kliyente ang error.

Database na bukas lamang sa isang server

Karaniwang kaso: hindi dapat makita sa internet ang PostgreSQL o MySQL, pero kailangang kumonekta rito ang application sa kalapit na server.

$ sudo ufw allow from 10.0.0.5 to any port 5432 proto tcp
Rule added

Nananatiling sarado ang port 5432 sa lahat ng iba pa dahil sa deny incoming na policy. Mabuting i-configure din ang mismong database na makinig lamang sa internal na address: pinoprotektahan ng firewall at ng setting ng serbisyo ang isa't isa.

Mga application profile

Puwedeng maglagay ang mga package ng paglalarawan ng kanilang mga port sa /etc/ufw/applications.d/. Listahan at nilalaman ng mga profile:

$ sudo ufw app list
Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH
$ sudo ufw app info "Nginx Full"
Profile: Nginx Full
Title: Web Server (Nginx, HTTP + HTTPS)
Description: Small, but very powerful and efficient web server

Ports:
  80,443/tcp

Para payagan ang profile: sudo ufw allow "Nginx Full". Ilagay sa quotation mark ang mga pangalang may espasyo. Puwede kang gumawa ng sarili mong profile sa INI format sa parehong direktoryo at i-apply ito gamit ang sudo ufw app update pangalan.

Paano magbura ng rule sa ufw

Ang pinakamaaasahang paraan ay ayon sa numero:

$ sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] OpenSSH                    ALLOW IN    Anywhere
[ 2] 80/tcp                     ALLOW IN    Anywhere
[ 3] 443/tcp                    ALLOW IN    Anywhere
[ 4] OpenSSH (v6)               ALLOW IN    Anywhere (v6)
[ 5] 80/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 6] 443/tcp (v6)               ALLOW IN    Anywhere (v6)

$ sudo ufw delete 2
Deleting:
 allow 80/tcp
Proceed with operation (y|n)? y
Rule deleted

Pagkatapos magbura, nagbabago ang mga numero, kaya patakbuhin muli ang status numbered bago ang susunod na pagbura. Ang pangalawang paraan ay ulitin ang rule na may salitang delete: sudo ufw delete allow 80/tcp; binubura nito nang sabay ang IPv4 at IPv6 na bersyon.

Pagkakasunod-sunod ng rule at pagsingit sa itaas

Sinusuri ng ufw ang mga rule mula sa itaas pababa, at ang unang tumugma ang nasusunod. Kaya ang pagbabawal para sa partikular na address ay dapat nasa itaas ng pangkalahatang pagpayag:

$ sudo ufw insert 1 deny from 198.51.100.23
Rule inserted

Kapag idinagdag mo ang deny gamit ang karaniwang command, mapupunta ito sa dulo ng listahan, pagkatapos ng allow 443/tcp, at hindi ito gagana para sa port na iyon.

Proteksyon ng SSH laban sa brute force: ufw limit

Pinapayagan ng rule na limit ang koneksyon, pero hinaharangan ang address na nagbukas ng 6 o higit pang koneksyon sa loob ng 30 segundo:

$ sudo ufw limit OpenSSH
Rule updated

Ito ay simpleng proteksyon laban sa malawakang brute force ng password. Para sa mas seryosong proteksyon, idagdag ang login gamit lamang ang key at, kung gusto, ang fail2ban, na kayang mag-ban ng address sa pamamagitan ng ufw.

Mga log ng ufw

Ang logging ay naka-enable sa pamamagitan ng sudo ufw logging on; ang mga level ay low, medium, high, full. Napupunta ang mga entry sa /var/log/ufw.log (sa pamamagitan ng rsyslog) at sa kernel log:

$ sudo journalctl -k | grep 'UFW BLOCK' | tail -2
Oct 14 10:12:03 web kernel: [UFW BLOCK] IN=eth0 OUT= SRC=45.155.205.1 DST=192.0.2.10 PROTO=TCP SPT=51544 DPT=3389
Oct 14 10:12:09 web kernel: [UFW BLOCK] IN=eth0 OUT= SRC=89.248.165.7 DST=192.0.2.10 PROTO=TCP SPT=40312 DPT=23

Ipinapakita ng mga field na SRC at DPT kung sino ang kumatok at sa aling port. Kung hindi tumutugon ang serbisyo at may UFW BLOCK sa log para sa port nito, ibig sabihin hindi pa naidadagdag ang rule.

ufw at Docker: bakit bukas ang mga port kahit may rule

Ito ang pinakakilalang bitag. Kapag naglalathala ng port ang Docker (-p 8080:80), nagdadagdag ito ng sariling NAT rule at chain na DOCKER, at dumadaan ang trapiko papunta sa container sa forward, nilalampasan ang papasok na rule ng ufw. Kaya hindi lumalabas ang port 8080 sa ufw status, pero bukas ito mula sa labas.

Mga solusyon:

  • Ilathala lamang ang port sa localhost: -p 127.0.0.1:8080:80, at ilabas ito sa labas sa pamamagitan ng reverse proxy (nginx).
  • Magdagdag ng sariling rule sa chain na DOCKER-USER — hindi ito pinapatungan ng Docker.
  • Huwag ilathala ang port ng mga service container, at ikonekta na lamang sila sa pamamagitan ng Docker network.

Reset at pag-disable

$ sudo ufw disable     # i-off, nananatili ang mga rule
$ sudo ufw reset       # burahin ang lahat ng rule at i-off
$ sudo ufw reload      # basahin muli ang configuration

Bago ang reset, gumagawa ang ufw ng kopya ng mga file ng rule sa /etc/ufw/ na may petsa sa dulo. Ang mga rule mismo ay nasa /etc/ufw/user.rules at user6.rules — huwag itong i-edit nang manu-mano, gamitin lamang ang mga command.

Mga batayan ng nftables

Ang nftables ang modernong kapalit ng iptables sa kernel ng Linux. Sa Debian 10+ at Ubuntu 20.10+, ang command na iptables ay gumagana bilang default sa pamamagitan ng compatibility layer na iptables-nft, kaya nasa nftables din ang mga rule ng ufw. Para makita ang lahat ng nakakarga sa kernel:

$ sudo nft list ruleset

Istruktura ng nftables: ang table (family na ip, ip6, o inet para sa pareho) ay naglalaman ng mga chain na nakakabit sa mga punto ng netfilter, at ang mga chain ay naglalaman ng mga rule. Minimal na firewall para sa server sa file na /etc/nftables.conf:

#!/usr/sbin/nft -f
flush ruleset

table inet filter {
    chain input {
        type filter hook input priority 0; policy drop;
        ct state established,related accept
        ct state invalid drop
        iif "lo" accept
        ip protocol icmp accept
        meta l4proto ipv6-icmp accept
        tcp dport { 22, 80, 443 } accept
    }
    chain forward {
        type filter hook forward priority 0; policy drop;
    }
    chain output {
        type filter hook output priority 0; policy accept;
    }
}

I-apply at i-enable sa boot:

$ sudo nft -c -f /etc/nftables.conf   # suriin lamang ang syntax
$ sudo systemctl enable --now nftables

Puwedeng magdagdag ng rule habang tumatakbo, pero mawawala ang mga ito pagkatapos mag-reboot kung hindi isusulat sa file:

$ sudo nft add rule inet filter input tcp dport 5432 ip saddr 10.0.0.5 accept
$ sudo nft -a list chain inet filter input   # ipapakita ng -a ang handle ng mga rule
$ sudo nft delete rule inet filter input handle 9

Ang pangunahing bentahe ng nftables ay ang mga set ({ 22, 80, 443 }) at ang iisang inet table para sa IPv4 at IPv6. Huwag patakbuhin nang sabay ang sarili mong nftables.service at ang ufw: buburahin ng flush ruleset ang mga rule ng ufw.

Mga karaniwang pagkakamali

  • Na-enable ang ufw nang walang rule para sa SSH — nawala ang access. Nasasagip ka ng console ng provider (VNC/serial): sudo ufw allow OpenSSH o sudo ufw disable.
  • Nabuksan ang port pero hindi ma-access ang serbisyo — nakikinig ang serbisyo sa 127.0.0.1, hindi sa panlabas na address. Tingnan gamit ang ss -tlnp.
  • May cloud firewall pa — maraming provider ang may security group; buksan din doon ang port.
  • Hindi gumagana ang deny — mas mababa ang rule kaysa sa pumapayag na rule; gamitin ang insert 1.

Buod

Ang batayang ufw setup ay binubuo ng default deny incoming, pagpayag sa SSH at sa mga port ng serbisyo, ufw enable, at pagsusuri gamit ang status numbered. Para sa tiyak na access, gamitin ang mga rule na may from at port; para sa SSH, gamitin ang limit; at kapag gumagamit ng Docker, tandaang nilalampasan nito ang ufw. Kapag kailangan ang NAT o kumplikadong set ng rule, lumipat sa nftables. Ang proteksyon ng server gamit ang firewall ay ipinapaliwanag din nang praktikal sa kursong Linux.

Mga madalas itanong

Ano ang pagkakaiba ng ufw at iptables?

Ang ufw ay nasa itaas na may simpleng syntax at kusang gumagawa ng mga rule ng iptables o nftables. Ang iptables at nftables ay mababang antas na tool na nagbibigay ng buong kontrol, pero nangangailangan ng mas maraming kaalaman.

Nananatili ba ang mga rule ng ufw pagkatapos mag-reboot?

Oo. Pagkatapos ng sudo ufw enable, awtomatikong nagsisimula ang firewall sa boot, at nakaimbak ang mga rule sa /etc/ufw/user.rules at user6.rules.

Kailangan bang magbukas ng port para sa palabas na koneksyon?

Kapag allow outgoing ang policy, hindi na kailangan. Awtomatikong pinapasok ng ufw ang mga sagot sa palabas na koneksyon dahil sa connection tracking.

Paano payagan ang ping habang naka-enable ang ufw?

Bukas na ang papasok na ICMP echo request bilang default: nakalagay ang rule na ito sa /etc/ufw/before.rules. Para i-block ang ping, palitan ang ACCEPT ng DROP sa file na iyon at patakbuhin ang sudo ufw reload.

May ufw ba sa CentOS at Rocky Linux?

Ang standard na tool doon ay firewalld, kasama ang command na firewall-cmd. Puwedeng i-install ang ufw mula sa EPEL, pero hindi magandang paghaluin ito sa firewalld.

Pag-aralan ito sa video

Detalyadong tinatalakay ang paksang ito, may praktis, sa kursong “Linux: с нуля до уверенного администрирования”.

Pumunta sa kurso