Mam problem który nałogowicznie pojawia się w internecie - przeczytałem wiele stron, wiele rzeczy zrobiłem czytając materiały napisane przez innych w sieci... i niestety to co robię nie działą do końca, a już opisuję co dokładnie robię
Sieć jest następująca:
Kod: Zaznacz cały
LAN
[ 192.168.100.0/24 ]
[ 192.168.1.0/24 ]
|
|
ROUTER (LINUX)
- ETH0 (Interfejs z IP zewnętrznym [1Dostawca])
[ 10.0.0.0/24 ]
- ETH1 (Interfejs z 2 lanami)
[ 192.168.100.0/24 ]
[ 192.168.1.0/24 ]
- ETH2 (interfejs z IP zewnętrznym [2 Dostawca])
[ 192.168.10.10/24 ]
Oczywiście postępowałem według instrukcji: (iptables mark i iproute2).
Kod: Zaznacz cały
echo 200 test_newtable >> /etc/iproute2/rt_table
ip rule add from 192.168.100.0/24 fwmark 1 dev eth1 table test_newtable
ip route add default IP_OD_GW_2_Dostawcy dev eth2 table test_newtable
iptables -t mangle -A PREROUTING -i eth1 -s 192.168.100.0/24 -j MARK --set-mark 1
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth2 -j SNAT --to-source 192.168.10.10
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.8
- Pakiety z sieci 192.168.1.0 - powinny być natowane i wysyłane przez interfejs eth0 z adresem 10.0.0.8 (działa)
- Pakiety z sieci 192.168.100.0 - powinny być natowane i wysyłane przez interfejs eth2 z adresem 192.168.10.10 (działa).
Problem jest w tym że jeżeli wysyłam pakiety z sieci 192.168.100.0 - wychodzą one przez eth2, docierają do celu - wracają od celu przez eth2 i .... i pakiet nagle znika (nie wraca już do komputera z sieci 192.168.100.0)... Problemem jest albo nat (coś nie tak) - albo z routingiem.
Tak wygląda tcpdump z eth2 - jak wysłany jest pakiet z sieci 192.168.100.0:
Kod: Zaznacz cały
16:04:45.488000 IP 192.168.100.10 > 195.116.132.4: icmp 64: echo request seq 1
16:04:45.488392 IP 192.168.10.10 > 195.116.132.4: icmp 64: echo request seq 1
16:04:45.543657 IP 195.116.132.4 > 192.168.10.10: icmp 64: echo reply seq 1
Na linuxie nie ma żadnego firewalla (Są tylko te regułki, które napisałem).
Tak więc zgłaszam się z kilkoma pytaniami:
1) Jak (czy jest) możliwość monitoringu pakietów przechodzących przez iptables (nie logowanie - to nie działa - na logowaniu otrzymuję dokładnie to co pokazuje mi tcpdump - czyli pakiet wchodzi i ginie -logowanie na wszystkich tabelach: nat, mangle, etc).
2) Jak korzystać z narzędzie rtmon, ip monitor route, (iproute2) - dane są zapisywane do plików ale nie wiem jak je odczytać...
3) Jak sprawdzić dlaczego pakiet ginie ... cokolwiek - jakiś debug (tak jak w cisco routerach, etc???)
4) Ktoś miał podobny problem - jak tak - to będę wdzięczny za jakąkolwiek pomoc.
Na tyle co ja widzę to jest jakiś problem z natem połączonym z iproute2 - czy jest możliwość śledzenia połączeń nat'a: cat /proc/...cos_tam... ??
Pozdrawiam
i zaprawszam do rozwiązania problemu
[ Dodano: 2004-08-03, 15:13 ]
Jakoże nikt tutaj nic nie miał do dodania, to postanowiłem odpowiedzieć samemu sobie
Oczywiście nie do końca rozumiem jak mi to zaczęło działać - ale działa - tak więc pragnę się podzielić informacjami z wami.
Przedstawiam rozwiązanie do zagadnienia jakie przestawiłem wcześniej. Jeden linux - 2 łącza dostawców podłączone do niego.
Normal - normalne łącze.
Mel - dodatkowe łącze.
Zamieszczam skrypty - gdyż szybciej to będzie opisane.
Konfiguracja jest najprostrza jaka może być, ale za to działająca:
Konfiguracja iptables: (iptables.sh)
Kod: Zaznacz cały
#!/bin/sh
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t mangle -F
iptables -t nat -F
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth2 -j SNAT --to-source 192.168.10.10
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.8
Powyższe dwie linijki - oznaczają to iż pakiety z sieci 192.168.100.0/24 mają wychodzić przez interfejs eth2 a pakiety z sieci 192.168.1.0/24 mają wychodzić przez interfejs eth0.
Teraz najważniejsza część - gdyż stworzenie odpowiednich tablic routingu tak aby to działało.
Routing: (iproute2.sh)
Kod: Zaznacz cały
!/bin/sh
ip link set dev eth0 down
ip link set dev eth1 down
ip link set dev eth2 down
ip addr flush dev eth0
ip addr flush dev eth1
ip addr flush dev eth2
ip link set dev eth0 up
ip link set dev eth1 up
ip link set dev eth2 up
ip addr add 10.0.0.8/24 brd + dev eth0
ip addr add 192.168.1.20/24 brd + dev eth1
ip addr add 192.168.100.1/24 brd + dev eth1
ip addr add 192.168.10.10/24 brd + dev eth2
ip ru | \
egrep -v "^0:" | egrep -v "^32766:" | egrep -v "^32767:" | \
cut -d":" -f 2 | \
while read RULE; do ip ru d $RULE;
done
ip rule add from 10.0.0.8 pref 500 table normal
ip rule add from 192.168.1.0/24 pref 501 table normal
ip rule add from 192.168.10.10 pref 410 table mel
ip rule add from 192.168.100.0/24 pref 411 table mel
ip route flush table mel
ip route add default via 10.0.0.2 dev eth0 table normal
ip route add default via 192.168.10.20 dev eth2 table mel
ip route sh table normal
ip route sh table mel
ip route sh | grep -v ^default | while read ROUTE; do \
ip route a ${ROUTE} table mel
ip route a ${ROUTE} table normal
done
# --- default ---
ip route del default
ip route add default via 10.0.0.2 dev eth0
# --- Must be ---
ip route flush cache
ip r s
Kod: Zaznacz cały
$ip a
1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:00:e8:ef:54:a6 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.8/24 brd 10.0.0.255 scope global eth0
3: eth1: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:10:a7:20:41:72 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.20/24 brd 192.168.1.255 scope global eth1
inet 192.168.100.1/24 brd 192.168.100.255 scope global eth1
4: eth2: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:05:1c:13:5f:8d brd ff:ff:ff:ff:ff:ff
inet 192.168.10.10/24 brd 192.168.10.255 scope global eth2
$ip ru
0: from all lookup local
410: from 192.168.10.10 lookup mel
411: from 192.168.100.0/24 lookup mel
500: from 10.0.0.8 lookup normal
501: from 192.168.1.0/24 lookup normal
32766: from all lookup main
32767: from all lookup default
Oto dowody tego że tak jest jak powinno być:
Pakiet z sieci 192.168.1.0/24:
Kod: Zaznacz cały
ICMP echo req (84 bytes) from 192.168.1.25 to 213.180.130.200 (src HWaddr 00e098a31960) on eth1
ICMP echo req (84 bytes) from 10.0.0.8 to 213.180.130.200 (src HWaddr 0000e8ef54a6) on eth0
ICMP echo rply (84 bytes) from 213.180.130.200 to 10.0.0.8 (src HWaddr 00300a0e4893) on eth0
ICMP echo rply (84 bytes) from 213.180.130.200 to 192.168.1.25 (src HWaddr 0010a7204172) on eth1
Pakiet z sieci 192.168.100.0/24:
Kod: Zaznacz cały
ICMP echo req (84 bytes) from 192.168.100.10 to 213.180.130.200 (src HWaddr 00e098a31960) on eth1
ICMP echo req (84 bytes) from 192.168.10.10 to 213.180.130.200 (src HWaddr 00051c135f8d) on eth2
ICMP echo rply (84 bytes) from 213.180.130.200 to 192.168.10.10 (src HWaddr 0010a70d9f88) on eth2
ICMP echo rply (84 bytes) from 213.180.130.200 to 192.168.100.10 (src HWaddr 0010a7204172) on eth1
Czyli - pełny sukces:
Niestety - takie rozwiązanie ma też kilka wad:
1) nie wiem do końca dlaczego to działa - a tak naprawdę nie wiem jak jest zarządzany routing przez kernel w iproute2. Te regułki, które podałem były rezultatem najróżniejszych eksperymentów, aż w końcu zadziałało, ale do końca nie wiem jak to działa.
2) Jak na razie nie udało mi się zrobić tego przy pomocy mark'a z iptables.
Jakoże przy roziwązaniu problemu pomogło mi wiele dokumentów, tak więc postanowiłem że umieszczę linki od tych najważniejszych i najbardziej konkretnych - aby innym ułatwić podobne problemy:
- http://www.ssi.bg/~ja/ (Patche do jądra)
- http://linux-ip.net/html/adv-rpdb.html
- http://lartc.org/howto/lartc.rpdb.multiple-links.html
Należą się też podziękowania dla wszystkich tych co przez kilkanaście dni służyli mi chętnie pomocą @
PS.
Jak będę miał chwilkę czasu - to napiszę ładny dokument - opisujący to wszystko.
Pozdrawiam