[+] Przekierowanie przych

Masz problemy z siecią bądź internetem? Zapytaj tu
Ister
Junior Member
Posty: 566
Rejestracja: 05 marca 2009, 12:42

[+] Przekierowanie przychądzącego połączenia na inny komputer nie działa - iptables

Post autor: Ister »

Witam.

Konfiguruję małą sieć lokalną. Układ jest następujący:

Internet ---- (eth1) dpsrouter (eth0) ---- LAN ---- dpsserver

Docelowo do LAN będę też podpinał inne komputery.

W tej chwili adres zewnętrzny dpsrouter to 192.168.1.254, natomiast LAN pracuje na sieci 10.1.1.0/24, przy czym dpsrouter ma adres 10.1.1.254, a dpsserver 10.1.1.201.
Na obu maszynach jest zainstalowany Debian w wersji 6.0.6. Obie maszyny są wirtualizowane (na Xenie), ale to chyba nie ma znaczenia.

Na dpsserver uruchamiam takie usługi jak: serwer www, czy poczta. W związku z tym:
  1. Ruch wychodzący z LAN wypuszczam przez MASQUERADE (działa, z dpsserver mogę np. aktualizować system).
  2. Ruch przychodzący z zewnątrz, na porcie 80, chcę przekierować na 10.1.1.201:80 i to nie działa. I nie mam bladego pojęcia dlaczego.
Testowałem na różne sposoby i wiem tyle:

Kod: Zaznacz cały

telnet 10.1.1.201 80
wywołane z dpsrouter działa.

Kod: Zaznacz cały

telnet 192.168.1.254 80
wywoływane z innego komputera w sieci 192.168.1.0/24 nie działa. Przy czym iptraf na dpsrouter pokazuje mi, że ruch jest przekierowywany, a na dpsserver cisza.

Podejrzewam, że robię jakiś podstawowy błąd, ale nie mam bladego pojęcia jaki. Proszę o pomoc. Każda podpowiedź będzie mile widziana.

Poniżej trochę informacji.

Wyciąłem przekierowywane porty inne niż 80, bo na razie koncentruję się na tym jednym. Jak to zadziała, to reszta też.

dpsrouter:

Kod: Zaznacz cały

dpsrouter:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:16:3e:3d:e9:7e  
          inet addr:10.1.1.254  Bcast:10.1.1.255  Mask:255.255.255.0
          inet6 addr: fe80::216:3eff:fe3d:e97e/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:261922 errors:0 dropped:0 overruns:0 frame:0
          TX packets:263493 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:52346995 (49.9 MiB)  TX bytes:18125380 (17.2 MiB)

eth1      Link encap:Ethernet  HWaddr 00:0e:2e:72:61:8f  
          inet addr:192.168.1.254  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::20e:2eff:fe72:618f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:592458 errors:0 dropped:0 overruns:0 frame:0
          TX packets:584026 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:40573546 (38.6 MiB)  TX bytes:125067245 (119.2 MiB)
          Interrupt:20 Base address:0x4000 

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: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)

Kod: Zaznacz cały

dpsrouter:~# cat /etc/init.d/firewall
#!/bin/bash

# włączenie w jądrze przekierowania 
echo 1 > /proc/sys/net/ipv4/ip_forward

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

# ustawienie polityki dzialania
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# polaczenia nawiazane
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

# zezwolenie na wlasny ruch

iptables -A INPUT -i lo -j ACCEPT
iptables -A FORWARD -o lo -j ACCEPT

iptables -A INPUT -s 10.1.1.254 -j ACCEPT

# udostepniaie internetu w sieci lokalnej
iptables -t nat -A POSTROUTING -s 10.1.1.0/24 -j MASQUERADE
iptables -A FORWARD -s 10.1.1.0/24 -j ACCEPT

# wpuszczamy SSH z dpsserver

iptables -A INPUT -s 10.1.1.201 -d 10.1.1.254 -p tcp --dport 22 -j ACCEPT

# przekierowanie ruchu z zewnatrz na dpsserver

# strony WWW

iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to-destination 10.1.1.201:80
iptables -A FORWARD -i eth1 -p tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 443 -j DNAT --to-destination 10.1.1.201:443

# tunel OpenVPN
# komputer WiFi

iptables -t nat -A PREROUTING -i eth1 -m mac --mac-source xx:xx:xx:xx:xx:xx -p tcp --dport 1194 -j DNAT --to-destination 10.1.1.201:1194
iptables -t nat -A PREROUTING -i eth1 -m mac --mac-source xx:xx:xx:xx:xx:xx -p udp --dport 1194 -j DNAT --to-destination 10.1.1.201:1194

# tymczasowo wpuszczamy z 192.168.1.3

iptables -A INPUT -s 192.168.1.3 -d 192.168.1.254 -p tcp --dport 22 -j ACCEPT

Kod: Zaznacz cały

