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,
zainstalowałem sobie Debiana 6 i chciałbym go wykorzystać jako router dla malutkiej sieci osiedlowej (max 20 urządzeń).
Chciałbym aby internet udostępniany był zarówno z autoryzacją pppoe jak i bez niej (gdyż cześć urządzeń nie obsługuje PPPoE - telefony, tunery itp...).
Skompilowałem kernel 2.6.32 z obsługą IMQ aby móc dzielić łącze (skrypt htb) wszystkim użytkownikom (interfejsy ppp+ oraz eth1)
Jako, że ostatnio dostałem pismo od operatora informując mnie iż z mojego adresu IP rozsyłany jest spam postanowiłem zablokować port 25.
zakres IP klientow - 192.168.0.100-192.168.0.150
adresy IP klientow PPPoE - 10.0.0.100-10.0.0.150
interfejs eth0 - internet
interfejs eth1 - lan, uruchomiony pppoe-server
Czy w ogóle prawidłowe jest założenie, że pppoe oraz sieć lan działać będą na tym samym interfejsie? W dokumentacji pppoe-server zalecają ustawić adres interfejsu 0.0.0.0 - ale wtedy musiałbym dokładać trzecią kartę sieciową dla użytkowników nie autoryzujących się pppoe.
Korzystając z mojej niewielkiej wiedzy napisałem sobie poniższy skrypcik. Sprawdzałem go już i wydaje się działać poprawnie, jednak linuxa dopiero poznaję, proszę więc o przejrzenie tego skryptu czy nie ma w nim jakiś oczywistych błędów - przede wszystkim chodzi o kolejność reguł.
Pozdrawiam, Krzysiek
#!/bin/bash ### BEGIN INIT INFO # Provides: firewall # Required-Start: $syslog $network # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: ### END INIT INFO . /lib/lsb/init-functions case "$1" in start|restart) log_daemon_msg "Starting firewall..." "iptables" # Czysczenie starych regul iptables -t filter -F iptables -t filter -X iptables -t nat -X iptables -t nat -F iptables -t mangle -F iptables -t mangle -X # Ustawienie domyslnej polityki iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # Zezwolenie na polaczenia SSH, ICMP, DHCP, ESTABLISHED, RELATED, LOOPBACK iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p icmp -j ACCEPT iptables -A INPUT -i eth1 -p udp --dport 67:68 -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -i lo -j ACCEPT # Zablokowanie polaczen na port 25 iptables -A FORWARD -p tcp --dport 25 -j ULOG --prefix-ulog SPAM iptables -A FORWARD -p tcp --dport 25 -j DROP # Logowanie polaczen wychodzacych iptables -A FORWARD -o eth0 -m state --state NEW -j ULOG # Udostepnianie polaczenia internetowego modprobe ip_nat_ftp iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -s 10.0.0.0/24 -j ACCEPT iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE # Markowanie pakietow wychodzacych (uzywane przez htb) for IP in {100..150} do iptables -t mangle -A POSTROUTING -s 10.0.0.$IP -j MARK --set-mark 1$IP iptables -t mangle -A POSTROUTING -s 192.168.0.$IP -j MARK --set-mark 2$IP done # Przekierowanie ruchu wchodzacego na imq0 (uzywane przez htb) iptables -t mangle -A POSTROUTING -d 10.0.0.0/24 -j IMQ --todev 0 iptables -t mangle -A POSTROUTING -d 192.168.0.0/24 -j IMQ --todev 0 log_end_msg 0 ;; stop) log_daemon_msg "Stopping firewall..." "iptables" # Czysczenie starych regul iptables -t filter -F iptables -t filter -X iptables -t nat -X iptables -t nat -F iptables -t mangle -F iptables -t mangle -X # Ustawienie domyslnej polityki iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT log_end_msg 0 ;; esac exit 0
Ostatnio edytowany przez gumis (2011-06-18 01:26:43)
Offline
Zakładam, że o takim detalu jak włączenie forwardowania pakietów pamiętałeś ;).
Ilu adminów tyle firewali na linuksie i każdy ma swoje podejście do tematu.
Uważam, że firewall na routerze powinien być możliwie mało restrykcyjny. Po co np uwalać pakiety przychodzące (INPUT) na interfejsie LAN? Jest to strefa zaufana więc po co sobie życie utrudniać.
natomiat to jest dla mnie zagadka
iptables -A FORWARD -p tcp --dport 25 -j ULOG --prefix-ulog SPAM iptables -A FORWARD -p tcp --dport 25 -j DROP
tzn nie masz zamiaru poczty wysyłać?
Zamiast logować każdy pakiet użyj modułu limit. Możesz wtedy np przepuścić pierwsze 10 połączeń a każde następne uwalać - w końcu nikt normalny więcej nie wysyła.
Offline
[quote=bobycob]Zakładam, że o takim detalu jak włączenie forwardowania pakietów pamiętałeś ;).[/quote]
Mam ustawione net.ipv4.ip_forward=1 w sysctl.conf jeśli to masz na myśli.
[quote=bobycob]tzn nie masz zamiaru poczty wysyłać?[/quote]
Teraz to chyba wszystkie serwery nasłuchują też na porcie 587, więc sobie zmienią port :)
Offline
Odkopie temat żeby nie zakładać tego samego tytułu który i tak się powtarza z prośbą o sprawdzenie i ewentualne sugestie z naciskiem na bezpieczeństwo i anty-szpiegowanie:
sudo iptables -F ; sudo iptables -X; sudo iptables -F -t nat; sudo iptables -X -t nat; sudo iptables -F -t filter; sudo iptables -X -t filter; sudo iptables -P INPUT DROP; sudo iptables -P FORWARD DROP; sudo iptables -P OUTPUT DROP; sudo iptables -A INPUT -i lo -j ACCEPT; sudo iptables -A INPUT -m state --state INVALID -j DROP; sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT; sudo iptables -A INPUT -p tcp -i eth0 -j REJECT --reject-with tcp-reset; sudo iptables -A INPUT -p udp -i eth0 -j REJECT --reject-with icmp-port-unreachable; sudo iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT --reject-with icmp-host-unreachable; sudo iptables -A INPUT -s 127.0.0.1 -j ACCEPT; sudo iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH ACK -j LOG --log-prefix "ACK scan: "; sudo iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH ACK -j DROP; # Metoda ACK (nmap -sA) sudo iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH FIN -j LOG --log-prefix "FIN scan: "; sudo iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH FIN -j DROP; # Skanowanie FIN (nmap -sF) sudo iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH PSH -j LOG --log-prefix "Xmas scan: "; sudo iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH FIN,URG,PSH -j DROP; # Metoda Xmas Tree (nmap -sX) sudo iptables -A INPUT -m conntrack --ctstate INVALID -p tcp ! --tcp-flags SYN,RST,ACK,FIN,PSH,URG SYN,RST,ACK,FIN,PSH,URG -j LOG --log-prefix "Null scan: "; sudo iptables -A INPUT -m conntrack --ctstate INVALID -p tcp ! --tcp-flags SYN,RST,ACK,FIN,PSH,URG SYN,RST; sudo iptables -N syn-flood; sudo iptables -A INPUT -p tcp --syn -j syn-flood; sudo iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN; sudo iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j LOG --log-prefix "SYN-flood: "; sudo iptables -A syn-flood -j DROP; sudo iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j LOG --log-prefix "Ping: "; sudo iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT; # Ping of death sudo iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT --reject-with icmp-host-unreachable; sudo iptables -A OUTPUT -p tcp --dport telnet -j REJECT; sudo iptables -A INPUT -p tcp --dport telnet -j REJECT; sudo iptables -A FORWARD -m state --state INVALID -j DROP; sudo iptables -A OUTPUT -m state --state INVALID -j DROP; sudo iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT; sudo iptables -A OUTPUT -p tcp -m multiport --dports 20,80,443 --syn -m state --state NEW -j ACCEPT; sudo iptables -A OUTPUT -p udp --dport 53 -m state --state NEW -j ACCEPT; sudo iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT;;
Offline
wywalił bym tę linię:
[quote=macios4x]
sudo iptables -A INPUT -s 127.0.0.1 -j ACCEPT;
[/quote]
zasadniczo loopback masz otwarty tym:
[quote=macios4x]
sudo iptables -A INPUT -i lo -j ACCEPT;
[/quote]
a podając konkretny IPek bez interfejsu ktoś może podrobić pakiety
Offline
a podając konkretny IPek bez interfejsu ktoś może podrobić pakiety[/quote]
co masz konkretnie na myśli? co jest nie tak?
Zwolennik Open Source, użytkownik Arch, Debian
Offline
Trochę ssie ten fw. xD
sudo iptables -A INPUT -p tcp -i eth0 -j REJECT --reject-with tcp-reset; sudo iptables -A INPUT -p udp -i eth0 -j REJECT --reject-with icmp-port-unreachable;
Przecie to ci zrzuci wszystkie połączenia NEW z automatu. i wszstkie inne reguły odnoszące się do otwierania portów nie mają sensu.
Dalej, tam masz te regułki od skanów, je można zastąpić jedną:
iptables -t filter -A INPUT -p tcp ! --syn -m conntrack --ctstate NEW -j DROP -m comment --comment "Connections not started by SYN"
Czyli wszystkie połączenia w stanie NEW nie mające flagi SYN. Ta powyższa regułka + zrzucanie INVALID powinno wystarczyć, nie wiem czy coś extra jeszcze trzeba.
Zamiast się bawić w ten synflod w iptables, to sobie zaprzęgnij kernelowski mechanizm od ciastek, z grubsza to by było:
net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 128 net.core.somaxconn = 128
w sysctl i limituj połączenia bezpośrednio na portach jeśli już potrzebujesz. Jak coś przeczytaj sobie ten mój sysctl, może coś dopiszesz sobie i znajdziesz bugi. xD Tutaj masz linka https://github.com/morfikov/sysctl.conf/blob/master/sysctl.conf
Z tego co tam kiedyś czytałem, wszystkie nowe systemy operacyjne są odporne na ten ping of death i nie ma sensu robić reguł pod to.
Przy ftpie brakuje ci jeszcze portu 21, samo 20 nie wystarcza.
Poza tym to "ja tam widzę niezły burdel". xD
Offline
Gdzieś tego skrypta wytargał?
Jeśli ktoś Ci go doradził, to daj mu w pysk, a jak zapyta, za co, to popraw z drugiej strony, żeby równo puchło.
Najpierw otwierasz kilka czy kilkanaście portów, a potem dajesz domyślną politykę na ACCEPT?
Jeśli chcesz w wszystko na ACCEPT, to po co w ogóle jakiś Firewall?
Offline
@morfik
[quote=morfik]Gdzie ty tam masz domyślną politykę na accept? xD[/quote]
na zły skrypt spojrzał, w pierwszym poscie, skrypt na końcu ma zmiane polityk domyślnych na ACCEPT
Ostatnio edytowany przez ramsi1986 (2014-07-15 21:06:55)
Offline
[quote=morfik]Gdzie ty tam masz domyślną politykę na accept? xD[/quote]
Zmień okulistę:
Kod:
.... # Ustawienie domyslnej polityki iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT log_end_msg 0[/quote]
W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem para bellum ;) | Pozdrawiam :)
Offline
@Jacekalex,
ale i tak źle doczytałeś, tam zmieniają się domyślne polityki na ACCEPT tylko jak odpalisz skrypt z opcją "stop"
Offline
Faktycznie nie doczytałem. ;)
jedna uwaga:
Robienie takich skryptów do inita, to idiotyzm totalny.
Do iptables robi się przykładowo tak:
start { /sbin/iptables-restore < /var/lib/iptables/saved.rules } stop { /sbin/iptables-save > /var/lib/iptables/saved.rule }
Wtedy przy zatrzymaniu systemu zapisuje aktywne reguły do pliku, przy uruchamianiu odtwarza reguły.
W Debianie to można ustawić w [b]/etc/network/interfaces[/b] funkcjami pre-up i if-post-down.
I przy okazji, nigdy nie należy otwierać firewalla, w przypadku kłopotów, bo to może jeszcze powiększyć kłopoty, wystarczy wiedzieć, co się robi w systemie. :D
Tutaj macie listę amatorów (z ostatnich kilku godzin), polujących na każdego lamera, który w przypadku problemu otworzył FW na oścież:
177.20.146.11 timeout 361 60.13.188.190 timeout 76731 61.174.51.219 timeout 2652 104.151.13.143 timeout 65215 116.10.191.218 timeout 81997 216.99.152.14 timeout 1697 125.46.54.253 timeout 648 104.151.13.137 timeout 1186
To by było na tyle
;-)
Ostatnio edytowany przez Jacekalex (2014-07-16 01:16:00)
Offline
Wtedy przy zatrzymaniu systemu zapisuje aktywne reguły do pliku, przy uruchamianiu odtwarza reguły.[/quote]
Co za różnica czy ktoś sobie będzie dodawał regułki przez terminal czy przez skrypt? Ja korzystam ze skryptu ale ja poza iptables to mam tam sporo innych rzeczy — wolę mieć wszystko w jednym miejscu. Problem z tym zapisywaniem regułek jest taki, że nie idzie komentować nic, w sensie wyłączać coś na krótko by sprawdzić jak się coś zachowa, lub trzymać pewne reguły "na później", lub zwyczajnie tworzyć sobie wzory reguł, z których np. się nie korzysta, a mogą okazać się kiedyś tam w przyszłości użyteczne. Ja mam szereg rzeczy wykomentowanych by mieć je pod ręką i nie szukać znów godzinę na necie, mam krótkie przykłady i potrafię z nich zrobić rozsądne reguły, chyba. xD
Mój skrypcio zaczyna się od:Kod:
### BEGIN INIT INFO # Provides: morfinetwork # Required-Start: mountkernfs $local_fs # Required-Stop: $local_fs # Should-Start: # Should-Stop: # Default-Start: S # Default-Stop: 0 6 # X-Start-Before: # X-Stop-After: # Short-Description: configuration for iptables, peerguardian, tc and sysctl # Description: configuration for iptables, peerguardian, tc and sysctl ### END INIT INFONo i w tym debianowym skrypcie sieciowym mam:
Kod:
### BEGIN INIT INFO # Provides: networking ifupdown # Required-Start: mountkernfs $local_fs urandom # Required-Stop: $local_fs # Should-Start: peerblock iptables-persistent ifb morfinetwork # Should-Stop: peerblock iptables-persistent ifb morfinetwork # Default-Start: S # Default-Stop: 0 6 # Short-Description: Raise network interfaces. # Description: Prepare /run/network directory, ifstate file and raise network interfaces, or take them down. ### END INIT INFODzięki czemu wszystko jest ustawiane przed podniesieniem interfejsów. No i cały skrypt ma prawie 600 linijek póki co. xD
Offline
Z kilku źródeł ten skrypt, m.in. stąd:
http://sekurak.pl/iptablespsad-jako-zaawansowany-system-wykrywania-wlaman/
wszystkich stron już nie pamiętam ale z kilku tych źródeł próbowałem coś "zlepić" z lepszym lub gorszsym skutkiem
Co zatem zmienić konkretnie w tym skrypcie aby wszystko grało? co usunąć, co zmienić?
Offline
Co zmienić? Wrzucę może kawałek mojego filtra, to sobie popatrz na regułki i góglaj, bo to tak się zbytnio nie da operować bez jakiejś wiedzy o iptables.
Tutaj masz projekt mojego filtra: http://pastebin.com/AB8xmWMW -- zbieżność adresów i portów przypadkowa. xD Pousuwałem też zbędne, wykomentowane reguły by było czytelniej trochę. Ja rozbijam strukturę filtra na szereg jednostek by nie wsadzać reguł do iptables jedna pod drogą, bo to niezbyt efektywne. Zamiast tego mam szereg stworzonych łańcuchów i są one wywoływane w określonych miejscach.
Analizuj sobie te linijki i czytaj makulaturę:
http://www.iptables.info/
https://wiki.archlinux.org/index.php/simple_stateful_firewall
Jakby ktoś miał jakieś sugestie do tego projektu, to niech pisze, przebadam all. xD
Offline
Time (s) | Query |
---|---|
0.00011 | SET CHARSET latin2 |
0.00004 | SET NAMES latin2 |
0.00130 | 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.148.108.144' WHERE u.id=1 |
0.00075 | UPDATE punbb_online SET logged=1732819094 WHERE ident='3.148.108.144' |
0.00045 | SELECT * FROM punbb_online WHERE logged<1732818794 |
0.00060 | 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=19194 AND t.moved_to IS NULL |
0.00007 | SELECT search_for, replace_with FROM punbb_censoring |
0.00292 | 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=19194 ORDER BY p.id LIMIT 0,25 |
0.00079 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=19194 |
Total query time: 0.00703 s |