웹 서버에 대한 좋은 iptables 시작 규칙?


12

새 centos 5.4 서버를 설치하고 있으며 mutabletables을 시작하기위한 규칙을 정리하고 싶습니다.

좋은 규칙은 무엇입니까?

이것이 좋은 출발점입니까?

# Allow outgoing traffic and disallow any passthroughs

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

# Allow traffic already established to continue

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow ssh, ftp and web services

iptables -A INPUT -p tcp --dport ssh -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport ftp -i eth0 -j ACCEPT
iptables -A INPUT -p udp --dport ftp -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport ftp-data -i eth0 -j ACCEPT
iptables -A INPUT -p udp --dport ftp-data -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -i eth0 -j ACCEPT

# Allow local loopback services

iptables -A INPUT -i lo -j ACCEPT

# Allow pings

iptables -I INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -I INPUT -p icmp --icmp-type source-quench -j ACCEPT
iptables -I INPUT -p icmp --icmp-type time-exceeded -j ACCEPT

이 규칙은 무엇입니까?

iptables -A INPUT -p tcp --dport domain -i eth0 -j ACCEPT

업데이트 :

FTP (필수), 아파치, SSH, mysql을 갖춘 웹 서버가 될 것입니다.


이 간단한 규칙을 사용합니다 .... 모든 것을 닫고 뒤로 일하고 필요한 것을 엽니 다. 웹 서버의 경우 일반적으로 포트 80/443이 유일한 공용 서비스입니다. 다른 모든 것을 차단하거나 액세스를 제한하십시오 (예 : ssh를 지정된 IP 또는 개인 네트워크로 제한).
jeffatrackaid

답변:


13

IPTables 규칙은 대부분 서버에 적합한 것으로 보입니다. 그러나 몇 가지 가능한 변경 사항을 제안합니다.

  • 전체 인터넷에서 SSH, MySQL 및 FTP 액세스를 허용하지 않는 한 '--source'옵션을 사용하여 승인 된 특정 IP 주소에서만 해당 포트에 대한 액세스를 제한하는 것이 훨씬 안전합니다. 예를 들어 IP 주소 71.82.93.101에서 SSH 액세스 만 허용하려면 다섯 번째 규칙을 'iptables -A INPUT -p tcp --dport ssh --source 71.82.93.101 -i eth0 -j ACCEPT'로 변경합니다. 허용하려는 각 개별 IP 주소에 대해 별도의 규칙을 추가해야 할 수도 있습니다. iptables multiple source IPs 에 대한 자세한 내용은이 질문을 참조하십시오 .

  • 이 컴퓨터에서 DNS 서버를 실행하지 않으면 '도메인'(53) 포트에 대한 액세스를 차단하고 싶을 것입니다. 이렇게하려면 'iptables -A INPUT -p tcp --dport domain -i eth0 -j ACCEPT'줄을 제거하십시오. (이것은 최종 질문 인 BTW에도 답해야합니다.) 실제로 DNS 서버를 실행중인 경우이 규칙을 그대로 두십시오.

  • 네트워크를 통한 원격 MySQL 클라이언트 액세스를 허용해야하는 경우 'iptables -A INPUT -p tcp --dport 3306 -i eth0 -j ACCEPT'행을 추가하여 표준 MySQL 포트에 대한 외부 액세스를 열어야합니다. . 그러나 실제로 필요한 경우가 아니라면이 작업을 수행하지 마십시오. 로컬 MySQL 액세스 만 필요하면 (Apache에서 실행되는 PHP 앱의 경우) 원격 MySQL 액세스를 제공 할 필요가 없습니다. 그리고 해킹 당할 위험이 없다면, 포트 3306을 네트워크에 열면 모든 MySQL 사용자 계정에 강력한 암호가 필요하고 MySQL 서버 패키지가 최신 상태인지 확인하십시오.

  • 귀하의 의견 중 하나 ( 'ssh, dns, ldap, ftp 및 웹 서비스 허용')에 LDAP 서비스가 언급되어 있지만 구성에는 이러한 규칙이 없습니다. 예제 구성을 복사하고 수정하면 많은 일이 발생합니다. 이 기능은 기능에 영향을 미치지 않지만 주석을 수정합니다. 오해의 소지가있는 의견은 나중에 귀 하나 다른 관리자를 혼란스럽게함으로써 간접적으로 발생할 수 있기 때문입니다.

내 경험상 완벽한 IPTables 규칙 세트를 마련하기는 어렵지만 확실히 올바른 길을 가고 있다고 생각합니다. 또한 IPTable에 대한 자세한 내용은 행운을 빕니다.이 규칙은 처음에는 복잡해 보일 수 있지만 모든 Linux sysadmin에게는 매우 유용한 기술입니다.


1
방화벽을 통한 원격 MySQL 액세스를 허용하는 대신 MySQL 서버에 액세스해야하는 모든 사람에게 SSH 포트를 전달할 수있는 권한이 있는지 확인할 수 있습니다.
ptman

