routing w linuksie

miałem ostatnio interesującą sytuację w firmie.

jeden z pracowników miał na swoim komputerze wersję demo nowego serwisu www. i trzeba było wystawić to dla klienta na zewnątrz.

teoretycznie trywiał – jak się okazało, nie do końca.

najpierw ogólnie.

sieć wygląda w uproszczeniu tak:

Diagram1.png

aplikacja była odpalona na komputerze “pracownik a".

na firewallu/routerze regułki były skomplikowane, ale dla uproszczenia przyjmijmy, że było tylko:

iptables -P INPUT DROP<br />
iptables -P FORWARD DROP<br />
iptables -F<br />
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT<br />
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT<br />
iptables -A INPUT -p icmp -j ACCEPT<br />
iptables -A FORWARD -p icmp -j ACCEPT<br />
iptables -A INPUT -i lo -j ACCEPT<br />
iptables -A FORWARD -i lo -j ACCEPT<br />
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT # eth0 to sieć lokalna, eth1 - internet<br />
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

jak widać nic skomplikowanego.

no więc pojawia się zadanie – klient ma mieć wystawiony serwis z “pracownik a" (port 80) na dowolnym porcie.

ok. robimy:

iptables -t nat -A PREROUTING -s 243.65.193.17 -p tcp --dport 82 -j DNAT --to-destination 172.30.0.2:80

i … działa. zero zdziwień. proste i miłe.

ale jak wyżej napisałem – trywiał, ale nie do końca. jaki więc haczyk?

no cóż. następnego dnia pojawił się drugi request:

tak jak klient wchodzi na http://192.0.2.94:82/ to pracownicy z sieci (np. pracownik b) też mają móc.

i tu zaczęły się schody.

pierwszy strzał:

iptables -t nat -A PREROUTING -s 172.30.0.0/24 -d 192.0.2.94 -p tcp --dport 82 -j DNAT --to-destination 172.30.0.2:80<br />
iptables -A FORWARD -i eth0 -o eth0 -j ACCEPT

i nie działa.

chwila zastanowienia – nic prostego się nie okazuje.

tak więc rozrysowaliśmy sobie sytuację:

  1. “pracownik b" wysyła pakiet do 192.0.2.94:82. adres źródłowy pakietu: 172.30.0.3:1031 (jakiś losowy, wysoki port)
  2. ponieważ pakiet jest do innej sieci niż 172.30.0.0/24, zostaje przekazany do routera
  3. router ma regułkę która pakiet dnatuje, więc dane pakietu zmieniają się na:
    źródło: 172.30.0.3:1031, cel: 172.30.0.2:80
  4. pakiet przechodzi przez firewalla zaakceptowany i wchodzi z powrotem do lanu.
  5. pakiet trafia do komputera “pracownik a". super! ale tu zaczynają się kłopoty.
  6. “pracownik a" odpowiada. zamienia miejscami nadawcę i odbiorcę pakietu, otrzymując:
    źródło: 172.30.0.2:80, cel: 172.30.0.3:1031
  7. ponieważ cel jest w sieci 172.30.0.0/24 – wysyła pakiet bezpośrednio do odbiorcy – z pominięciem routera.
  8. do komputera “pracownik b" trafia pakiet (ack/syn), na dobry port, ale od złego ip?! “pracownik b" chciał “rozmawiać" z 192.0.2.94:82, a tu dostaje pakiet od 172.30.0.2:80 – czyli jakaś pomyłka. pakiet zostaje olany.
  9. nie bangla.

po rozrysowaniu sprawa stała się jasna.

pozostaje naprawić. pojawił się pomysł by robić DNAT'a, na “pracownik a" (przekazując pakiet do routera), ale to było brzydkie.

co finalnie zrobiliśmy?

na routerze dodaliśmy jedną regułkę:

iptables -t nat -A POSTROUTING -s 172.30.0.0/24 -d 172.30.0.2 -p tcp --dport 80 -j SNAT --to-source 172.30.0.1

i działa!

pełny przesył wygląda teraz tak:

  1. “pracownik b" wysyła pakiet do 192.0.2.94:82. adres źródłowy pakietu: 172.30.0.3:1031 (jakiś losowy, wysoki port)
  2. ponieważ pakiet jest do innej sieci niż 172.30.0.0/24, zostaje przekazany do routera
  3. router ma regułkę która pakiet dnatuje, więc dane pakietu zmieniają się na:
    źródło: 172.30.0.3:1031, cel: 172.30.0.2:80
  4. pakiet przechodzi przez firewalla zaakceptowany
  5. przed wyjściem do lanu pakiej jest snatowany, więc dane pakietu zmieniają się na:
    źródło: 172.30.0.1:1031, cel: 172.30.0.2:80
  6. pakiet trafia do komputera “pracownik a".
  7. “pracownik a" odpowiada. zamienia miejscami nadawcę i odbiorcę pakietu, otrzymując:
    źródło: 172.30.0.2:80, cel: 172.30.0.1:1031
  8. ponieważ cel jest w sieci 172.30.0.0/24 – wysyła pakiet bezpośrednio do odbiorcy – ale w tym przypadku odbiorcą jest router
  9. mechanizm conntracka na routerze dokonuje odpowiednich (odwrotnych) translacji adresów, tak, że pakiet powrotny przyjmuje postać:
    źródło: 192.0.2.94:82, cel: 172.30.0.3:1031
  10. do komputera “pracownik b" trafia pakiet (ack/syn), na dobry port, i od słusznego ip.
  11. bangla.