dpsrouter:~# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       tcp  --  anywhere             anywhere            tcp dpt:domain to:10.1.1.201:53 
DNAT       udp  --  anywhere             anywhere            udp dpt:domain to:10.1.1.201:53 
DNAT       tcp  --  anywhere             anywhere            tcp dpt:smtp to:10.1.1.201:25 
DNAT       tcp  --  anywhere             anywhere            tcp dpt:submission to:10.1.1.201:587 
DNAT       tcp  --  anywhere             anywhere            tcp dpt:www to:10.1.1.201:80 
DNAT       tcp  --  anywhere             anywhere            tcp dpt:https to:10.1.1.201:443 
DNAT       tcp  --  anywhere             anywhere            MAC xx:xx:xx:xx:xx:xx tcp dpt :o penvpn to:10.1.1.201:1194 
DNAT       udp  --  anywhere             anywhere            MAC xx:xx:xx:xx:xx:xx udp dpt :o penvpn to:10.1.1.201:1194 

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  10.1.1.0/24          anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Kod: Zaznacz cały

dpsrouter:~# iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  dpsrouter            anywhere            
ACCEPT     tcp  --  dpsserver            dpsrouter           tcp dpt:ssh 
ACCEPT     tcp  --  192.168.1.3          dpsrouter           tcp dpt:ssh 

Chain FORWARD (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  10.1.1.0/24          anywhere            
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:www 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 

I zrzut z iptraf podczas próby połączenia z zewnątrz na adres 192.168.1.254:80

Kod: Zaznacz cały

│┌192.168.1.3:41170                                =       3                  180       S---          eth1          │
│└192.168.1.254:80                                 =       0                    0       ----          eth1          │
│┌192.168.1.3:41170                                =       3                  180       S---          eth0          │
│└10.1.1.201:80                                    =       0                    0       ----          eth0          │
dpsserver

Kod: Zaznacz cały

dpsserver:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:16:3e:c6:76:7a  
          inet addr:10.1.1.201  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::216:3eff:fec6:767a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:359730 errors:0 dropped:0 overruns:0 frame:0
          TX packets:358650 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:27220286 (25.9 MiB)  TX bytes:74280519 (70.8 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:12712 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12712 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1511378 (1.4 MiB)  TX bytes:1511378 (1.4 MiB)

Kod: Zaznacz cały

dpsserver:~# cat /etc/init.d/firewall
#!/bin/bash

# wlaczenie w jądrze przekierowania
# bedzie potrzebne do forwardowania ruchu z tunelu
echo 1 > /proc/sys/net/ipv4/ip_forward

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

# ustawienie polityki dzialania
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# polaczenia nawiazane
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

# zezwolenie na wyjscie na swiat

iptables -A INPUT -i lo -j ACCEPT
#iptables -A FORWARD -o lo -j ACCEPT

# wpuszczamy uslugi udostepnione na serwerze

# strony WWW

iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# tymczasowo wpuszczamy SSH z 192.168.1.3

iptables -A INPUT -s 192.168.1.3 -p tcp --dport 22 -j ACCEPT

# tymczasowo wpuszczamy SSH z dpsrouter

iptables -A INPUT -s 10.1.1.254 -p tcp --dport 22 -j ACCEPT

Kod: Zaznacz cały

dpsserver:~# iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:domain 
ACCEPT     udp  --  anywhere             anywhere            udp dpt:domain 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:bootps 
ACCEPT     udp  --  anywhere             anywhere            udp dpt:bootps 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:smtp 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:submission 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt :p op3 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt :p op3s 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:imap2 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:imap3 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:imaps 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:www 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:https 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:gds_db 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt :o penvpn 
ACCEPT     udp  --  anywhere             anywhere            udp dpt :o penvpn 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ntp 
ACCEPT     udp  --  anywhere             anywhere            udp dpt:ntp 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ipp 
ACCEPT     tcp  --  192.168.1.3          anywhere            tcp dpt:ssh 
ACCEPT     tcp  --  10.1.1.254           anywhere            tcp dpt:ssh 

Chain FORWARD (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 
Dodane:
Znalazłem. Informacja, którą uznałem za (chyba) nieistotną okazała się kluczowa.

Opiszę przyczyny i podam rozwiązanie - może się komuś przyda.

Tak jak napisałem - obie maszyny są wirtualizowane na tym samym Xenie. Na Xenie też stworzyłem firewalla (zasadniczo puszczający ruch tylko z Xena na zewnątrz i wpuszczający ruch z serwera na SSH). I resztę zablokowałem (DROP).

Tyle, że ruch między tymi dwoma komputerami odbywa się faktycznie właśnie przez Xena. Okazuje się, że Xen dodaje sam z siebie reguły przepuszczające ruch z adresów wirtualizowanych środowisk na podstawie (jednocześnie) IP i adresu wirtualnego interfejsu sieciowego (vif). Kiedy zostaje ruch przekierowany nie zgadza się numer IP, więc pakiety nie zgadzają się z regułą i przechodzą do kolejnych reguł.

Rozwiązanie:

Na Domain-0 trzeba dodać następującą regułę:

Kod: Zaznacz cały

iptables -A FORWARD -j ACCEPT -m physdev --physdev-in vif2.0 --physdev-out vif3.0
Oczywiście numery vif zależą od tego, który wirtualny komputer ma, który wirtualny interfejs sieciowy.

U mnie vif2.0 to interfejs rutera, a vif3.0 serwera.
ODPOWIEDZ