[+] Router na SBC z Debianem - jak skonfigurować firewall

Zagadnienia bezpieczeństwa w systemie
kudzu
Posty: 51
Rejestracja: 19 lipca 2012, 19:54
Lokalizacja: Kraków

[+] Router na SBC z Debianem - jak skonfigurować firewall

Post autor: kudzu »

Ponieważ od dłuższego czas coś męczyło mój router z DD-WRT, a i Cubieboard w końcu szlag trafił, postanowiłem zastąpić oba sprzęty jednym i kupiłem OrangePi PC+. Mam jednak problemy z konfiguracją firewalla. Generalnie interfejsy wyglądają tak:

Kod: Zaznacz cały

# Wired adapter #1 (WAN)
auto gemini
iface gemini inet ppp
        pre-up /sbin/ip link set dev eth0 up
        provider gemini

# Wired adapter #2 (LAN)
auto eth1
iface eth1 inet static
        address 192.168.1.1
        netmask 255.255.255.0

# Wireless adapter #1 (WIFI)
auto wlan0
iface wlan0 inet static
        address 192.168.2.1
        netmask 255.255.255.0

# Local loopback
auto lo
iface lo inet loopback
I teraz z poniższą konfiguracją firewalla wszystko działa:

Kod: Zaznacz cały

#!/bin/bash
 
### BEGIN INIT INFO
# Provides:          firewall.sh
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

# czyszczenie starych regul
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X

# ustawienie domyslnej polityki
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

# utrzymanie polaczen nawiazanych
iptables -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED
iptables -A FORWARD -j ACCEPT -m state --state ESTABLISHED,RELATED
iptables -A OUTPUT -j ACCEPT -m state --state ESTABLISHED,RELATED

# maskarada
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE
iptables -A FORWARD -s 192.168.2.0/24 -j ACCEPT
Ale jak zacznę coś kombinować, np domyślnie zablokuję pakiety przychodzące, to tracę dostęp do Internetu przez eth1 i wlan0 oraz przestaje działać DHCP (dnsmasq).
Nie mogę jednak pozostawić otwartych wszystkich drzwiczek. Jak to ugryźć?

Jeżeli chodzi o moje potrzeby, to na zewnątrz potrzebuję http (port 80) i ssh, ale na innym porcie (w sieci LAN i WIFI nadal port 22).
Ostatnio zmieniony 26 września 2016, 22:33 przez kudzu, łącznie zmieniany 1 raz.
Awatar użytkownika
dedito
Moderator
Posty: 3512
Rejestracja: 18 listopada 2013, 21:07
Lokalizacja: Gliwice

Re: Router na SBC z Debianem - jak skonfigurować firewall

Post autor: dedito »

Prawdopodobnie przez brak zezwolenia dla loopback.

Kod: Zaznacz cały

# Enable loopback traffic
iptables -A INPUT  -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
Przykładowy firewall masz na https://wiki.debian.org/DebianFirewall w sekcji Example: Basic gateway machine firewall i w wielu innych miejscach Internetu szukając firewalli dla serwerów i routerów.
Przykład z cytowanej strony:

Kod: Zaznacz cały

#!/bin/sh
# This is a more complex setup, for a home firewall: 
# * One interface plug to the ISP conection (eth0). Using DHCP.
# * One interface plug to the local LAN switch (eth1). Using 192.168.0.0/24.
# * Traffic open from the LAN to the SSH in the firewall.
# * Traffic open and translated, from the local LAN to internet.
# * Traffic open from internet, to a local web server.
# * Logging of dropped traffic, using a specific ''log level'' to configure a separate file in syslog/rsyslog.

PATH='/sbin'

## INIT

# Flush previous rules, delete chains and reset counters
iptables -F
iptables -X
iptables -Z
iptables -t nat -F

# Default policies
iptables -P INPUT   DROP
iptables -P OUTPUT  DROP
iptables -P FORWARD DROP

