웹사이트 검색

Ubuntu에서 포트 노킹을 사용하여 SSH 포트를 숨기는 방법


이 페이지에서

  1. 1단계: 필요한 모든 패키지가 설치되었는지 확인\n
  2. 2단계: iptables에 규칙 추가
  3. 3단계: knockd가 실행 중일 때 서버에 액세스\n
    1. 텔넷 클라이언트로 노킹 테스트

    한 남자가 문을 두드리는 시퀀스를 사용하여 들어가는 오래된 갱스터 영화를 모두 알고 있습니까? 포트 노킹은 바로 귀하의 서버를 위한 것입니다. 기본 ssh 포트를 변경한다고 해서 해킹당하지 않는다는 보장은 없습니다. 해커는 종종 도구를 사용하여 서버를 공격하기 전에 열린 포트에 대한 자동 스캔을 수행합니다. 포트 노킹은 포트 스캐너로부터 자신을 방어할 수 있는 방법입니다. 클라이언트가 올바른 순서로 다른 포트 시퀀스에 미리 액세스할 때까지 보호된 포트에 대한 액세스를 거부합니다.

    Ubuntu에 포트 노킹을 설치하는 것은 쉽습니다. 이 기사에서는 포트 노킹을 설치하고 설정하는 방법을 보여 드리겠습니다. 이 자습서의 단계는 Debian 8에서도 작동합니다.

    1단계: 필요한 모든 패키지가 설치되어 있는지 확인

    아래의 모든 명령은 루트 사용자로 실행되지 않습니다. 모든 명령에 sudo를 사용하고 싶지 않으므로 다음을 사용합니다.

    sudo su

    루트 사용자가 되기 위해. 첫 번째 단계는 Ubuntu 패키지 목록을 업데이트하는 것입니다.

    apt-get update

    그런 다음 SSH 서버를 설치합니다(아직 설치하지 않은 경우).

    apt-get install openssh-server

    이제 포트 노킹을 제어하는 데몬인 knockd 소프트웨어를 설치합니다.

    apt-get install knockd
    Get:1 http://security.debian.org wheezy/updates Release.gpg [1,554 B]
    Get:2 http://security.debian.org wheezy/updates Release [102 kB]
    Get:3 http://security.debian.org wheezy/updates/main amd64 Packages [336 kB]
    Hit http://mirrors.linux-console.net wheezy Release.gpg
    Hit http://mirrors.linux-console.net wheezy Release
    Get:4 http://security.debian.org wheezy/updates/main Translation-en [195 kB]
    Hit http://mirrors.linux-console.net wheezy/main amd64 Packages
    Hit http://mirrors.linux-console.net wheezy/main Translation-en
    Fetched 635 kB in 1s (358 kB/s)
    Reading package lists... Done
    :~# apt-get install openssh-server
    Reading package lists... Done
    Building dependency tree
    Reading state information... Done
    The following extra packages will be installed:
    openssh-client
    Suggested packages:
    ssh-askpass libpam-ssh keychain monkeysphere rssh molly-guard ufw
    The following packages will be upgraded:
    openssh-client openssh-server
    2 upgraded, 0 newly installed, 0 to remove and 32 not upgraded.
    Need to get 1,364 kB of archives.
    After this operation, 0 B of additional disk space will be used.
    Do you want to continue [Y/n]? 

    계속하려면 Y를 누른 다음 Enter를 누르십시오.

    패키지를 설치한 후 iptables 커널 방화벽을 설치해야 합니다. 달리다:

    apt-get install iptables

    2단계: iptables에 규칙 추가

    먼저 기존 방화벽 규칙을 플러시하고 나가는 연결이 끊어지지 않도록 합니다.

    iptables --flush
    iptables -t nat --flush
    iptables -t mangle --flush
    iptables --policy OUTPUT ACCEPT

    방화벽을 통해 설정된 모든 연결과 진행 중인 세션을 허용해야 합니다. 그렇지 않으면 방화벽이 현재 SSH 세션을 차단합니다.

    iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

    참고: 위 규칙은 STABLISHED,RELATED에서 쉼표 양쪽에 공백이 없습니다.

    그런 다음 다음 규칙을 사용하여 들어오는 포트 22(SSH)를 차단합니다.

    iptables -A INPUT -p tcp --destination-port 22 -j DROP

    iptables 규칙을 설정하면 iptables-persistent를 사용하여 재부팅 시 복원 프로세스를 자동화할 수 있습니다. Ubuntus 기본 저장소에서 다운로드할 수 있습니다.

    apt-get install iptables-persistent
    Current iptables rules can be saved to the configuration file ?
    ? /etc/iptables/rules.v4. These rules will then be loaded automatically ?
    ? during system startup. ?
    ? ?
    ? Rules are only saved automatically during package installation. See the ?
    ? manual page of iptables-save(8) for instructions on keeping the rules ?
    ? file up-to-date. ?
    ? ?
    ? Save current IPv4 rules?
    Current iptables rules can be saved to the configuration file ?
    ? /etc/iptables/rules.v6. These rules will then be loaded automatically ?
    ? during system startup. ?
    ? ?
    ? Rules are only saved automatically during package installation. See the ?
    ? manual page of ip6tables-save(8) for instructions on keeping the rules ?
    ? file up-to-date. ?
    ? ?
    ? Save current IPv6 rules?

    설치하는 동안 프로그램은 현재 iptables 규칙(ipV4 및 ipV6)을 저장하라는 메시지를 표시합니다. 둘 다 예를 선택하면 됩니다.

    iptables-save 명령을 사용하여 현재 규칙 세트를 파일에 저장합니다. 이 파일은 나중에 iptables-restore에서 동일한 iptables 설정을 복원하는 데 사용할 수 있습니다.

    iptables-save
     # Generated by iptables-save v1.4.14 on Tue Feb 23 04:59:28 2016
    *filter
    :INPUT ACCEPT [1:40]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [17:1976]
    -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A INPUT -p tcp -m tcp --dport 22 -j DROP
    COMMIT
    # Completed on Tue Feb 23 04:59:28 2016

    이제 SSH 포트에서 다른 연결을 차단하면서 기존 연결에 연결된 상태를 유지합니다.

    다음으로, knockd를 구성해야 합니다.

    서비스를 구성하려면 /etc/knockd.conf 구성 파일을 편집해야 합니다. nano로 파일을 엽니다.

    nano /etc/knockd.conf

    다음과 같은 섹션이 표시됩니다.

    [options]
    UseSyslog

    [openSSH]
    sequence = 7000,8000,9000
    seq_timeout = 5
    command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
    tcpflags = syn

    [closeSSH]
    sequence = 9000,8000,7000
    seq_timeout = 5
    command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
    tcpflags = syn

    • "options" 섹션에 지시문 이름 UseSyslog가 표시됩니다. 로그 파일은 상당히 명확합니다. 모든 노크 시도를 기록합니다.\n
    • Ungerneath에는 openSSH와 closeSSH의 두 섹션이 있습니다. 첫 번째는 노커가 포트 22(SSH)에 액세스하도록 허용하고 두 번째는 노커가 완료되면 포트를 닫습니다.\n
    • knockd는 자동으로 %IP%를 노크를 보낸 클라이언트의 IP 주소로 대체하므로 인증된 클라이언트에게만 포트를 열 수 있습니다.\n

    sequence = 9000,8000,7000

    즉, 동일한 IP가 포트 7000에서 연결을 요청한 다음 포트 8000, 마지막으로 포트 9000에서 연결을 요청하는 경우 이 규칙 집합이 일치한다는 의미입니다. 공격자에게도 알려져 있습니다.

    seq_timeout = 5

    "seq_timeout" 옵션은 노크에 대한 모든 숫자를 제공할 수 있는 시간을 초 단위로 정의합니다. 이 기본값은 양호해야 하며 노크를 자동으로 생성하는 경우 문제가 되지 않습니다.

    command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

    클라이언트가 올바른 포트 노크를 할 때 실행할 명령을 지정합니다. %IP%의 모든 인스턴스는 두드리는 사람의 IP 주소로 대체됩니다.

    tcpflags = syn

    이 플래그를 설정하는 데 사용해야 하는 패킷(이 경우에는 syn 패킷)에 주의하십시오. TCP 플래그를 사용할 때 knockd는 플래그와 일치하지 않는 tcp 패킷을 무시합니다.

    이제 노크를 활성화하십시오. nano를 사용하여 /etc/default/knockd 파일을 편집합니다.

    nano /etc/default/knockd
    START_KNOCKD=0
    

    에게

    START_KNOCKD=1
    

    이 저장 후 종료하십시오. 네트워크 어댑터가 여러 개 있거나 시스템 시작 중에 knockd가 자동으로 시작되지 않는 문제가 발생하는 경우 두 번째 줄 KNOCKD_OPTS의 주석을 제거하고 수정하여 수신 대기할 네트워크 인터페이스를 수동으로 지정할 수 있습니다.

    그런 다음 수동으로 노크를 시작합니다.

    service knockd start

    이렇게 하면 데몬이 시작되고 포트 시퀀스를 노크하여 iptables 규칙 세트를 변경할 수 있습니다.

    필요한 패키지를 설치했습니다. 서버와의 연결이 끊어진 경우 다시 연결하려면 올바른 순서로 정의한 포트를 두드려 SSH 연결을 설정해야 합니다.

    3단계: knockd가 실행 중일 때 서버에 액세스

    위의 단계를 따랐다면 더 이상 포트 노킹 없이 SSH 서버에 직접 연결할 수 없습니다.

    서버로부터 응답이 없어야 하고 SSH 클라이언트가 시간 초과되어야 합니다. 현재 SSH 데몬이 iptables에 의해 차단되어 있기 때문입니다. SSH 시도가 자동으로 시간 초과되지 않으면 ctrl-C를 입력하여 SSH 시도를 종료하십시오.

    텔넷 클라이언트로 노킹 테스트

    Linux 사용자의 경우: apt로 telnet 패키지를 설치합니다.

    Windows 사용자의 경우: "프로그램\ 섹션에 액세스하여 텔넷 클라이언트를 설치하고 "Windows 기능 켜기 또는 끄기"를 검색한 다음 여기에서 텔넷 클라이언트를 활성화할 수 있습니다.

    명령 프롬프트에 다음 명령을 입력합니다(포트 시퀀스를 사용자 지정 시퀀스로 교체).

    telnet youripaddress 7000
    telnet youripaddress 8000
    telnet youripaddress 9000

    구성에 부과된 시간 제한 때문에 이 모든 작업을 5초 안에 수행해야 합니다. 이제 SSH를 통해 서버에 연결을 시도합니다. 연결에 액세스할 수 있습니다.

    위의 명령을 역순으로 실행하여 SSH 서버를 닫습니다.

    telnet youripaddress 9000
    telnet youripaddress 8000
    telnet youripaddress 7000

    포트 노킹의 가장 좋은 점은 개인 키 인증과 함께 구성할 수 있다는 것입니다. 두 가지를 모두 구성하면 포트와 개인 키를 모두 알고 있지 않는 한 누군가가 액세스 권한을 얻거나 연결할 가능성이 거의 없습니다.