SSH 포트가 특정 IP 주소에만 열려 있는지 확인하는 방법은 무엇입니까?


42

이것은 내 /etc/sysconfig/iptables:

ssh를 위해 80 개의 아파치와 22 개의 포트가 있습니다.

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

포트 22 (SSH)의 경우 특정 IP 주소를 제외하고 아무도이 포트에 연결할 수 없도록하고 싶습니다.

예 ip :

1.2.3.4

내 IP가 변경되어 더 이상 서버에 SSH로 연결할 수없는 경우에 대한 감독 / 관심 사항을 무시하십시오.

답변:


47

올바른 방법으로 질문을 받으면 포트 22의 특정 IP 주소에서만 서버에 도달 할 수 있기를 위해 Iptable을 업데이트 할 수 있습니다.

iptables -A INPUT -p tcp -s YourIP --dport 22 -j ACCEPT

이 경우 내부 네트워크에 대해 DNS를 열어야하는 경우 YourIP로만 ssh 포트를 열어야합니다.

iptables -A INPUT -p udp -s YourIP --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -s YourIP --dport 53 -j ACCEPT

해당 IP에 대해 추가하고 열면 나머지 IP의 문을 닫아야합니다.

iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j DROP
iptables -A INPUT -p udp -s 0.0.0.0/0 --dport 53 -j DROP
iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 53 -j DROP

(규칙 세트에서 규칙을 올바른 위치에 설정하십시오. 현재 iptables -A INPUT규칙을 끝에 추가하십시오 INPUT.)

또는 joel이 말했듯이 대신 하나의 규칙을 추가 할 수 있습니다.

iptables -A INPUT -p tcp ! -s <permittedIP> -j DROP

또는 방화벽으로 기본 정책을 설정할 수 있습니다.

iptables -P INPUT DROP

SO에 대한이 질문에 간략히 설명되어 있습니다 .

iptables -A INPUT -p tcp --dport 22 -s YourIP -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

2
또한 iptablestarget을 수행하려는 경우 bang 연산자로 반전 을 지원 한다는 점도 주목할 가치가 DROP있습니다. 예 :iptables -I INPUT -p tcp ! -s <permittedIP> -j DROP
Bratchley

1
또한 무조건적인 DROP것은 실제로 필요하지는 않습니다. 방화벽에 기본 정책을 설정하고 iptables -P INPUT DROP그에 도달하게하십시오. 이러한 방식으로 수행하면 추가로 수행하고 싶을 수도 있습니다. 그렇지 않으면 모든 트래픽이 규칙에 DROP도달하지 않습니다 ACCEPT.
Bratchley

1
-I (삽입)의 기본값은 규칙 # 1로 삽입하는 것이므로 DROP가 규칙 # 1로 삽입되고 먼저 평가되므로 모든 ssh 패킷을 삭제하므로 ACCEPT 규칙을 평가하지 않습니다. 실행해야 iptables -I INPUT 3 -p tcp -s 0.0.0.0/0 --dport 22 -j DROP하고 iptables -I INPUT 3 -p udp -s 0.0.0.0/0 --dport 53 -j DROPINPUT 뒤에 "3"은 INPUT 규칙 # 3으로 삽입됨을 의미합니다 (두 개의 ACCEPTS를 삽입한다고 가정하고 그렇지 않으면 하나의 ACCEPT 인 경우 "2"를 INPUT에 사용함
Kevin Triplett

@Networker Using -I는 새로운 iptables 규칙을 맨 위에 삽입합니다. 따라서 허용하기 전에 낙하가 발생할 수 있습니다. 내가 사용하는 것이 좋습니다 -A대신
BlueCacti

1
글쎄, 난 자신을 잠겨, gj
ngwdaniel

6

SSH 키를 사용하는 것이 좋지만 설명하겠습니다.

달성하려는 목적으로 IPtables를 사용할 필요는 없으며 여러 가지 방법이 있습니다. 이것은 IPtables 방식입니다.

iptables -I INPUT -s [YOUR_HOME_IP] -p tcp -m tcp --dport [SSH_PORT] -j ACCEPT

[YOUR_HOME_IP] = 귀하의 홈 IP (꽤 간단)

[SSH_PORT] = SSH를 실행하는 포트 (기본적으로 22)

iptables -I INPUT -p tcp -m tcp --dport [SSH_PORT] -j REJECT