SSH 포트 전달은 포트를 열고 MySQL 권한을 잠그는 대신 사용할 수있는 대안입니다. 그러나 민감한 데이터를 다루지 않거나 SSH의 암호화 기능을 유용하게 만드는 주요 대상이 아니라면 이점이 없습니다. 결국 SSH 터널링에는 다음과 같은 단점이 있습니다. setup / config 번거 로움; CPU 사용률 증가 및 대역폭 제한 (OpenSSH의 정적 버퍼 크기로 인해). 그리고 모든 원격 MySQL 클라이언트가 로컬 로그인을 원하지 않게하려면 어떻게해야합니까?
Ryan B. Lynch

규칙과 일치하지 않는 주석이있는 한 ICMP 규칙은 추적 경로, PMTU 검색 및 기타 유용한 메시지를 허용 하지만 핑 (echo-request 및 echo-reply)은 허용 하지 않습니다 .
Gerald Combs

제럴드, 그거 잘 잡았어. 주석을 변경하여 ping이 허용되지 않거나 ICMP 에코 요청 / 응답 트래픽을 허용하는 규칙을 추가해야합니다.
Ryan B. Lynch

4

아웃 바운드 트래픽도 확실히 제한하십시오.

PHP 악용으로 인해 누군가가 'curl'또는 'wget'을 사용하여 다른 곳에서 악성 코드를 가져온 다음 서버에서 실행하여 봇넷에 참여하는 경우가 많이있었습니다.

Apache (예 :)가 다른 웹 사이트 자체와 통신 할 필요가 없다면 트래픽을 제한하고 약간의 고통을 덜어주십시오!


2

이러한 규칙은 "iptables-restore"를 통해 가져올 수 있습니다.

*filter
:INPUT DROP [20:2036]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [93:16260]
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT -m comment --comment "allow ICMP: echo-reply"
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT -m comment --comment "allow ICMP: echo-request"
-A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT -m comment --comment "allow ICMP: destination-unreachable"
-A INPUT -p icmp -m icmp --icmp-type 4 -j ACCEPT -m comment --comment "allow ICMP: source-quench"
-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT  -m comment --comment "allow ICMP: time-exceeded"
-A INPUT -i lo -j ACCEPT -m comment --comment "allow input from the loop-back adapter"
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT -m comment --comment "allow SSH: ssh"
-A INPUT -i eth0 -p tcp -m tcp --dport 53 -j ACCEPT -m comment --comment "allow DNS: domain"
-A INPUT -i eth0 -p tcp -m udp --dport 53 -j ACCEPT -m comment --comment "allow DNS: domain"
-A INPUT -i eth0 -p tcp -m tcp --dport 21 -j ACCEPT -m comment --comment "allow FTP: ftp"
-A INPUT -i eth0 -p udp -m udp --dport 21 -j ACCEPT -m comment --comment "allow FTP: ftp"
-A INPUT -i eth0 -p tcp -m tcp --dport 20 -j ACCEPT -m comment --comment "allow FTP: ftp-data"
-A INPUT -i eth0 -p udp -m udp --dport 20 -j ACCEPT -m comment --comment "allow FTP: ftp-data"
-A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT -m comment --comment "allow MariaDB/MySQL: mysql"
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT -m comment --comment "allow HTTP (apache/nxing/lighttpd)"
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT -m comment --comment "allow HTTPS (apache/nxing/lighttpd)"
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT  -m comment --comment "allow already established connections"
COMMIT

위의 iptables-restore를 사용하지 않는 경우 기록을 위해 ...이 기본 정책도 설정해야합니다.

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

게시물을 편집했습니다. StackOverflow는 질문 / 답변 형식입니다. FAQ를 읽으십시오 : stackoverflow.com/faq
89c3b1b8-b1ae-11e6-b842-48d705

상태 저장 규칙이 여기에 마지막으로 나타나기 때문에 성능 문제가 발생하며, 대부분의 패킷과 일치하므로 처음에 나타나야합니다.
마이클 햄튼

0

왜 ftp와 dns를 허용합니까? 서버가 이러한 서비스를 제공합니까? FTP는 매우 구체적인 사용 사례를 제외하고 FTPS가 아닌 SFTP를 대신 사용하는 것을 제외하고는 실제로 사용해서는 안됩니다. 또한 다른 모든 포트를 기호 이름으로 지정하고 http를 숫자 80으로 지정하는 이유는 무엇입니까? 방금 다른 곳에서 이것을 복사 했습니까? 복사와 조언은 이해의 부족을 보완 할 수 없습니다. TCP, IP, 방화벽 및 제공 할 서비스의 프로토콜을 이해해야합니다.


ptman의 기분을 상하게하는 것은 아니지만 귀하의 답변은 다소 무례하고 모호한 것으로 보일 수 있습니다. 또한, 당신은 실제로 질문에 대답하지 않습니다. 질문하는 사람이 이해력이 부족하다면, 정중하게 말하고 그 주제에 대해 구체적으로 교육하는 것이 낫다고 생각하지 않습니까?
Ryan B. Lynch

아마 맞을 것입니다. 내 의견은 부정적으로 들릴 수 있지만 그런 의미는 아닙니다. 관련 사고 과정을 유발할 수있는 질문을 나열하려고했습니다. 기본 이해 수준을 모르기 때문에 교과서 작성을 시작하지 않았습니다. 그러나 당신은 도움이되지 않는 음색에 대해 절대적으로 맞습니다. 운 좋게도 훨씬 유용한 답변을 작성했습니다.
ptman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.