Próbowałem napisać zasady zabezpieczania serwera WWW za pomocą protokołu http / https, aktualizacji apt-get, wysyłania poczty SSH. Do tej pory zrobiłem to:
IPT=/sbin/iptables
$IPT -F
$IPT -X
$IPT -t nat -F
$IPT -t nat -X
$IPT -t mangle -F
$IPT -t mangle -X
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT DROP
#
$IPT -A INPUT -m state --STATE ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -m state --STATE ESTABLISHED,RELATED -j ACCEPT
#
# Allow All for SSH
$IPT -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
$IPT -A OUTPUT -o eth0 -p tcp --sport 22 -j ACCEPT
$IPT -A OUTPUT -o eth0 -p tcp --dport 22 -j ACCEPT
#
# Allow all for HTTP / HTTPS
$IPT -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
#
# Allow loopback traffic
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
#
# Allow to be pinged ( Outside => srv )
$IPT -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
$IPT -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
#
# Allow outgoing DNS connections
$IPT -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
$IPT -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT
#
# Apt-get
$IPT -A OUTPUT -p tcp --dport 80 --sport 32786:61000 -j ACCEPT
$IPT -A INPUT -p tcp --dport 80 --sport 32786:61000 -j ACCEPT
$IPT -A OUTPUT -p tcp --dport 32786:61000 --sport 80 -j ACCEPT
$IPT -A INPUT -p tcp --dport 32786:61000 --sport 80 -j ACCEPT
#
# SMTP Outgoing
$IPT -A OUTPUT -p tcp --sport 1024:65535 -d 0/0 --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPT -A INPUT -p tcp -s 0/0 --sport 25 --dport 1024:65535 -m state --state ESTABLISHED-j ACCEPT
#
# Prevent DoS
#$IPT -A INPUT -p tcp --dport 80 -m limit --limit 60/minute --limit-burst 150 -j ACCEPT
$IPT -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 100 --connlimit-mask 32 -j REJECT --reject-with tcp-reset
#
# Log dropped packets
$IPT -N LOGGING
$IPT -A INPUT -j LOGGING
$IPT -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7
$IPT -A LOGGING -j DROP
#
$IPT -L
Ale wygląda na to, że coś przeoczyłem dla wychodzącego SSH do pracy ( od tego serwera do pilota, w inny sposób działa), ale nie mogę znaleźć co. Próbowałem także ssh miejsca docelowego, wpisując adres IP na wypadek, gdyby niektóre elementy DNS zostały zablokowane, ale to też nie działało.
Jestem prawie pewien, że te reguły są przyczyną, dla której nie działa, ponieważ działa dobrze, jeśli spróbuję spłukać i zaakceptować wszystko.
Oto wyjście iptables -L -n:
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 state NEW,ESTABLISHED
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:443 state ESTABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 8
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp spt:53
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spts:32786:61000 dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:80 dpts:32786:61000
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:25 dpts:1024:65535 state ESTABLISHED
REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 #conn/32 > 100 reject-with tcp-reset
LOGGING all -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:80 state ESTABLISHED
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 state NEW,ESTABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 0
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spts:32786:61000 dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:80 dpts:32786:61000
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spts:1024:65535 dpt:25 state NEW,ESTABLISHED
Chain LOGGING (1 references)
target prot opt source destination
LOG all -- 0.0.0.0/0 0.0.0.0/0 limit: avg 2/min burst 5 LOG flags 0 level 7 prefix `IPTables Packet Dropped: '
DROP all -- 0.0.0.0/0 0.0.0.0/0
Odpowiedzi:
Gdy masz połączenie wychodzące, port docelowy będzie wynosił 22, więc powinna to być reguła:
Ponadto powinieneś mieć jedną regułę do zakrycia
ESTABLISHED
iRELATED
na łańcuchachINPUT
iOUTPUT
:Mam nadzieję że to pomoże.
źródło
iptables -L -n
i opublikować pytanie?INPUT
iOUTPUT
łańcuchy powinny byćESTABLISHED,RELATED
zasady, ale nie widzę go tam. Mogłem bardzo coś przeoczyć (jeszcze nie jadłem śniadania!).Reguła dotycząca wychodzącego ruchu SSH nie zawiera
NEW
instrukcji wymaganej do inicjowania połączeń wychodzących.źródło
Jest to klasyczny błąd, gdy nie rozumiesz architektury klient-serwer i „stanowych zapór ogniowych”
W architekturze klient-serwer jedynym znanym a priori portem jest port docelowy, ponieważ klient wybiera efemeryczne porty 1 , z wyjątkiem bardzo rzadkich wyjątków, takich jak na przykład DHCP.
Z punktu widzenia zapory ogniowej każdy wyrzucony z niej pakiet ma stan NOWOŚĆ, szczególnie w połączeniach TCP. 2)
Najpierw zobaczmy, co mamy
Więc dla mnie potrzebujesz tej zapory ogniowej
Mam nadzieję, że było to pomocne. I przepraszam za mój angielski, to nie jest mój język ojczysty.
źródło
Dla najprostszych reguł (na razie stan ignorowania):
To powinno załatwić sprawę. gdy spróbujesz i odniesiesz sukces, możesz go zmodyfikować, aby zawierał stan, źródłowe / docelowe adresy IP, różne porty.
źródło