iptables로 들어오는 모든 연결을 거부 하시겠습니까?


17

모든 들어오는 연결을 거부하고 나가는 것을 허용하는 간단한 iptables 규칙을 만들고 싶습니다. 어떻게해야합니까?

답변:


27

루트 액세스로 이것을 시도하십시오 :

# Set default chain policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Accept on localhost
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Allow established sessions to receive traffic
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

이것은 실행중인 모든 연결을 잔인하게 차단 합니다. 여기에는 서버를 관리하는 데 사용할 수있는 SSH 연결이 포함됩니다. 로컬 콘솔에 액세스 할 수있는 경우에만 사용하십시오.

SSH에 예외를 추가하는 방법은 Miphix의 답변을 참조하십시오.


2
내가 당신의 규칙의 첫 줄을 할 때, 나는 SSH에서 연결이 끊어졌습니다
holms

7
문제는 "SSH를 제외한 모든 수신 연결 거부"가 아니라 "모든 수신 연결 거부"입니다. :)
Yohann

나는 ... 너무 늦게 첫 번째 규칙에 대한 @holms의 경고 읽기
데니스 콜 로딘

이것은 ipv6 트래픽에 영향을 미치지 않습니다. ipv6을 활성화 한 경우 아래 답변을 읽으십시오.
bhelm

13

SSH를 통해 원격으로 작업하는 경우이를 추가 할 수 있습니다 (의 -I다른 모든 규칙 앞에 삽입 INPUT).

iptables -I INPUT -p tcp --dport 22 -j ACCEPT

SSH 서비스가 다른 포트에서 수신 대기중인 경우 대신 해당 포트를 사용해야합니다 22.

그렇지 않으면 실수로 액세스 권한이 손실 될 수 있습니다.


3

다른 답변은 IPv6에 적용되지 않습니다. 시스템이 IPv6 트래픽을 허용하는 경우 단일 iptables 규칙이 ipv6 트래픽에 적용되지 않습니다.

iptables / ip6tables를 직접 사용하는 대신 iptables-restore 및 save를 사용하는 것이 좋습니다. 이 도구를 사용하면 여러 규칙으로 iptables 구성을 지정하고 하나의 명령으로 쉽게로드 할 수 있습니다.

다음 내용으로 파일을 작성합니다 (itables.rules라는 이름).

*filter

# drop forwarded traffic. you only need it of you are running a router
:FORWARD DROP [0:0]

# Accept all outgoing traffic
:OUTPUT ACCEPT [623107326:1392470726908]


# Block all incoming traffic, all protocols (tcp, udp, icmp, ...) everything.
# This is the base rule we can define exceptions from.
:INPUT DROP [11486:513044]

# do not block already running connections (important for outgoing)
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# do not block localhost
-A INPUT -i lo -j ACCEPT

# do not block icmp for ping and network diagnostics. Remove if you do not want this
# note that -p icmp has no effect on ipv6, so we need an extra ipv6 rule
-4 -A INPUT -p icmp -j ACCEPT
-6 -A INPUT -p ipv6-icmp -j ACCEPT

# allow some incoming ports for services that should be public available
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

# commit changes
COMMIT

참고 ICMP 및 특정 포트로의 트래픽을 허용하려는 경우 몇 가지 추가 예를 추가했습니다.

이제 다음 명령으로로드 할 수 있습니다.

iptables-restore < iptables.rules
ip6tables-restore < iptables.rules

이제 규칙은 ipv6에도 적용되며 관리가 쉽습니다.

데비안 사용자에 대한 추가 참고 사항 : 규칙에 만족하면 apt install iptables-persistent재부팅 후 규칙을 복원 할 수 있습니다 . 종료시 규칙이 자동 저장되지 않으므로 netfilter-persistent save영구 규칙을 업데이트하기 위해 실행 하십시오.


1

위의 두 답변 모두 어떻게 든 정확하지만 답변을 도출 할만큼 정확하지 않습니다. (죄송 합니다만, 평판을 추가 할만한 평판이 충분하지 않으므로 완전한 답변을 작성하십시오).

내 경우에는 과부하 된 아파치 서버를 만났으며 cron 작업으로 과도하게 플로팅되어 CPU를 과도하게 사용했습니다. 스레드 제한은 SQL 데이터베이스에 저장되었지만 연결 제한을 충족했습니다. 로컬 호스트에서 들어오는 아파치 연결을 제한하고 싶었지만 (이 부분은 선택 사항 임) 다른 모든 연결은 가능하게 유지하십시오. 실제로 설립 된 것을 포함합니다.

나는 명령으로 그것을했다

sudo iptables -I INPUT -p tcp --dport 80 -m state --state NEW -j REJECT

이는 포트 80의 각 수신 tcp 패키지에 대해 state모듈을 로드 하고 이것이 첫 번째 패키지 (수신 연결) 인 경우 거부합니다. localhost의 경우 그냥 사용할 수 있습니다-s 127.0.0.0/8

그리고 실제 사용의 경우 NEW,INVALID규칙에 우회하여 "악의적 인"패키지를 보낼 수 있기 때문에 'INVALID'를 상태에 추가 할 수도 있습니다 . 또한 -j DROP아웃 바운드 트래픽을 절약하기 위해 대체 합니다 (거부 신호를 보내지 않음)

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