echo -n '1' > /proc/sys/net/ipv4/ip_forward
echo -n '0' > /proc/sys/net/ipv4/conf/all/accept_source_route
echo -n '0' > /proc/sys/net/ipv4/conf/all/accept_redirects
echo -n '1' > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo -n '1' > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

# Enable loopback traffic
iptables -A INPUT  -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Enable statefull rules (after that, only need to allow NEW conections)
iptables -A INPUT   -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT  -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Drop invalid state packets
iptables -A INPUT   -m conntrack --ctstate INVALID -j DROP
iptables -A OUTPUT  -m conntrack --ctstate INVALID -j DROP
iptables -A FORWARD -m conntrack --ctstate INVALID -j DROP


## INPUT

# Incoming ssh from the LAN
iptables -A INPUT -i eth1 -s 192.168.0.0/24 \
                  -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT


## OUTPUT

# Enable al outgoing traffic to internet
iptables -A OUTPUT -o eth0 -d 0.0.0.0/0      -j ACCEPT 

# Enable access traffic, from the firewall to the LAN network
iptables -A OUTPUT -o eth1 -d 192.168.0.0/24 -j ACCEPT


## FORWARD

# We have dynamic IP (DHCP), so we've to masquerade 
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables        -A FORWARD     -o eth0 -i eth1 -s 192.168.0.0/24 \
                               -m conntrack --ctstate NEW -j ACCEPT

# Redirect HTTP (tcp/80) to the web server (192.168.0.2)
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 \
                              -j DNAT --to-destination 192.168.0.2:80

iptables        -A FORWARD    -i eth0 -p tcp --dport 80 \
                              -o eth1 -d 192.168.0.2    \
                              -m conntrack --ctstate NEW -j ACCEPT


## LOGGING

iptables -A INPUT   -j LOG --log-level DEBUG --log-prefix '[FW INPUT]:    '
iptables -A OUTPUT  -j LOG --log-level DEBUG --log-prefix '[FW OUTPUT]:   '
iptables -A FORWARD -j LOG --log-level DEBUG --log-prefix '[FW FORWARD ]: '
kudzu
Posty: 51
Rejestracja: 19 lipca 2012, 19:54
Lokalizacja: Kraków

Re: Router na SBC z Debianem - jak skonfigurować firewall

Post autor: kudzu »

dedito pisze:Przykładowy firewall masz na https://wiki.debian.org/DebianFirewall w sekcji Example: Basic gateway machine firewall i w wielu innych miejscach Internetu szukając firewalli dla serwerów i routerów.
Dzięki - zabieram się za czytanie.
dedito pisze:Prawdopodobnie przez brak zezwolenia dla loopback.

Kod: Zaznacz cały

# Enable loopback traffic
iptables -A INPUT  -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
Dorzuciłem to do skryptu i zablokowałem pakiety wejściowe - straciłem Internet na eth1.

Próbowałem też, bez rezultatów, z takim tworem:

Kod: Zaznacz cały

#!/bin/bash
 
### BEGIN INIT INFO
# Provides:          firewall.sh
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO


# CZYSZCZENIE STARYCH REGUŁ
iptables -F
iptables -X
iptables -F -t nat
iptables -X -t nat
iptables -F -t filter
iptables -X -t filter

# USTAWIENIE POLITYKI DZIAŁANIA
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT --reject-with icmp-host-unreachable

# OCHRONA PRZED SKANOWANIEM ACK SCAN
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH ACK -j LOG --log-prefix "ACK scan: "
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH ACK -j DROP # Metoda ACK (nmap -sA)

#OCHRONA PRZED SKANOWANIEM FIN SCAN
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH FIN -j LOG --log-prefix "FIN scan: "
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH FIN -j DROP # Skanowanie FIN (nmap -sF)

#OCHRONA PRZED SKANOWANIEM XMAS TREE SCAN
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH PSH -j LOG --log-prefix "Xmas scan: "
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)

