Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2013-06-24 15:01:50

  czater - Użytkownik

czater
Użytkownik
Zarejestrowany: 2008-03-24

Prosty firewall zabezpieczający stronę www

Witam

Planuję uruchomić stronę www na Apache i Debianie z dostępem przez ssh. Napisałem prosty firewall w oparciu o iptables. Chciałbym poznać Wasze opinie oraz czy coś powinienem ewentualnie poprawić.

Kod:

#!/bin/sh
IPTABLES=/sbin/iptables
$IPTABLES -F

$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD DROP

$IPTABLES -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

$IPTABLES -A OUTPUT -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEP

$IPTABLES -A INPUT -p tcp -i eth0 --dport 22 --sport 1024:65535 -m state --state NEW -j ACCEPT
$IPTABLES -A INPUT -p tcp -i eth0 --dport 80 --sport 1024:65535 -m state --state NEW -j ACCEPT
$IPTABLES -A INPUT -p tcp -i eth0 --dport 443 --sport 1024:65535 -m state --state NEW -j ACCEPT

Offline

 

#2  2013-06-24 16:26:07

  enether - wiecznie niewyspany

enether
wiecznie niewyspany
Zarejestrowany: 2012-05-01

Re: Prosty firewall zabezpieczający stronę www

Ogólnie jak na początek całkiem ładny, jednak pare małych uwag:

1. Koniecznie, koniecznie zmień port na którym działa SSH na jakiś inny. Najlepiej coś powyżej 20000
2. Literówka w nazwie skoku w łańcuchu OUTPUT (ACCEP zamiast ACCEPT)
3. Poczytaj o modułach iptables o nazwie recent i limit. Przydałoby się zrobić jakieś limity jednoczesnych połączeń per IP, albo ilość pakietów TCP z flagą SYN na początek (takie drobne utrudnienie na drodze zrobienia kuku maszynie)
4. Wpuść pakiet ICMP typu 8, czyli ping request. Miło gdy serwer odpowiada na pingi.
5. Dorób limitowanie tych pakietów, żebyś nie dostał ich 40 tysięcy w sekundę :P
6. Jeżeli masz możliwość (tzn jest to maszyna fizyczna, albo pełna wirtualizacja, nie kulawy OpenVZ) zainteresuj się tym co kryje się w paczkach xtables-addons i ipset.
7. Wpuszczenie ruchu na interfejsie loopback (lo) by nie zaszkodziło, niekiedy rzeczy lubią się sypać gdy tego nie ma.
8. Poczekaj na Jacekalex'a, ten Pan ma zawsze miliony pomysłów ;)

Offline

 

#3  2013-06-24 17:04:47

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

Re: Prosty firewall zabezpieczający stronę www

Dorzuć sobie jeszcze to:

Kod:

/sbin/iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset
/sbin/iptables -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
/sbin/iptables -A INPUT -j REJECT --reject-with icmp-proto-unreachable

Jeszcze się nie zagłębiałem w iptables i nie wiem po co to, ale w każdym fw to dodają. xD

Offline

 

#4  2013-06-24 18:46:36

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/urandom
Zarejestrowany: 2008-01-07

Re: Prosty firewall zabezpieczający stronę www

[quote=morfik]Dorzuć sobie jeszcze to:

Kod:

/sbin/iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset
/sbin/iptables -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
/sbin/iptables -A INPUT -j REJECT --reject-with icmp-proto-unreachable

Jeszcze się nie zagłębiałem w iptables i [b]nie wiem po co to[/b], ale w każdym fw to dodają. xD[/quote]
Gratuluję fachowej ekspertyzy... :D

Te regułki mają inaczej odrzucać połączenia, odsyłając pakiet ICMP z odpowiednią informacją, przeważnie w ten sposób ukrywa się usługi albo istnienie serwera.
Przy serwerze www niezbyt sensowne i niezbyt potrzebne, skoro i tak z portu 80 można się dowiedzieć dokładnie co to za system i jaki serwer, przy pomocy np nikto.

Ja bym wywalił ssh na jakiś losowy port i dał na nim limity połączeń, bardzo scisłe przy pomocy hashlimit.
np coś w ten deseń:

Kod:

iptables -I INPUT -m hashlimit -m tcp -p tcp --dport {port_ssh} --hashlimit 1/min --hashlimit-mode srcip --hashlimit-name ssh -m state –state NEW -j ACCEPT

