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.
- Na pierwszym hoście nie tylko wykonuj DNAT, ale także SNAT, aby ruch powrotny był wysyłany z powrotem przez pierwszy host. Reguła może wyglądać mniej więcej tak
iptables -t NAT -A POSTROUTING -d 192.168.12.77 -p tcp --dport 80 -j SNAT --to-source 192.168.12.87
- Czerp inspirację z równoważenia obciążenia DSR i DNAT pakietów w warstwie Ethernet zamiast w warstwie IP. Zastępując docelowy adres MAC pakietów adresem MAC 192.168.12.77 i wysyłając go w sieci Ethernet bez dotykania warstwy IP, 192.168.12.77 może mieć 192.168.12.87 skonfigurowany na fikcyjnym interfejsie, a zatem być w stanie zakończyć połączenie TCP ze znanym klientowi adresem IP serwera.
- Użyj naiwnego (ale nie działającego) rozwiązania na pierwszym hoście. Następnie obsłuż pakiety zwrotne na drugim hoście, wykonując SNAT dla ruchu powrotnego. Reguła może wyglądać
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.
- Użycie SNAT spowoduje utratę adresu IP klienta, więc host nr 2 będzie myślał, że wszystkie połączenia pochodzą od 192.168.12.87. Dodatkowo wykorzystasz przepustowość hosta numer 1 dla wszystkich pakietów odpowiedzi, co przy innych podejściach byłoby bardziej bezpośrednie.
- Podejście DSR przerwie wszelką inną komunikację między dwoma węzłami. Podejście DSR jest naprawdę odpowiednie tylko wtedy, gdy adres serwera nie jest podstawowym adresem IP żadnego z hostów. Każdy host musi mieć podstawowy adres IP, który nie jest adresem DSR.
- Używanie śledzenia połączenia na jednym hoście do tłumaczenia w jednym kierunku i śledzenia połączenia na innym hoście w celu tłumaczenia w drugim kierunku jest po prostu brzydkie i istnieją różne sposoby, w jakie może się zepsuć. Na przykład, jeśli numery portów są modyfikowane przez NAT na dowolnym hoście, nie ma możliwości ich rekonstrukcji. Nie jest również pewne, że śledzenie połączenia będzie działać poprawnie, jeśli pierwszy pakiet, który zobaczy, to SYN-ACK zamiast ACK.
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.