이렇게하면 IP를 제외한 어느 누구도 SSH에 로그인 할 수 없습니다.

에 다른 방법을 추가하는 방법이 있습니다 sshd_config.

다음을 추가하십시오.

AllowUsers root@[YOUR_HOME_IP]
PermitRootLogin without-password

이를 통해 root비밀번호를 요구하지 않고 IP 에서 사용자 로 SSH에 로그인 할 수 있습니다 .

함께 cronjob을 명심하십시오

iptables -X
iptables -F

SSH를 사용하여 서버에서 잠기지 않도록 똑똑 할 수 있습니다 (cronjob은 IPtables를 재설정하므로 다시 액세스 할 수 있습니다). 여전히 액세스 권한이 있으면 cronjob을 제거하고 IPtables를 다시 설정할 수 있습니다.


cronjob은 방화벽을 제거합니다. iptables처음에 왜 설정 합니까? 대역 외 액세스의 일부 형태는 일반적인 방법입니다. knockd또 다른 것입니다.
Matt

@mtm 예, cronjob이 잠기면 ctable이 IPtables 설정을 재설정하므로 SSH에 다시 액세스 할 수 있습니다. 사람들이 IPtables를 사용하는 이유가 다른 이유는 그것이 효과적이고 간단하며 유연한 방화벽이라는 것입니다.
윌리엄 에드워즈

2
oic. 정기적으로 예약하지 않고 설정 시간에 한 번 플러시를 실행해야합니다. at것을 수행.
Matt

4
IP 만 허용 한 다음 비밀번호없이 루트 로그인을 허용하는 것은 끔찍한 생각처럼 보입니다.
Alex W

1
@AlexW 나는 그것이 오래되었다는 것을 알고 있지만 여전히 의견을 말하고 싶었습니다 : Without-Password암호 인증이 허용되지 않는다는 것을 의미하므로 대신 SSH 키 인증을 사용해야합니다. 실제로이 인증 방법의 이름이 불분명합니다. 그러나 이것이 루트로 로그인하기 위해 비밀번호가 필요하지 않다는 것을 의미하지는 않습니다. 그럼에도 불구하고 PermitRootLogin no루트는 일반적인 대상 이기 때문에보다 안전한 방법은 다른 sudo 계정 을 설정 하고 사용하여 로그인하는 것입니다.
BlueCacti

5

다른 답변은 iptables -I예제에서 사용 하고 있으며 종종 사용하지 않아야합니다.

iptables는 일치하는 첫 번째 규칙을 실행하므로 규칙 순서가 매우 중요합니다. -I"삽입"명령이며 색인 매개 변수와 함께 사용하여 목록에서 지정된 규칙이 속하는 위치를 지정해야합니다. -A"append"명령으로, 규칙을 목록 끝에 추가합니다.

일부 -I매개 변수 (아마도 모두) 에서 index 매개 변수없이 사용 하면 규칙을 색인 1에 추가하여 첫 번째 규칙을 확인합니다. 이 시나리오에서 마지막으로 실행 한 명령 인 경우 iptables -I INPUT -s tcp 0.0.0.0/0 -j DROPiptables는 ACCEPT나중에 체인에 규칙 이 있는지 여부에 관계없이 모든 트래픽을 삭제합니다 .

다음은 단일 IP의 SSH 만 허용하는 규칙을 설정하는 샘플입니다.

규칙없이 시작 :

#> iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

새로운 "1.2.3.4에서 SSH 허용"규칙을 추가하십시오.

#>iptables -A INPUT -p tcp -s 1.2.3.4 --dport 22 -j ACCEPT

다른 모든 IP에서 SSH를 차단하십시오.

#>iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j DROP

이제 INPUT 체인은 다음과 같습니다

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  1.2.3.4              0.0.0.0/0            tcp dpt:22
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

나중에 두 번째 IP를 허용 목록에 추가해야하는 경우 -I매개 변수를 사용 하여 차단 목록 규칙 앞에 배치 할 수 있습니다 .

#>iptables -I INPUT 2 -p tcp -s 4.3.2.1 --dport 22 -j ACCEPT

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  1.2.3.4              0.0.0.0/0            tcp dpt:22
ACCEPT     tcp  --  4.3.2.1              0.0.0.0/0            tcp dpt:22
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

를 사용 -I INPUT 2하면 새 규칙이 규칙 번호 2로 추가되고 DROP 규칙이 번호 3으로 충돌했습니다.

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