답변:
루트 액세스로 이것을 시도하십시오 :
# 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의 답변을 참조하십시오.
다른 답변은 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
영구 규칙을 업데이트하기 위해 실행 하십시오.
위의 두 답변 모두 어떻게 든 정확하지만 답변을 도출 할만큼 정확하지 않습니다. (죄송 합니다만, 평판을 추가 할만한 평판이 충분하지 않으므로 완전한 답변을 작성하십시오).
내 경우에는 과부하 된 아파치 서버를 만났으며 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
아웃 바운드 트래픽을 절약하기 위해 대체 합니다 (거부 신호를 보내지 않음)