Sznurek:
http://blog.serverbuddies.com/using-hashlimit-in-iptables/

Identycznie bym obciął przy pomocy hashlimit i connlimit inne usługi, dopasowując limity połączeń i nowych połączeń do oczekiwanych i akceptowalnych dla serwera www i innych usług.

Np tak kiedyś robiłem do malutkiego serwera pocztowego z Qmailem na pokładzie, usługa SMTP:

Kod:

iptables -N SMTP # osobny łancuch dla uslugi.
iptables -A SMTP ! -i lo  -m state --state NEW  -m set --match-set spamhaus src -j STEAL
iptables -A SMTP ! -i lo  -m state --state NEW -m set --match-set sblamdrop src -j STEAL
iptables -A  SMTP ! -i lo -m connlimit --connlimit-upto 10 --connlimit-mask 0 --connlimit-saddr -m hashlimit --hashlimit-upto 1/min --hashlimit-burst 1 --hashlimit-mode srcip --hashlimit-name smtp -j ACCEPT
iptables -A INPUT ! -i lo -p tcp -m multiport --dports 25,465,587 -j SMTP

A tutaj Ejabberd server2server:

Kod:

iptables -A INPUT  ! -i lo -p tcp --dport 5269  -m connlimit --connlimit-upto 10 --connlimit-mask 0 --connlimit-saddr -m hashlimit --hashlimit 5/min --hashlimit-burst 5 --hashlimit-mode srcip --hashlimit-name xmpp -j ACCEPT

Wszystkie reguły i konfiguracje  najpierw testuj w domu, żeby jakiegoś przypału nie było, jeśli serwer stoi np na księżycu, albo jeszcze dalej. :D

Sznurki:
http://pl.wikibooks.org/wiki/Sieci_w_Linuksie/Netfilter
http://jacekalex.sh.dug.net.pl/Iptables-packet-flow.png

Pozdro
;-)

Ostatnio edytowany przez Jacekalex (2013-06-25 17:26:21)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#5  2013-06-24 18:58:09

  jurgensen - Użytkownik

jurgensen
Użytkownik
Skąd: Wrocław
Zarejestrowany: 2010-01-26

Re: Prosty firewall zabezpieczający stronę www

ICMP jest ważne dla wielu protokołów diagnostycznych, dlatego też nie zalecałbym jego pełnego wyłączenia. Wg mnie powinny być przynajmniej puszczone typy unreach(3), echoreq(8) oraz już nie w pełni konieczne timex(11)

Offline

 

#6  2013-06-25 08:53:53

  redelek - Członek DUG

redelek
Członek DUG
Skąd: Warszawa
Zarejestrowany: 2008-07-17

Re: Prosty firewall zabezpieczający stronę www

jak zwykle @jacek świetnie wyjaśnił. Podłączę się do pytania, bo jest troszkę zbliżone. Jak przetestować swoje ustawienia? czy jest jakiś skaner który zasymulował by   mi tyle skanów czy ataków na SSH i inne porty ?
Jest coś takiego?


Pozdrawiam
Redelek
--------------------------------------------------------
Polecam hosting ViPower https://vipower.pl/panel/aff.php?aff=208, TikTalik https://tiktalik.com/pl/

Offline

 

#7  2013-06-25 10:28:27

  czater - Użytkownik

czater
Użytkownik
Zarejestrowany: 2008-03-24

Re: Prosty firewall zabezpieczający stronę www

Dziękuje za informację, stworzyłem następną wersję, do zabezpiecznia ssh planuje portsentry "zatrudnić"

Kod:

#!/bin/sh
IPTABLES=/sbin/$IPTABLES
$IPTABLES -F

$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD DROP

$IPTABLES -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

$IPTABLES -A OUTPUT -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

$IPTABLES -A INPUT -p tcp -i eth0 --dport 20002 --sport 1024:65535 -m state --state NEW -j ACCEPT
$IPTABLES -I INPUT -m hashlimit -m tcp -p tcp –dport 20002 –hashlimit 1/min –hashlimit-mode srcip –hashlimit-name ssh -m state –state NEW -j ACCEP
$IPTABLES -A INPUT -p tcp -i eth0 --dport 80 --sport 1024:65535 -m state --state NEW -j ACCEPT
$IPTABLES -A INPUT -p tcp -i eth0 --dport 443 --sport 1024:65535 -m state --state NEW -j ACCEPT

