리눅스 iptables ssh 포트 포워딩 (마티니 거부)


12

홈 네트워크에 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

루프백을 사용하지 않기 때문에 화성의 거부가 발생합니다.

나는 여전히 두 가지 이유로 여기에 질문을 게시합니다.

  1. 앞으로 비슷한 일을하려는 사람이 검색에서이를 찾을 수 있고이 해결 방법이 도움이 될 수 있기를 바랍니다.
  2. 나는 여전히 ssh 포트 전달 연결을 루프백에만 바인딩하고 iptables를 통해 라우팅 할 수 있다는 아이디어를 선호합니다. 이 패킷이 무엇이며 어디로 가고 있는지 정확히 알고 있기 때문에 Linux 화성 필터링이 거부하지 않도록 플래그를 지정할 방법이 없어야합니까? 이 주제에 대한 모든 검색은 rp_filter로 연결되며 테스트에서 전혀 도움이되지 않았습니다. 그리고 그것이 효과가 있었더라도 허용하려는 정확한 패킷에 국한되지 않습니다.

내 질문과 해결 방법을 일반 검색에 제공하여 다른 사람을 구하기 위해 검색 시간을 절약하고 막 다른 길을 잃었을뿐 아니라 여전히 열려있는 질문의 루프백 / 마티니 부분에 누군가가 답변하기를 바랍니다. 나에게.


UL 대 SF에 대한 메타 게시물을 자세히 읽으면서 Michael은 크로스 포스트하지 말 것을 요청합니다. SF에서 주제를 벗어난 주제로 표시했기 때문에 이것을 교차 게시 했으므로 원래 질문을 옮기고이 질문을 닫는 것이 더 적절하고 가능하다면 큰 도움이 될 것입니다.
Mark

/etc/sysctl.conf에 net.ipv4.conf.default.rp_filter = 0 및 net.ipv4.conf.all.rp_filter = 0을 입력하고 "sudo sysctl -p"를 수행하면 문제가 해결됩니까?
Rui F Ribeiro

나는 그것들을 직접적으로 적용하려고 시도했다. 'sysctl net.ipv4.conf.default.rp_filter = 0'(내 특정 개인용 인터페이스 포함). 나는 그들이 'sysctl -a'를 통해 설정되었음을 확인했지만, 127.0.0.1에 대한 화성 패킷은 여전히 ​​거부됩니다. 그리고 이것이 효과가 있었지만 화성인에게 모든 인터페이스를 여는 것은 내가 원하는 것이 아닙니다. 또한 단일 (Albiet Private) 인터페이스를 열고 싶지도 않습니다. 나는 내가 원하는 화성 패킷을 정확히 알고 있으며 이것을 달성하기 위해 iptables NAT / mangle 표현을 원합니다.
Mark

net.ipv4.conf.default.rp_filter = 2 및 다른 일부 iptables 규칙을 원할 수 있습니다
Rui F Ribeiro

답변:


1

127.0.0.1:5000으로 DNAT를 수행 할 때의 문제는 원격 측이 응답 할 때 이러한 패킷이 마치 로컬에서 시작된 것처럼 (127.0.0.1에서) 외부 대상 주소를 갖는 것처럼 라우팅 엔진으로 반환된다는 것입니다. 외부 인터페이스와 일치하는 SNAT / MASQUERADE는이를 포착하여 다시 작성했지만 패킷이 해당 인터페이스에 도달하기 위해 내려야하는 라우팅 결정이 먼저 이루어지며 기본적으로 가짜 패킷은 허용되지 않습니다. 라우팅 엔진은 나중에 다시 작성해야한다고 보장 할 수 없습니다.

대신 수행 할 수있는 것은 소스 주소 지정 !이전의 인수를 사용하여 192.168.1.10에서 오는 것 이외의 iptables INPUT에서 192.168.1.1:5000에 대한 외부 연결을 거부하는 것 -s입니다. TCP 재설정을 거부 메커니즘 -j REJECT --reject-with tcp-reset으로 사용하는 경우 (기본 ICMP 대상에 도달 할 수 없음) 외부와 관련하여 해당 주소 : 포트 조합에서 수신 대기중인 상황과 거의 동일합니다.


0

openVPN을 사용하여 라우터에서 RemoteGateway로 터널을 만듭니다.

그런 다음 라우터에서 경로를 추가합니다.

route add -host RemoteTarget gw RemoteGateway-VPN 주소

소스가 접근 할 수있는 포트를 제한하고자 할 때마다 간단한 iptables 규칙을 사용하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.