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:
- Ruch wychodzący z LAN wypuszczam przez MASQUERADE (działa, z dpsserver mogę np. aktualizować system).
- 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.
Kod: Zaznacz cały
telnet 10.1.1.201 80
Kod: Zaznacz cały
telnet 192.168.1.254 80
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 │
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
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
U mnie vif2.0 to interfejs rutera, a vif3.0 serwera.