$IPTABLES -A INPUT –p tcp --dport 80 --syn –m limit --limit 1/s –m state --state NEW –j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type 8 -m limit --limit 1/s -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type 8 -m limit --limit 1/s -j ACCEPT


# zezwolenie na ruch dla interfejsow petli zwrotnej
$IPTABLES -I INPUT -i lo -j ACCEPT
$IPTABLES -I OUTPUT -o lo -j ACCEPT
$IPTABLES -I INPUT -s 127.0.0.0/8 -d 127.0.0.0/8 -j ACCEPT
$IPTABLES -I OUTPUT -s 127.0.0.0/8 -d 127.0.0.0/8 -j ACCEPT
$IPTABLES -I INPUT -i lo -m state --state ESTABLISHED,RELATED -j ACCEPT

Ostatnio edytowany przez czater (2013-06-25 10:29:02)

Offline

 

#8  2013-06-25 10:48:20

  enether - wiecznie niewyspany

enether
wiecznie niewyspany
Zarejestrowany: 2012-05-01

Re: Prosty firewall zabezpieczający stronę www

No i wygląda całkiem ślicznie :>

Tylko skoro masz politykę dla OUTPUT domyślnie na ACCEPT nie ma sensu dodawać regułek loopbacka do tego łańcucha.
I ten jeden pakiet SYN na sekundę... A co jeżeli na stronę będzie chciało wejść kilku mieszkańców bloku którzy wszyscy siedzą za NAT'em i dzielą ten sam adres zewnętrzny? Ustaw ze 3,5. Wielka krzywda się nie stanie.

A co do pilnowania ssh: prawdopodobieństwo że jakiś automat wyczai Ci ssh na tym porcie jest nikłe. Do tego masz tam hashlimit 1 połączenie na minutę. Więc bruteforcowanie tego przez automaty trwałoby wieki. Jedyny sens zakładania jakiegoś daemona pilnującego tego portu to sytuacja gdy boisz sie że ktoś umyślnie będzie chciał zrobić Ci kuku. Wtedy jak coś polecałbym fail2ban (oprócz ssh potrafi pilnować proftpd, vsftp, apacha, etc) albo darmowego HIDS'a OSSEC (całkiem sympatyczne, ma szerooooooookie możliwości).

IMHO jakby ktoś chciał Ci robić kuku szybciej by znalazł jakąś podatność na stronie i przy jej użyciu się dostał do środka.

Ostatnio edytowany przez enether (2013-06-25 10:50:28)

Offline

 

#9  2013-06-25 13:30:48

  czater - Użytkownik

czater
Użytkownik
Zarejestrowany: 2008-03-24

Re: Prosty firewall zabezpieczający stronę www

Ok, a więc rozumiem że tak powinien wyglądać

Kod:

$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD DROP

$IPTABLES -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

$IPTABLES -A OUTPUT -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

$IPTABLES -A INPUT -p tcp -i eth0 --dport 20002 --sport 1024:65535 -m state --state NEW -j ACCEPT
$IPTABLES -I INPUT -m hashlimit -m tcp -p tcp –dport 20002 –hashlimit 1/min –hashlimit-mode srcip –hashlimit-name ssh -m state –state NEW -j ACCEP
$IPTABLES -A INPUT -p tcp -i eth0 --dport 80 --sport 1024:65535 -m state --state NEW -j ACCEPT
$IPTABLES -A INPUT -p tcp -i eth0 --dport 443 --sport 1024:65535 -m state --state NEW -j ACCEPT

$IPTABLES -A INPUT –p tcp --dport 80 --syn –m limit --limit 1/s –m state --state NEW –j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type 8 -m limit --limit 1/s -j ACCEPT

# zezwolenie na ruch dla interfejsow petli zwrotnej
$IPTABLES -I INPUT -i lo -j ACCEPT
$IPTABLES -I INPUT -s 127.0.0.0/8 -d 127.0.0.0/8 -j ACCEPT
$IPTABLES -I INPUT -i lo -m state --state ESTABLISHED,RELATED -j ACCEPT

Offline

 

#10  2013-06-25 14:06:31

  enether - wiecznie niewyspany

enether
wiecznie niewyspany
Zarejestrowany: 2012-05-01

Re: Prosty firewall zabezpieczający stronę www

[quote=czater]Ok, a więc rozumiem że tak powinien wyglądać