#OCHRONA PRZED SKANOWANIEM NULL SCAN
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: "

#OCHRONA PRZED ATAKIEM Dos
iptables -A INPUT -m conntrack --ctstate INVALID -p tcp ! --tcp-flags SYN,RST,ACK,FIN,PSH,URG SYN,RST
iptables -N syn-flood
iptables -A INPUT -p tcp --syn -j syn-flood
iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j LOG --log-prefix "SYN-flood: "
iptables -A syn-flood -j DROP

# OCHRONA PRZED ATAKIEM PING OF DEATH 
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j LOG --log-prefix "Ping: "
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT # Ping of death

# ZABLOKOWANIE PINGOWANIA
iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT --reject-with icmp-host-unreachable

# BLOKOWANIE TELNETU
iptables -A OUTPUT -p tcp --dport telnet -j REJECT
iptables -A INPUT -p tcp --dport telnet -j REJECT

# ODBLOKOWANIE WWW
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

#ZAPIS DO LOGA ODRZUCONYCH PAKIETÓW PRZYCHODZĄCYCH W KATALOGU var/log/messages
iptables -N LOGGING
iptables -A INPUT -j LOGGING
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
iptables -A LOGGING -j DROP
ale przyznaję się, ze wstydem zresztą, że w tej materii działam na razie po omacku.
Awatar użytkownika
dedito
Moderator
Posty: 3512
Rejestracja: 18 listopada 2013, 21:07
Lokalizacja: Gliwice

Re: Router na SBC z Debianem - jak skonfigurować firewall

Post autor: dedito »

W powyższym tworze z kolei zabrakło NAT.
Pokaż wynik z

Kod: Zaznacz cały

iptables -nvL && iptables -t nat -nvL
i

Kod: Zaznacz cały

ifconfig -a
kudzu
Posty: 51
Rejestracja: 19 lipca 2012, 19:54
Lokalizacja: Kraków

Re: Router na SBC z Debianem - jak skonfigurować firewall

Post autor: kudzu »

Kod: Zaznacz cały

root@orangepipcplus:/etc/init.d# iptables -nvL && iptables -t nat -nvL
Chain INPUT (policy ACCEPT 1008 packets, 313K bytes)
 pkts bytes target     prot opt in     out     source               destination         
44925 3432K ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
 5544  511K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 2282  854K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
  132  7928 ACCEPT     all  --  *      *       192.168.1.0/24       0.0.0.0/0           
    0     0 ACCEPT     all  --  *      *       192.168.2.0/24       0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 138 packets, 9309 bytes)
 pkts bytes target     prot opt in     out     source               destination         
44925 3432K ACCEPT     all  --  *      lo      0.0.0.0/0            0.0.0.0/0           
 5522  532K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