po zapisaniu tego wszystkiego sprawa staje się jasna i oczywista. ale nie zmienia to faktu, że kilka razy słychać było – “nie da się".

powyższy pomysł/regułki dedykuję wszystkim zdającym test na pracownika do nas 🙂 tam jest mocno podobne pytanie 🙂

naprawdę przełomowy samochód

samochody dla “zielonych" były zawsze brzydkie. czy to gm ev1, czy prius – nie są one ładne.

do tego – samochody naprawdę ekoprzyjazne – całkowicie elektryczne miały zawsze kiepskie osiągi (o ile można to nazwać osiągami), oraz fatalny zasięg – najpopularniejszy (około 1000 wyprodukowanych egzemplarzy) gm ev1, miał zasięg około 100 mil (po wymianie baterii na inne, do 150 mil).

tragedia.

w 2003 roku martin eberhard stwierdził, że chce jeździć samochodem elektrycznym, ekoprzyjaznym, ale niech on wygląda i może! czy jazda czymś takim musi być karą?

martin jest informatykiem (a przynajmniej około informatykiem). z bańki internetowej wyszedł z ponad 100 milionami dolarów i bezcennymi znajomościami.

założył firmę która miała produkować samochody elektryczne. lepsze. dużo lepsze. ładne, szybkie i mogące jeździć na większe dystanse.

zdobyli pieniądze – łącznie 60 milionów dolarów, z czego połowę dał elon musk – współzałożyciel paypala. inni inwestorzy? sergey brin i larry page. dosyć znane nazwiska 🙂

do budowy samochodów podeszli tak jak do startupów komputerowych. wybrali 4 projektantów by zaprojektowali samochoód. wygrał projekt kolesia który projektował samochody dla firmy lotus.

dzięki temu, że przemysł motoryzacyjny outsource'uje produkcję czego tylko może – praktycznie każdą część można kupić od niezależnych dostawców.

największym przełomem była zmiana zasilania. koncerny motoryzacyjne używają starych i kiepskich akumulatorów kwasowo ołowianych lub niklowo wodorowych. a kto teraz używa najlepszych dostępnych ogólnie akumulatorów? laptopy! w efekcie samochód będzie napędzany ponad 6 tysiącami ogniw typu baterie laptopowe.

samochód powstał. firma, na część znanego wynalazcy została nazwana “tesla".

jak wygląda?

tak:

body-30.jpg

co potrafi? 60 mil na godzinę w około 4 sekundy. prędkość maksymalna – około 200 kilometrów na godzinę. zasięg – 250 mil – czyli 400 kilometrów. czas “tankowania" – 3.5 godziny. baterie wystarczają na minimum 100 000 mil.
ekonomia jazdy? koszt przejechania mili to 1-2 centy. przeliczając to na 100km i złotówki, dostajemy informacje, że 100kilometrów kosztuje do 3,8 złotego!

minusy? oczywiście są. szacowana cena (szacowana, bo samochód jeszcze nie jes w sprzedaży, $80.000 (do $100.000 w/g innych źródeł).

no i jeszcze jedno – jak jesteś miłośnikiem głośnego wrrrrrrrrrrrrrrrrr przy ruszaniu – tesla ci się nie spodoba. jest cicha. mimo, że silnik kręci się do 13500 obrotów na minutę praktycznie go nie słychać.

aha. autoka ma dwa biegi do przodu i jeden do tyłu. na pierwszym biegu do przodku można jechać do 70 mil na godzinę (112km/h)!

twórcy są tak zadowoleni z efektu, że przymierzają się do zaprojektowania normalnego 4 drzwiowego sedana.

a teraz, popatrzmy jak wygląda na zewnątrz:

body-10.jpg body-20.jpgbody-50.jpgbody-40.jpgbody-30.jpgbody-60.jpgbody-91.jpgbody-90.jpgbody-80.jpgbody-70.jpgbody-94.jpgbody-95.jpgbody-96.jpgbody-97.jpgbody-99.jpgbody-100.jpgbody-101.jpgbody-102.jpgbody-103.jpgbody-105.jpgbody-191.jpgbody-192.jpgbody-193.jpgbody-401.jpgbody-402.jpgbody-404.jpgbody-408.jpgbody-5001.jpgbody-502.jpgbody-554.jpgbody-501.jpgbody-600.jpgbody-555.jpgbody-700.jpg

a tak wygląda w środku:

cockpit-10.jpg cockpit-20.jpgcockpit-30.jpgcockpit-40.jpgcockpit-200.jpgcockpit-140.jpgcockpit-220.jpgcockpit-300.jpg