IPTables SSH 포트 리디렉션

IPTables SSH 포트 리디렉션

Ubuntu LTS 18을 실행하고 iptables를 방화벽으로 사용하는 VPS가 꽤 많습니다. 현재 저는 외부 IP 주소에서 로그인 시도가 많은 포트 22에서 SSH를 실행하고 있습니다.

IPTables를 통해 임의의 포트 번호(예: 2222)를 포트 22로 리디렉션하여 이러한 적중을 제한하고 싶습니다. 어떤 이유로 포트 2222에서 수신 대기하도록 SSH 스크립트의 구성을 조정하고 싶지 않습니다.

"보너스"로서 포트 22를 IP xxxx(현재 1.1.1.1)에만 열어 둘 수 있기를 바랍니다.

나는 다음을 시도했습니다 :

내 IP를 제외한 모든 IP 제외:

iptables -A INPUT -s 1.1.1.1/32 -i venet0 -p tcp -m tcp --dport 22 -j ACCEPT

이것은 훌륭하게 작동합니다.

이제 2222를 22로 리디렉션합니다.

iptables -t nat -A PREROUTING -i venet0 -p tcp --dport 2222 -j REDIRECT --to-port 22

이것은 작동하지 않는 것 같습니다. 리디렉션은 포트 22를 여는 경우에만 작동합니다. 그러나 항구는 모든 방문객에게 열려 있습니다.

누군가 이것을 설명할 수 있나요? 감사해요!

답변1

INPUT1개의 IP 주소만 포트 22에 액세스할 수 있도록 하고 일부 다른 포트도 로컬 포트 ​​22로 리디렉션하려는 경우 규칙은 NAT 이후에 처리되는 규칙이므로 모든 사람에게 포트 22를 열어야 합니다 REDIRECT.

한 가지 접근 방식은 다음과 같습니다.

iptables -t nat -A PREROUTING -s 1.1.1.1 --proto tcp --dport 22 -j ACCEPT
iptables -t nat -A PREROUTING --proto tcp --dport 22 -j REDIRECT --to-port 65535
iptables -t nat -A PREROUTING --proto tcp --dport 2222 -j REDIRECT --to-port 22

iptables -A INPUT --proto tcp --dport 22 -j ACCEPT
iptables -A INPUT --proto tcp --dport 65535 -j DROP

NAT 테이블이 먼저 처리되므로 PREROUTING포트 22의 소스 주소 1.1.1.1이 허용됩니다(NAT가 수행되지 않음을 의미). 포트 22에 도달하려는 다른 소스 주소는 들어오는 포트 22 패킷을 포트 65535( 안타깝게도 nat 테이블 DROP에서는 사용할 수 없음 PREROUTING)로 리디렉션하는 다음 규칙에 도달합니다.

다음으로, 포트 2222에 대한 연결은 포트 22로 리디렉션되고, 포트 22로 들어오는 모든 패킷이 허용되며, 마지막으로 포트 65535(포트 22에 대한 "다른" 연결)로 들어오는 연결이 허용됩니다.

참고 첫 번째 입력 규칙 중 하나로 다음과 같은 줄이 있다고 가정합니다.

iptables -A INPUT  -m state --state ESTABLISHED,RELATED -j ACCEPT

그렇지 않으면 나가는 연결에 소스 포트 65535가 있을 수 있으며 해당 포트에 대한 응답이 차단됩니다. 또는 65535 규칙에 일치하는 TCP 플래그를 추가하여 SYN 패킷만 일치시킵니다. 그러나 ESTABLISHED,RELATED효율성을 위해서는 패킷이 가능한 한 빨리 INPUT 체인에 들어가도록 허용하는 것이 항상 좋습니다.

-i venet0해당 인터페이스에 들어오는 패킷에만 적용되는 규칙이라면 자유롭게 추가하세요.

답변2

포트 2222에서 포트 2222로 트래픽을 전달하려면 포트 22를 열어야 합니다. ssh가 iptables 설정과 동일한 시스템에 있는 경우 SSH 소켓을 루프백 인터페이스(127.0.0.1)에 바인딩할 수 있습니다. 이렇게 하면 SSH를 유지할 수 있습니다. 포트 22에서는 공용 인터페이스의 트래픽을 로컬 시스템의 루프백으로 계속 전달할 수 있습니다.

관련 정보