iptables : 특정 IP를 허용하고 다른 모든 연결을 차단


26

iptables에서 특정 IP를 허용하고 다른 모든 연결을 차단하려면 어떻게해야합니까?


으로 질이 보여 개념은 다음과 같이 간다 : 당신은 소스 IP 또는 기타 자격으로, 다음 거부 할 기본 정책을 설정 여부를 허용 할 각각의 특정 일에 대한 규칙을 수락 추가합니다.
Caleb

답변:


27

내가 쓴 데스크탑 사용자를위한 기본의 iptables 규칙에 대한 블로그 게시물을 오래 전에 당신은 아마도 그것을 읽어야하고,에 링크 된 기사 스테이트 설계 방화벽 . 그러나 커널 2.6.39 이전 ( ipset10 개가 넘는 화이트리스트가있는 경우 IP를 화이트리스트에 사용하고 싶을 수도 있습니다 (여기서 10은 임의 임)).

먼저 처리 상태는 수락 또는 삭제하려는 것으로 알고 있으며 인터페이스입니다.

iptables -P FORWARD DROP # we aren't a router
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s 192.168.1.1 -j ACCEPT
iptables -P INPUT DROP # Drop everything we don't accept

상태없이 IP로만 허용하려는 경우

iptables -A INPUT -s 192.168.1.1 -j ACCEPT
iptables -A OUTPUT -d 192.168.1.1 -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP

그래도 문제를 겪을 가능성이 높으며, 생활을 편하게하기 위해 상태를 사용하는 것이 좋습니다. 예를 들어, 허용하지 않는 -i lo-o lo확실히 특정 응용 프로그램에 문제가 발생합니다.


4
DROP 대신 원치 않는 패킷을 거부해야합니다. 문제를 훨씬 쉽게 진단하고 시간 초과를 방지하기 때문입니다. ICMP 오류가있는 IP 패킷 거부를
Gilles 'SO- 악마 그만해'

두 가지 설정을 모두 시도했는데 KeePass2가 시작되지 않습니다. 내가 할 경우에도 iptables -F모든 규칙을 취소되어 있음을, 심지어 ubuntu.com를 Ping 할 수
파블 Cioch

@PawelCioch 왜 KeePass2에 인터넷 연결이 필요한가요?
Alex

@Alex는 원격 위치에 DB 파일을 저장하기 위해 단일 IP를 원합니다. 그러나 저는 모든 것을 알아 냈습니다. 설정은 여기 예제보다 더 복잡합니다
Pawel Cioch

10

다음은 들어오는 연결 만 차단하는 (예상치 않은) 예입니다 . 192.168.3.x, ICMP 또는 SSH 포트에서 오는 루프백 인터페이스를 통한 연결이 허용됩니다. 다른 모든 연결은 거부됩니다.

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 192.168.3.0/24 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -j REJECT

@Gilles RELATED 및 ESTABLISHED 상태를 올바르게 사용하려면 초기 패킷을 NEW 상태로 일치시켜야합니다. lo위의 예에서 상태 일치에서 제외되고 항상 허용됩니다.
penguin359

@ penguin359 : 왜 NEW가 필요한지 자세히 설명해 주시겠습니까? 나는 iptables 전문가와 거리가 멀다.이 규칙은 NEW와 일치하지 않는 홈 라우터에서 부분적으로 복사했다. 내가 이해하는 한, 첫 번째 규칙 이후 남은 모든 것은 어쨌든 NEW (또는 UNTRACKED) 패킷입니다. (마크가 너무 멀어서 설명에 설명 할 수없는 경우 설명으로 설명을 포함하여 버전을 게시하면 지울 것입니다.)
Gilles 'SO-Stop be evil'Apr

@Gilles 나는 아무것도 받아들이 기 전에 항상 INVALID 상태를 삭제합니다 ... INVALID, RELATED, ESTABLISHED가 아닌 것을 NEW 상태로 만들어야합니다. 그러나 다른 모든 것이 NEW를 지정 해야하는 이유는 모르겠습니다. 이론적으로 INVALID를 처리하지 않고 NEW를 지정하지 않으면 INVALID를 수락 할 수 있습니다. 그러나 일단 INVALID가 처리되면 모든 규칙에서 NEW 상태를 확인하는 데 단순히 패킷 처리가 더 필요한 것 같습니다.
xenoterracide

@Gilles는 또한 거부의 기본 정책이 좋지 않습니다. 수신되는 모든 패킷에 대해 거부 패킷을 전송하기 때문에 DOS 공격이 복잡합니다.
xenoterracide

@ xenoterracide : 좋은 지적입니다. 거부를 사용해야합니까? 나는 물었다 : ICMP 오류가있는 IP 패킷을 거부하거나 그냥 버려?
Gilles 'SO- 악한 중지'

7

아래 규칙은 IP 만 허용하고 포트 22 또는 ssh를 통한 다른 모든 IP는 차단합니다. 연결을 끊기 전에 새 단자로 테스트하십시오.

iptables -I INPUT -p tcp ! -s yourIPaddress --dport 22 -j DROP

3
간결한 답변에 감사드립니다. 몇 가지 IP 및 IP 범위를 허용하려는 경우 어떻게 변경합니까? 대신 yourIPaddress몇 개의 IP 주소와 범위를 추가 할 수 있습니까? 그리고 2888과 같은 비표준 포트에서 SSH를 사용하는 경우 명령은 22예에서 2288? 또한 허용 된 IP를 제외한 모든 IP에서이 서버에 대한 rsync, sftp 등을 차단합니까?
PKHunter

1
참고 -p tcp때문에 여기서 중요한 --dport없이 작동하지 않습니다. 포트를 닫힌 포트와 동일하게 만들고 해당 포트 로 향하는 패킷을 블랙홀로 만들기 때문에 -j REJECT대신 사용 하는 것이 좋습니다 . 실제로 원격 공격자는 실제로 닫힌 포트에서 구성된 포트를 탐지 할 수 있습니다. DROPREJECTDROPDROP
Mikko Rantalainen

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