SSH를 다른 내부 포트로 미리 라우팅

SSH를 다른 내부 포트로 미리 라우팅

저는 로컬 Git 프로젝트를 개발 중이며 루트가 아닌 사용자를 사용하여 포트 2222에서 별도의 SSH 서비스를 실행하고 있습니다. 그 외에는 ufw 방화벽을 사용하고 포트 2222를 엽니다. 연결이 예상대로 작동하고 괜찮은지 테스트하기 위해 열었습니다.

SSH의 기본 포트는 22이고 사용자가 저장소에 액세스하기 위해 주소에 다른 포트를 쓰는 것을 원하지 않기 때문에 22에서 2222로 미리 라우팅하고 싶습니다. 그리고, Pre-Routing 중에는 포트 2222를 외부에서 접근할 수 없다는 점도 유효했으면 좋겠습니다.

기본적으로 첫 번째 부분을 완료했습니다. 트래픽을 2222에서 2222로 미리 라우팅했으며 포트 2222도 열려 있으면 제대로 작동하지만 포트 2222를 닫으려고 하면 22에 대한 연결도 작동하지 않습니다(포트 열기 규칙은 다음과 같습니다). 아직 거기 있어요). iptables는 포트 22를 2222로 변환하고 이를 ufw로 전달하는 것처럼 보이므로 이는 다소 논리적입니다. ufw는 이를 인식하고 포트 2222가 열려 있지 않기 때문에 연결을 거부합니다.

현재 이것은 ufw의 before.rules에 있는 것이며 포트 2222도 열려 있으면 작동합니다.

*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -p tcp --dport 22 -j REDIRECT --to-port 2222

포트 2222를 열지 않고도 사전 라우팅을 수행할 수 있는 방법이 있습니까?

답변1

원칙적으로는 아니오. 여기서 사용하는 것은 중요하지 않습니다 ufw. iptables 규칙을 생성하는 프런트엔드 역할만 하기 때문입니다. 알다시피 NAT 규칙은 필터링 전에 처리되므로 필터는 NAT 규칙 후에 생성된 패킷을 볼 수 있습니다. (위키피디아에는꽤 무섭게 보이는 차트패킷은 넷필터 내에서 흐르며 이는 독립적임을 의미합니다. )

다른 포트에서 서버에 액세스할 수 있게 하는 것이 큰 문제인지는 잘 모르겠습니다.

그러나 실제로 포트 2222로 직접 전송된 패킷을 삭제하려면 몇 가지 트릭, 즉 연결 태그(예: 대상 CONNMARKconnmark모듈)를 사용하여 이를 수행할 수 있습니다.

테이블 에서 nat연결에 플래그를 설정하고 대상 포트로 리디렉션합니다.

iptables -t nat -A PREROUTING -p tcp --dport 22 -j CONNMARK --set-mark 1234
iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-port 2222

(기본) 테이블 에는 filter태그가 없으면 연결이 거부됩니다.

iptables -A INPUT -p tcp --dport 2222 -m connmark ! --mark 1234 -j REJECT

다른 규칙과 충돌하지 않는 한 태그 번호가 무엇인지는 중요하지 않습니다.

(NAT 테이블에서도 규칙을 생성하는 것이 가능한지 잘 모르겠습니다 DROP. iptables v1.4.21은 이를 허용하지 않는 것 같지만 커널이 아닌 iptables 자체에서 불만이 제기됩니다 REJECT.)

답변2

나는 어떤 방식으로든 일괄 처리하거나 iptables를 직접 실행하는 것보다 구성을 사용하고 싶습니다. 나는 항상 필터 테이블의 INPUT 및 OUTPUT에 대한 기본 작업으로 DROP을 설정합니다. 그래서 내 해결책은 다음과 같습니다.

...

-A 입력 -p tcp --dport 2222 -m connmark ! --마크 1234

-A 사전 경로 -p tcp --dport 22 -j 리디렉션 --to-port 2222

필터

...

-p tcp --dport 2222 -m connmark --mark 1234 -j 수락

관련 정보