홈 네트워크에 NAT를 수행하는 Linux 게이트웨이가 있습니다. 패킷을 투명하게 전달하고 싶지만 특정 IP / 포트 (예 : VPN이 아닌)로만 패킷을 전달하고 싶은 다른 네트워크가 있습니다. 다음은 작동 할 IP 및 포트의 예입니다.
Source Router Remote Gateway Remote Target
192.168.1.10 -> 192.168.1.1 -> 1.2.3.4 -> 192.168.50.50:5000
소스 머신이 마치 라우터에서 직접 라우팅 할 수있는 것처럼 원격 대상의 특정 포트와 통신 할 수 있기를 원합니다. 라우터에서 eth0은 개인 네트워크이고 eth1은 인터넷 연결입니다. 원격 게이트웨이는 내가 ssh 할 수 있고 원격 대상으로 직접 라우팅 할 수있는 또 다른 Linux 시스템입니다.
간단한 해결책으로 라우터에 ssh 포트 전달을 설정하는 것입니다.
ssh -L 5000:192.168.50.50:5000 1.2.3.4
라우터에서 제대로 작동하며 이제 포트 5000에 로컬로 연결할 수 있습니다. 따라서 "telnet localhost 5000"은 예상대로 192.168.50.50:5000에 연결됩니다.
이제는 ssh 터널을 통해 소스 및 유입 경로의 트래픽을 리디렉션하고 싶습니다. 나는 이것을 위해 NAT 규칙을 시도했다.
iptables -t nat -D PREROUTING -i eth0 -p tcp -s 192.168.1.10 --dport 5000 -d 1.2.3.4 -j DNAT --to-destination 127.0.0.1:5000
라우터는 이미 내 NAT 게이트웨이이므로 필요한 후 라우팅 규칙이 이미 있습니다.
-A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE
이 사이트 나 다른 곳의 대부분의 Q & A는 전달 서버 포트 나 헤어핀 NAT를 다루는 것으로 보입니다. DMZ는 원격 게이트웨이를 통해 원격 대상 포트를 전달할 수 있지만 인터넷에 액세스 할 수있는 포트는 원하지 않으며 보안 SSH 터널을 통해서만 액세스 할 수 있기를 원합니다.
내가 찾을 수있는 가장 좋은 대답은 Linux 커널의 Martian 패킷 거부와 관련이 있습니다.
iptables, 루프백에서 포트를 리디렉션하는 방법?
화성인 로깅을 활성화하고 커널이이 패킷을 화성인으로 거부 함을 확인했습니다. 그들이 아닌 것을 제외하고 : 나는이 패킷이 무엇인지, 어디에서 왔는지, 어디로 가고 있는지 (내 ssh 터널) 정확히 알고 있습니다.
거기에 제시된 "주변"솔루션은 원래 질문에 적용 할 수 있지만 제 경우에는 적용되지 않습니다.
그러나이 질문을 쓰거나 검색하는 동안 SSH 소스 IP 바인딩을 사용하여 문제를 해결했습니다.
ssh -L 192.168.1.1:5000:192.168.50.50:5000 1.2.3.4
iptables -t nat -D PREROUTING -i eth0 -p tcp -s 192.168.1.10 --dport 5000 -d 1.2.3.4 -j DNAT --to-destination 192.168.1.1:5000
루프백을 사용하지 않기 때문에 화성의 거부가 발생합니다.
나는 여전히 두 가지 이유로 여기에 질문을 게시합니다.
- 앞으로 비슷한 일을하려는 사람이 검색에서이를 찾을 수 있고이 해결 방법이 도움이 될 수 있기를 바랍니다.
- 나는 여전히 ssh 포트 전달 연결을 루프백에만 바인딩하고 iptables를 통해 라우팅 할 수 있다는 아이디어를 선호합니다. 이 패킷이 무엇이며 어디로 가고 있는지 정확히 알고 있기 때문에 Linux 화성 필터링이 거부하지 않도록 플래그를 지정할 방법이 없어야합니까? 이 주제에 대한 모든 검색은 rp_filter로 연결되며 테스트에서 전혀 도움이되지 않았습니다. 그리고 그것이 효과가 있었더라도 허용하려는 정확한 패킷에 국한되지 않습니다.
내 질문과 해결 방법을 일반 검색에 제공하여 다른 사람을 구하기 위해 검색 시간을 절약하고 막 다른 길을 잃었을뿐 아니라 여전히 열려있는 질문의 루프백 / 마티니 부분에 누군가가 답변하기를 바랍니다. 나에게.