이 내 꺼야 /etc/sysconfig/iptables
:
Apache에는 80개, SSH에는 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를 사용할 수 없는 경우에 대한 감독/우려를 무시하십시오.
답변1
질문이 맞다면 포트 22의 특정 IP 주소에서만 서버에 액세스할 수 있도록 하려면 다음과 같이 Iptables를 업데이트할 수 있습니다.
iptables -A INPUT -p tcp -s YourIP --dport 22 -j ACCEPT
이 경우 내부 네트워크에 대한 DNS를 열어야 하는 경우 SSH 포트를 YourIP로 열면 됩니다.
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
또는조엘규칙을 추가할 수 있다고 가정해 보겠습니다.
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
다른 답변에서는 이것을 예제에서 사용하는데 iptables -I
, 이는 일반적으로 사용해야 하는 것이 아닙니다.
iptables는 첫 번째 일치 규칙을 실행하므로 규칙의 순서가 매우 중요합니다. -I
"삽입" 명령이며 목록에서 특정 규칙의 위치를 지정하려면 index 매개변수와 함께 사용해야 합니다. -A
목록 끝에 규칙을 추가하는 "추가" 명령입니다.
일부 배포판(아마도 모두)에서는 -I
index 매개변수를 사용하지 않으면 규칙이 인덱스에 추가되어 첫 번째로 확인되는 규칙이 됩니다. 이 경우 실행한 마지막 명령이 iptables이면 iptables -I INPUT -s tcp 0.0.0.0/0 -j DROP
체인 뒤에 규칙이 있는지 여부에 관계없이 모든 트래픽을 삭제합니다.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
Rule 2에는 새로운 규칙 이 -I INPUT 2
추가되었고, Rule 3에는 DROP 규칙이 추가되었습니다.
답변3
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를 재설정할 수 있습니다.
답변4
나는 그것을 사용하고 있다우프보(간단한 방화벽) 이러한 이유로 내 설정에 기여하고 싶었습니다. Ufw는 내부적으로 iptables를 사용하지만 이와 같은 간단한 작업을 위한 더 간단한 인터페이스를 가지고 있습니다.
다음을 발행하면 됩니다.
sudo ufw allow from <your-ipv4-here> to any port 22
sudo ufw allow from <your-ipv6-here> to any port 22
그게 다야.
물론 기본적으로 다른 들어오는 트래픽을 거부하고 나가는 트래픽을 허용하도록 설정할 수도 있습니다.
sudo ufw default deny incoming
sudo ufw default allow outgoing
이것이 누군가에게 도움이 되기를 바랍니다.