Kod:

$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD DROP

$IPTABLES -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

$IPTABLES -A OUTPUT -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

$IPTABLES -A INPUT -p tcp -i eth0 --dport 20002 --sport 1024:65535 -m state --state NEW -j ACCEPT
$IPTABLES -I INPUT -m hashlimit -m tcp -p tcp –dport 20002 –hashlimit 1/min –hashlimit-mode srcip –hashlimit-name ssh -m state –state NEW -j ACCEP
$IPTABLES -A INPUT -p tcp -i eth0 --dport 80 --sport 1024:65535 -m state --state NEW -j ACCEPT
$IPTABLES -A INPUT -p tcp -i eth0 --dport 443 --sport 1024:65535 -m state --state NEW -j ACCEPT

$IPTABLES -A INPUT –p tcp --dport 80 --syn –m limit --limit 1/s –m state --state NEW –j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type 8 -m limit --limit 1/s -j ACCEPT

# zezwolenie na ruch dla interfejsow petli zwrotnej
$IPTABLES -I INPUT -i lo -j ACCEPT
$IPTABLES -I INPUT -s 127.0.0.0/8 -d 127.0.0.0/8 -j ACCEPT
$IPTABLES -I INPUT -i lo -m state --state ESTABLISHED,RELATED -j ACCEPT

[/quote]

Kod:

$IPTABLES -A OUTPUT -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

Jako że polityka OUTPUT jest na ACCEPT ta linijka nie robi nic.

Kod:

$IPTABLES -I INPUT -s 127.0.0.0/8 -d 127.0.0.0/8 -j ACCEPT
$IPTABLES -I INPUT -i lo -m state --state ESTABLISHED,RELATED -j ACCEPT

Jako że przed nimi masz "-i lo -j ACCEPT" to te wpisy nie mają żadnego znaczenia. Reguły w netfilterze przegladane są od góry w dół. Czyli jeżeli pakiet pasuje do regułki "pochodzi z interfejsu lo - zaakceptuj" wtedy nie jest już testowany na pochodzenie bądź miejsce docelowe czy stan.

Kod:

$IPTABLES -A INPUT -p tcp -i eth0 --dport 20002 --sport 1024:65535 -m state --state NEW -j ACCEPT
$IPTABLES -I INPUT -m hashlimit -m tcp -p tcp –dport 20002 –hashlimit 1/min –hashlimit-mode srcip –hashlimit-name ssh -m state –state NEW -j ACCEPT

Podobnie. Najpierw pakiet zostanie sprawdzony pod kątem regułki powyższej i zatwierdzony, w związku z tym nigdy nie będzie testowany pod kątem ilości połączeń na minutę. Górną usuń.

Kod:

$IPTABLES -A INPUT -p tcp -i eth0 --dport 80 --sport 1024:65535 -m state --state NEW -j ACCEPT
$IPTABLES -A INPUT -p tcp -i eth0 --dport 443 --sport 1024:65535 -m state --state NEW -j ACCEPT

$IPTABLES -A INPUT –p tcp --dport 80 --syn –m limit --limit 1/s –m state --state NEW –j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type 8 -m limit --limit 1/s -j ACCEPT

To samo. Górna para jest zbędna skoro masz poniżej wpis dotyczacy portu 80 z modułem limit zastosowanym. Dorób taki sam wpis dla portu 443 (HTTPS) i ustaw limit na nieco większy. 5/s myślę, w ICMP też.

Dodatkowo staraj się nie mieszać appendów (-A) z insertami (-I) bo potem regułki wychodzą w dzikiej kolejności i pierwotny zamysł przy ich pisaniu może nie podziałać. Zdecydowanie lepiej w pliku umieszczać -A w odpowiedniej kolejności.

Ostatnio edytowany przez enether (2013-06-25 14:07:47)

Offline

 

#11  2013-06-25 17:30:32

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/urandom
Zarejestrowany: 2008-01-07

Re: Prosty firewall zabezpieczający stronę www

[quote=redelek]jak zwykle @jacek świetnie wyjaśnił. Podłączę się do pytania, bo jest troszkę zbliżone. Jak przetestować swoje ustawienia? czy jest jakiś skaner który zasymulował by   mi tyle skanów czy ataków na SSH i inne porty ?
Jest coś takiego?[/quote]
Można np przez localhosta:

Kod:

