Chciałbym zrobić coś NAT
w iptables
. Aby wszystkie pakiety przychodzące 192.168.12.87
i 80
przesyłane były do 192.168.12.77
portu 80
.
Jak to zrobić za pomocą iptables?
Lub
Jakieś inne sposoby na osiągnięcie tego samego?
Chciałbym zrobić coś NAT
w iptables
. Aby wszystkie pakiety przychodzące 192.168.12.87
i 80
przesyłane były do 192.168.12.77
portu 80
.
Jak to zrobić za pomocą iptables?
Lub
Jakieś inne sposoby na osiągnięcie tego samego?
192.168.12.87
. Muszę więc przekazać całą prośbę do192.168.12.77
.iptables
. I widziałem kilka przykładów. Ale wydaje się, że wymagają dwóch sieci Ethernet. Link: revsys.com/writings/quicktips/nat.htmlOdpowiedzi:
Te reguły powinny działać, przy założeniu, że
iptables
działają na serwerze192.168.12.87
:Musisz DNAT przychodzić z ruchu na porcie 80, ale musisz także SNAT z powrotem ruch.
Alternatywa (i najlepsze podejście IMHO):
W zależności od tego, jaki jest Twój serwer WWW (Apache, NGinx), powinieneś rozważyć serwer proxy HTTP na serwerze front-end (192.168.12.87):
mod_proxy (Apache)
proxy_pass (NGinx)
źródło
Pozornie oczywistym powodem, dla którego pozornie
iptables -t nat -A PREROUTING -d 192.168.12.87 -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77
nie będzie działać, jest sposób kierowania pakietów zwrotnych.Możesz skonfigurować reguły, które spowodują, że pakiety wysyłane do 192.168.12.87 będą po prostu NATowane do 192.168.12.77, ale 192.168.12.77 wyśle odpowiedzi bezpośrednio z powrotem do klienta. Odpowiedzi te nie będą przechodzić przez host, na którym reguła iptables wykonuje translację NAT, stąd pakiety w jednym kierunku są tłumaczone, ale pakiety w drugim kierunku nie.
Istnieją trzy podejścia do rozwiązania tego problemu.
iptables -t NAT -A POSTROUTING -d 192.168.12.77 -p tcp --dport 80 -j SNAT --to-source 192.168.12.87
iptables -t nat -A OUTPUT -p tcp --sport 80 -j SNAT --to-source 192.168.12.87
Każde z tych trzech rozwiązań ma wady, więc musisz dokładnie rozważyć, czy naprawdę potrzebujesz tego konkretnego przekazywania.
Myślę, że spośród trzech podejść pierwszy jest tym, który najprawdopodobniej zadziała. Więc jeśli nie musisz znać adresów IP klienta, polecam to.
Możesz także całkowicie zapomnieć o NAT i nie próbować rozwiązać problemu na warstwie MAC lub IP. Możesz przejść aż do warstwy HTTP i poszukać tam rozwiązania. W takim przypadku rozwiązaniem jest serwer proxy HTTP. Jeśli zainstalujesz serwer proxy HTTP 192.168.12.87 i odpowiednio go skonfigurujesz, możesz poprosić go o przesłanie dalej żądań do 192.168.12.77 i przesłanie odpowiedzi z powrotem. Dodatkowo może wstawić nagłówek X-Forwarded-For zachowujący oryginalny adres IP klienta. Serwer 192.168.12.77 należy następnie skonfigurować tak, aby ufał nagłówkowi X-Forwarded-For z 192.168.12.87.
źródło
-j MASQUERADE
nie wspomniano tutaj; czy to nie jest zwykłe podejście w przypadku DNAT?SNAT
zamiastMASQUERADE
, ponieważ tak mówi dokumentacja. Dokładne sformułowanie w dokumentacji to:It should only be used with dynamically assigned IP (dialup) connections: if you have a static IP address, you should use the SNAT target.