Chain PREROUTING (policy ACCEPT 318 packets, 23075 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain INPUT (policy ACCEPT 203 packets, 16048 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 138 packets, 9309 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 138 packets, 9309 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  113  6908 MASQUERADE  all  --  *      *       192.168.1.0/24       0.0.0.0/0           
    0     0 MASQUERADE  all  --  *      *       192.168.2.0/24       0.0.0.0/0 

Kod: Zaznacz cały

root@orangepipcplus:/etc/init.d# ifconfig -a
eth0      Link encap:Ethernet  HWaddr 
          inet6 addr:  Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:33770 errors:0 dropped:0 overruns:0 frame:0
          TX packets:16618 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:26306875 (25.0 MiB)  TX bytes:2000045 (1.9 MiB)
          Interrupt:114 

eth1      Link encap:Ethernet  HWaddr   
          inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr:  Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:21507 errors:0 dropped:0 overruns:0 frame:0
          TX packets:27815 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:2220420 (2.1 MiB)  TX bytes:23536971 (22.4 MiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:401462 errors:0 dropped:0 overruns:0 frame:0
          TX packets:401462 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:30489474 (29.0 MiB)  TX bytes:30489474 (29.0 MiB)

ppp0      Link encap:Point-to-Point Protocol  
          inet addr:XXX.XXX.XXX.XXX  P-t-P:XXX.XXX.XXX.XXX  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1492  Metric:1
          RX packets:22349 errors:0 dropped:0 overruns:0 frame:0
          TX packets:15150 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3 
          RX bytes:22609055 (21.5 MiB)  TX bytes:1622334 (1.5 MiB)

tunl0     Link encap:IPIP Tunnel  HWaddr   
          NOARP  MTU:1480  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

wlan0     Link encap:Ethernet  HWaddr 
          inet addr:192.168.2.1  Bcast:192.168.2.255  Mask:255.255.255.0
          inet6 addr:  Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:755 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:112 (112.0 B)
Adresy usunąłem - wariatów nie brakuje;)
kudzu
Posty: 51
Rejestracja: 19 lipca 2012, 19:54
Lokalizacja: Kraków

Re: Router na SBC z Debianem - jak skonfigurować firewall

Post autor: kudzu »

Teraz jednak stwierdzam, że nie do końca rozumiem maskaradę.
W przywołanym przez Ciebie przykładzie piszą:
"# We have dynamic IP (DHCP), so we've to masquerade "
oraz
"# * One interface plug to the ISP conection (eth0). Using DHCP."
Ja na eth0 nie używam DHCP tylko PPPoE.
Protokół DHCP mam uruchomiony jedynie na eth1 i wlan0.
Cytaty umieszczaj w znacznikach quote.
Awatar użytkownika
dedito
Moderator
Posty: 3512
Rejestracja: 18 listopada 2013, 21:07
Lokalizacja: Gliwice

Re: Router na SBC z Debianem - jak skonfigurować firewall

Post autor: dedito »

To tylko przykład, który trzeba dostosować do Twojej konfiguracji.
Opisywane DHCP dotyczyło dostawcy Internetu. Gdybyś miał stałe IP na WAN mógłbyś użyć SNAT.
Twoje regułki maskarady dla eth1 i wlan0 są wystarczające, trzeba jedynie poprawić interfejs eth0 na ppp0.
kudzu
Posty: 51
Rejestracja: 19 lipca 2012, 19:54
Lokalizacja: Kraków

Re: Router na SBC z Debianem - jak skonfigurować firewall

Post autor: kudzu »

Wszystkie przykłady starałem się dostosowywać do swojej konfiguracji.
dedito pisze: Twoje regułki maskarady dla eth1 i wlan0 są wystarczające, trzeba jedynie poprawić interfejs eth0 na ppp0.
I tu chyba właśnie popełniam błąd, bo zamiast interfejsu ppp0 wszędzie wpisuję eth0. Jutro sprawdzę.
kudzu
Posty: 51
Rejestracja: 19 lipca 2012, 19:54
Lokalizacja: Kraków

Re: Router na SBC z Debianem - jak skonfigurować firewall

Post autor: kudzu »

Nic z tego. Czego bym nie robił, to blokując pakiety przychodzące zawsze tracę dostęp do Internetu; połączenie po ssh z routerem nadal działa.
A jak powinien wyglądać najprostszy skrypt, który domyślnie będzie blokował wszystko, ale udostępni internet dla eth1 (192.168.1.0/24) i wlan0 (192.168.2.0/24)? Jeżeli taka konfiguracja ruszy, to mógłbym spokojnie otwierać kolejne porty wg potrzeby. Jeśli nie ruszy, to będzie oznaczało, że wina nie leży po stronie iptables, a innego elementu systemu.
Awatar użytkownika
marcin1982
Moderator
Posty: 1730
Rejestracja: 05 maja 2011, 12:59
Lokalizacja: Zagłębie Dąbrowskie

Re: Router na SBC z Debianem - jak skonfigurować firewall

Post autor: marcin1982 »

Nie pisz postu pod postem - używaj opcji "Edytuj".
Zablokowany