iptables -S | grep 127
-A INPUT -d 127.0.2.1/32 -i lo -p udp -j REJECT --reject-with icmp-host-unreachable
-A INPUT -d 127.0.2.1/32 -i lo -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -d 127.0.2.4/32 -i lo -j STEAL
-A INPUT -d 127.0.2.5/32 -i lo -p tcp -j DELUDE
-A INPUT -d 127.0.2.6/32 -i lo -j DROP
-A INPUT -d 127.0.2.7/32 -i lo -p tcp -j TARPIT --tarpit 
-A INPUT -d 127.0.2.8/32 -i lo -p tcp -j TARPIT --honeypot 
-A INPUT -d 127.0.2.9/32 -i lo -p tcp -j TARPIT --reset 
-A INPUT ! -d 127.0.2.0/24 -i lo -j ACCEPT

do tego z podanych wyżej reguł (kila postów wyżej) usunąć wyłączenie interfesju lo, i wszystko testujesz na localhoście.

Albo virtualbox czy kvm - tam interfejs vboxnet0 lub tap, i z maszyny wirtualnej testujesz gospodarza, albo odwrotnie.
Bułka z masłem jednym słowem ;)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#12  2013-06-26 08:07:50

  czater - Użytkownik

czater
Użytkownik
Zarejestrowany: 2008-03-24

Re: Prosty firewall zabezpieczający stronę www

Dziękuje za wskazówki, pozmieniałem trochę i publikuję kolejną wersję. Może przyda się komuś.

Kod:

#!/bin/sh
IPTABLES=/sbin/iptables
$IPTABLES -F

$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD DROP

# zezwolenie na ruch dla interfejsow petli zwrotnej
$IPTABLES -I INPUT -i lo -j ACCEPT
$IPTABLES -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

$IPTABLES -A INPUT -p tcp -i eth0 --dport 20002 --sport 1024:65535 -m state --state NEW -j ACCEPT

$IPTABLES -A INPUT –p tcp --dport 80 --syn –m limit --limit 5/s –m state --state NEW –j ACCEPT
$IPTABLES -A INPUT –p tcp --dport 443 --syn –m limit --limit 5/s –m state --state NEW –j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type 8 -m limit --limit 5/s -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type 8 -m limit --limit 5/s -j ACCEPT

$IPTABLES -A INPUT -m hashlimit -m tcp -p tcp –dport 20002 –hashlimit 1/min –hashlimit-mode srcip –hashlimit-name ssh -m state –state NEW -j ACCEPT

Ostatnio edytowany przez czater (2013-06-26 12:28:56)

Offline

 

#13  2013-06-26 17:48:01

  chmuri - [=Centos=]

chmuri
[=Centos=]
Skąd: Wrocław
Zarejestrowany: 2005-11-25
Serwis

Re: Prosty firewall zabezpieczający stronę www

csf będzie lepszym rozwiązaniem;)


[img]http://wiki.centos.org/ArtWork/Brand?action=AttachFile&do=get&target=centos-logo-light.png[/img]

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Nas ludzie lubią po prostu, a nie klikając w przyciski ;-)

[ Generated in 0.023 seconds, 17 queries executed ]

Informacje debugowania

Time (s) Query
0.00018 SET CHARSET latin2
0.00004 SET NAMES latin2
0.00178 SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.129.26.92' WHERE u.id=1
0.00101 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.129.26.92', 1714082268)
0.00054 SELECT * FROM punbb_online WHERE logged<1714081968
0.00109 DELETE FROM punbb_online WHERE ident='18.217.84.171'
0.00082 DELETE FROM punbb_online WHERE ident='18.226.166.214'
0.00083 DELETE FROM punbb_online WHERE ident='185.191.171.2'
0.00091 DELETE FROM punbb_online WHERE ident='54.36.148.185'
0.00090 DELETE FROM punbb_online WHERE ident='54.36.148.85'
0.00096 DELETE FROM punbb_online WHERE ident='85.208.96.199'
0.00172 SELECT topic_id FROM punbb_posts WHERE id=235685
0.00225 SELECT id FROM punbb_posts WHERE topic_id=23803 ORDER BY posted
0.00104 SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=23803 AND t.moved_to IS NULL
0.00007 SELECT search_for, replace_with FROM punbb_censoring
0.00245 SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=23803 ORDER BY p.id LIMIT 0,25
0.00149 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=23803
Total query time: 0.01808 s