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!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Witam,
Posiadam serwer na platformie proxmox. Zrobiłem sobie firewalla na przykładzie:
http://toniemy.org.pl/2009/12/14/firewall-dla-proxmox-a/
Działa poprawnie, na serwerze zainstalowanego mam najnowszego nginxa, config podstawowy, przesiadłem się na niego z apache2 ponieważ "gasili" mi strone. Nie wiem dokładnie w jaki sposób ale wiem napewno że to od strony serwera a nie skryptów php, na nginixie jest to samo, wiec moje pytanie jak zabezpieczyć strone (nginx'a) przed niepożądanymi pakietami?
Offline
Zależy, co to znaczy "gasili mi stronę".
Jakieś logi byłyby mile widziane (z tego gaszenia strony).
I w miarę możliwości opis samego zdarzenia, czy klęka sam Nginx, czy cały VPS (maszyna virtualna, którą dzierżawisz.).
Tak na goraco, Nginx ma limity per/IP, do tego w iptables są takie narzędzia, jak [b]limit[/b], [b]connlimit[/b] i [b]hashlimit[/b].
Tu masz conieco o zabezpieczaniu Nginxa:
http://www.cyberciti.biz/tips/linux-unix-bsd-nginx-webserver-security.html
http://wiki.nginx.org/HttpLimitConnModule
http://wiki.nginx.org/HttpLimitReqModule
http://wiki.nginx.org/Modules
Dodatkowo - żaden serwer po samej instalacji nie jest całkowicie bezpieczny, każdy trzeba skonfigurować, i z każdym jest przy tym trochę roboty.
Tak samo firewall:
http://pl.wikibooks.org/wiki/Sieci_w_Linuksie/Netfilter/iptables
A tutaj elementarz (do Gentoo, ale 85% treści jest wspólne we wszystkich Linuxach):
http://www.gentoo.org/doc/pl/security/security-handbook.xml
Pozdrawiam
;-)
Ostatnio edytowany przez Jacekalex (2012-04-13 01:02:12)
Offline
dzieki wielkie #Jacekalex ;) takich materiałów właśnie trzeba mi było, jak się z nimi uporam i dalej będzie coś nie tak bedę pisał dalej ;)
Offline
mam następny problem z firewallem, gdy go uruchamiam nie mam możliwości ściągania niczego na serwer wgetem itd.
odszukałem w google że należy edytować plik /etc/sysctl.conf i tak też zrobiłem, ustawiłem:
net.ipv4.ip_local_port_range = 60000 65000
w firewallu odblokowałem zakres portów od 60000 do 65000 dla maszyny głównej i wirtualnych VPS, ale niestety ściągać wget mogę tylko na głównej maszynie a na wirtualnych nadal nie, gdy ten sam plik edytuje na wirtualnych wyskakuje mi:
"error:permission deniedonkey 'net.ipv4.ip_local_port_range'"
znalazłem na maszynie głównej /etc/sysctl/vzctl.conf i tam także dodałem ip_loal_port_range ale to nic nie pomaga ;/
firewall:
#!/bin/bash source /etc/firewall.d/hostnode.conf purge() { echo -n "Firewall: czyszczenie ustawien" iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P INPUT ACCEPT iptables -F iptables -Z iptables -X iptables -F -t mangle echo } setup() { echo -n "Firewall: ustawienie polityki" iptables -P INPUT DROP iptables -P FORWARD DROP iptables -I INPUT -p icmp -j ACCEPT iptables -I FORWARD -p icmp -j ACCEPT # Przepuszczamy ruch DNS iptables -I FORWARD -j ACCEPT --protocol tcp --destination-port 53 iptables -I FORWARD -j ACCEPT --protocol udp --destination-port 53 iptables -I INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED iptables -I FORWARD -j ACCEPT -m state --state ESTABLISHED,RELATED # Dajemy pełny dostęp dla wirtualek KVM ##################################### echo -n "KVM!!!!!!!!!!!!!!!!" iptables -I FORWARD -j ACCEPT --source xx iptables -I FORWARD -j ACCEPT --destination xx ##################################### # Dajemy pełny dostęp dla wirtualek KVM iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT iptables -I INPUT -j ACCEPT -i lo echo "Firewall: ustawianie mastera" for port in $TCPPORTS ; do echo -n " tcp port $port" iptables -I INPUT -j ACCEPT -d $IP --protocol tcp --destination-port $port echo done for port in $UDPPORTS ; do echo -n " upd port $port" iptables -I INPUT -j ACCEPT -d $IP --protocol udp --destination-port $port echo done for ip in $DMZS ; do echo -n " DMZ $ip" iptables -I INPUT -i vmbr0 -j ACCEPT -s $ip iptables -I FORWARD -i vmbr0 -j ACCEPT -s $ip echo done #ograniczenie logowan ssh iptables -N ssh_blocked iptables -A ssh_blocked -d $IP -m recent --name sshd --rcheck --hitcount 2 --seconds 60 -j REJECT --reject-with icmp-host-unreachable iptables -A ssh_blocked -d $IP -m recent --name sshd --update iptables -A ssh_blocked -d $IP -m recent --name sshd --rcheck -j ACCEPT iptables -A ssh_blocked -d $IP -m recent --name sshd --set iptables -A ssh_blocked -d $IP -j ACCEPT iptables -A INPUT -d $IP -p tcp --dport 22 --syn -m state --state NEW -j ssh_blocked #SNAT dla virtualek (mozemy sobie walnac jakas wewnetrzna siec dla potrzeb np HAProxy) echo 'snat odpalony' iptables -t nat -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source $IP #awk '/IP_ADDRESS/ {print substr($1,13,length($1)-13)}' /etc/firewall.d/*.fw > firewall.txt #awk '/IP_ADDRESS/ {print substr($0,13,length($0)-13)}' /etc/vz/conf/*.conf > temp.txt #for i in `cat firewall.txt` #do #egrep -v ^$i$ temp.txt > newfile2.txt #cat newfile2.txt | sort -u > temp1.txt #rm -f firewall.txt #rm -f newfile2.txt #mv temp1.txt temp.txt #done #echo #echo "ustawienia pelnego dostepu dla virtualek" #for i in `cat temp.txt` #do #echo " Pelny dostep dla $i" #iptables -I FORWARD -j ACCEPT --source $i #iptables -I FORWARD -j ACCEPT --destination $i #rm -f temp.txt #done CTSETUPS=`echo /etc/firewall.d/*.fw` if [ "$CTSETUPS" != "/etc/firewall.d/*.fw" ] ; then echo echo "Firewall: ustawienia polityki dla vitualek" for i in $CTSETUPS ; do . $i echo -n " $CTNAME CT$CTID" if [ -n "$BANNED" ]; then for source in $BANNED ; do iptables -I FORWARD -j DROP --destination $IP_ADDRESS --source $source ; done fi if [ -n "$TCPPORTS" ]; then for port in $TCPPORTS ; do iptables -I FORWARD -j ACCEPT --protocol tcp --destination $IP_ADDRESS --destination-port $port ; done fi if [ -n "$UPDPORTS" ]; then for port in $UDPPORTS ; do iptables -I FORWARD -j ACCEPT --protocol udp --destination $IP_ADDRESS --destination-port $port ; done fi if [ -n "$DMZS" ]; then for source in $DMZS ; do iptables -I FORWARD -j ACCEPT --protocol tcp --destination $IP_ADDRESS --source $source ; done for source in $DMZS ; do iptables -I FORWARD -j ACCEPT --protocol udp --destination $IP_ADDRESS --source $source ; done fi #Limity dla polaczen (mozna przerobic pod porty) if [ -n "$LIMITS" ]; then for limity in $LIMITS ; do iptables -t filter -I FORWARD -p tcp -d $IP_ADDRESS -m connlimit --connlimit-above $limity --connlimit-mask 32 -j REJECT ; done fi #Limity DNS iptables -t filter -I FORWARD -p tcp --dport 53 -d $IP_ADDRESS -m connlimit --connlimit-above 10 --connlimit-mask 32 -j REJECT [ $? -eq 0 ] echo done fi } case "$1" in start) echo "Fiewall wlaczony" purge setup ;; stop) echo "Firewall wylaczony" purge ;; restart) $0 stop $0 start ;; status) iptables -n -L ;; *) echo "Usage: $0 " ;; esac
sysctl.conf:
# Avoid a smurf attack net.ipv4.icmp_echo_ignore_broadcasts = 1 # Turn on protection for bad icmp error messages net.ipv4.icmp_ignore_bogus_error_responses = 1 # Turn on syncookies for SYN flood attack protection net.ipv4.tcp_syncookies = 1 # Turn on and log spoofed, source routed, and redirect packets net.ipv4.conf.all.log_martians = 1 net.ipv4.conf.default.log_martians = 1 # No source routed packets here net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 # Turn on reverse path filtering net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 # Make sure no one can alter the routing tables net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.secure_redirects = 0 net.ipv4.conf.default.secure_redirects = 0 # Don't act as a router net.ipv4.ip_forward = 1 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 # Turn on execshild kernel.exec-shield = 1 kernel.randomize_va_space = 1 # Tuen IPv6 net.ipv6.conf.default.router_solicitations = 0 net.ipv6.conf.default.accept_ra_rtr_pref = 0 net.ipv6.conf.default.accept_ra_pinfo = 0 net.ipv6.conf.default.accept_ra_defrtr = 0 net.ipv6.conf.default.autoconf = 0 net.ipv6.conf.default.dad_transmits = 0 net.ipv6.conf.default.max_addresses = 1 # Optimization for port usefor LBs # Increase system file descriptor limit fs.file-max = 65535 # Allow for more PIDs (to reduce rollover problems); may break some programs 32768 kernel.pid_max = 65536 # Increase system IP port limits net.ipv4.ip_local_port_range = 60000 65000 # Increase TCP max buffer size setable using setsockopt() net.ipv4.tcp_rmem = 4096 87380 8388608 net.ipv4.tcp_wmem = 4096 87380 8388608 # Increase Linux auto tuning TCP buffer limits # min, default, and max number of bytes to use # set max to at least 4MB, or higher if you use very high BDP paths # Tcp Windows etc net.core.rmem_max = 8388608 net.core.wmem_max = 8388608 net.core.netdev_max_backlog = 5000 net.ipv4.tcp_window_scaling = 1
Ostatnio edytowany przez zomb (2012-04-19 16:44:29)
Offline
OpenVZ to nie jest samodzielny serwer, ani nawet wirtualka z własnym jajem, żebyś sam sobie ustawiał sysctl.
To jest zwykły chroot na sterydach, tam jajem zarządza admin maszyny głównej, a nie userzy wirtualek.
A jak wget nie działa, to znaczy, że coś przekombinowałeś, pokaż:
iptables -S iptables -t nat -S iptables -t mangle -S
To by było na tyle
;-)
Offline
Prosze:
root@:~# iptables -S -P INPUT DROP -P FORWARD DROP -P OUTPUT ACCEPT -N ssh_blocked -A INPUT -d (IP_GLOWNE)/32 -p udp -m udp --dport 53 -j ACCEPT -A INPUT -d (IP_GLOWNE)/32 -p tcp -m tcp --dport 60000:65000 -j ACCEPT -A INPUT -d (IP_GLOWNE)/32 -p tcp -m tcp --dport 443 -j ACCEPT -A INPUT -d (IP_GLOWNE)/32 -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -d (IP_GLOWNE)/32 -p tcp -m tcp --dport 53 -j ACCEPT -A INPUT -d (IP_GLOWNE)/32 -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -d (IP_GLOWNE)/32 -p tcp -m tcp --dport 21 -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -d (IP_GLOWNE)/32 -p tcp -m tcp --dport 22 --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j ssh_blocked -A FORWARD -d (IP_VPS1)/32 -p tcp -m tcp --dport 53 -m connlimit --connlimit-above 10 --connlimit-mask 32 -j REJECT --reject-with icmp-port-unreachable -A FORWARD -d (IP_VPS1)/32 -p tcp -m connlimit --connlimit-above 40 --connlimit-mask 32 -j REJECT --reject-with icmp-port-unreachable -A FORWARD -d (IP_VPS1)/32 -p tcp -m tcp --dport 22 -j ACCEPT -A FORWARD -d (IP_VPS1)/32 -p tcp -m tcp --dport 60000:65000 -j ACCEPT -A FORWARD -d (IP_VPS1)/32 -p tcp -m tcp --dport 21 -j ACCEPT -A FORWARD -m physdev --physdev-is-bridged -j ACCEPT -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT -A FORWARD -p udp -m udp --dport 53 -j ACCEPT -A FORWARD -p tcp -m tcp --dport 53 -j ACCEPT -A FORWARD -p icmp -j ACCEPT -A ssh_blocked -d (IP_GLOWNE)/32 -m recent --rcheck --seconds 60 --hitcount 2 --name sshd --rsource -j REJECT --reject-with icmp-host-unreachable -A ssh_blocked -d (IP_GLOWNE)/32 -m recent --update --name sshd --rsource -A ssh_blocked -d (IP_GLOWNE)/32 -m recent --rcheck --name sshd --rsource -j ACCEPT -A ssh_blocked -d (IP_GLOWNE)/32 -m recent --set --name sshd --rsource -A ssh_blocked -d (IP_GLOWNE)/32 -j ACCEPT root@:~# iptables -t nat -S -P PREROUTING ACCEPT -P POSTROUTING ACCEPT -P OUTPUT ACCEPT -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) -A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE) root@:~# iptables -t mangle -S -P PREROUTING ACCEPT -P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -P POSTROUTING ACCEPT
zauważyłem jedną rzecz, jeżeli dodam do firewalla:
iptables -I FORWARD -j ACCEPT --source (IP_VPS)
wtedy wget itd dziala prawidłowo i ogólnie wszystko tak jak ma być poza małym wyjątkiem, wszystkie maszyny wirtualne "widzą siebie nawzajem" i mają do siebie pełny dostęp, czyli np blokuje port 80 na VPS1 i nie ma do niego dostępu z zewnątrz serwera, ale już z VPS2 jest dostęp ;/
Offline
-A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE)
Jedna regułka nie wystarzczy?
Jeśli
iptables -I FORWARD -j ACCEPT --source (IP_VPS)
Otwiera wyjście, ale daje za duże uprawnienia, to może:
iptables -I FORWARD --source (IP_VPS) -o {interfejs-zewn} -j ACCEPT
załatwi sprawę?
Offline
[quote=Jacekalex]
-A POSTROUTING -s 192.168.254.0/24 -j SNAT --to-source (IP_GLOWNE)
Jedna regułka nie wystarzczy?[/quote]
wystarczy i przecież w sumie w firewallu mam jedna, nie wiem dlaczego tak sie to robi.
zamieniłem na
iptables -I FORWARD --source (IP_VPS) -o {interfejs-zewn} -j ACCEPT
ale blokuje wgeta, za {interfejs-zewn} próbowałem eth0 i venet0
Offline
Reguł firewalla masz z pól metra, i coś blokuje połączenia?
Ciekawe, co?
Spróbuj debugować firewalla przez moduł TRACE (tablica raw) i zobacz w logach, na którym łańcuchu/reugule się to blokuje.
Tu masz przykład, jak to zrobić:
http://serverfault.com/questions/78240/debugging-rules-in-iptables
Poza tym, jak stawiasz firewalla, to dodajesz po dwie/trzy regułki, i patrzyssz, czy działa jak powinno.
Bo masz w tych regułach taką choinkę, że trza by wróżki, żeby wyczaić, co się w tej choince dzieje. ;)
Ostatnio edytowany przez Jacekalex (2012-04-19 20:50:54)
Offline
okej, zrobię tak jak mówisz, zacznę sklejać tego firewalla linijka po linijce i zobaczymy co z tego wyjdzie,
mówisz że
iptables -I FORWARD --source (IP_VPS) -o {interfejs-zewn} -j ACCEPT
powinno śmigać? co powinienem umieścić w interfejsie zewnętrznym? eth0 czy venet0 ?
Offline
Musisz trochę popróbować.
Ja z tego firewalla w ogóle nie czaję, czy akcja jest na maszynie wirtualnej, czy na systemie gospodarza.
W każdym razie wyjściowy interfejs to ten, który dostarcza net dla systemu, na którym dodajesz regułę, i na którym to ma działać ("to" oznacza tutaj np wgeta).
wtedy wget itd dziala prawidłowo i ogólnie wszystko tak jak ma być poza małym wyjątkiem,[b] wszystkie maszyny wirtualne "widzą siebie nawzajem" i mają do siebie pełny dostęp[/b], czyli np blokuje port 80 na VPS1 i nie ma do niego dostępu z zewnątrz serwera, ale już z VPS2 jest dostęp ;/[/quote]
Co to takiego?
Bo ja bym na tych wirtualkach poustawiał firewalle, OpenVZ daje taką możliwość.
Bo jak chcesz ustawić wszystko dla wirtualek na systemie głównym, to już nie będzie firewall tylko rękodzieło artystyczne :DOstatnio edytowany przez Jacekalex (2012-04-19 20:48:38)
W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem para bellum ;) | Pozdrawiam :)
Offline
firewall działa na systemie gospodarza i to jak dla mnie i zastosowania serwera wygodne rozwiązanie.
wtedy wget itd dziala prawidłowo i ogólnie wszystko tak jak ma być poza małym wyjątkiem,[b] wszystkie maszyny wirtualne "widzą siebie nawzajem" i mają do siebie pełny dostęp[/b], czyli np blokuje port 80 na VPS1 i nie ma do niego dostępu z zewnątrz serwera, ale już z VPS2 jest dostęp ;/[/quote]
tutaj chodzi o to, że:
załóżmy że dodam: iptables -I FORWARD -j ACCEPT --source (IP_VPS) i włączę firewalla i blokuje np port 21 to z zewnątrz czyli np dla mnie czy dla Ciebie ten port 21 jest zamknięty i nie można się na niego dostać ale np z drugiej maszyny wirtualnej na serwerze już ten port jest otwarty i można nie niego wejść
Offline
poradziłem sobie z firewallem ;) wielkie dzieki za pomoc ;)
Ostatnio edytowany przez zomb (2012-04-22 22:34:48)
Offline
Time (s) | Query |
---|---|
0.00014 | SET CHARSET latin2 |
0.00006 | SET NAMES latin2 |
0.00148 | 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='13.58.45.238' WHERE u.id=1 |
0.00113 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '13.58.45.238', 1732755297) |
0.00082 | SELECT * FROM punbb_online WHERE logged<1732754997 |
0.00107 | SELECT topic_id FROM punbb_posts WHERE id=200452 |
0.00015 | SELECT id FROM punbb_posts WHERE topic_id=21083 ORDER BY posted |
0.00072 | 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=21083 AND t.moved_to IS NULL |
0.00007 | SELECT search_for, replace_with FROM punbb_censoring |
0.00317 | 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=21083 ORDER BY p.id LIMIT 0,25 |
0.00113 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=21083 |
Total query time: 0.00994 s |