[server] 하나의 도메인으로 만 HTTP 트래픽을 허용하는 iptables 규칙

serverfault.com과의 HTTP 트래픽 만 허용하도록 시스템을 구성해야합니다. 다른 모든 웹 사이트, 서비스 포트에는 액세스 할 수 없습니다. 나는이 iptables 규칙을 생각해 냈습니다.

#drop everything
iptables -P INPUT DROP
iptables -P OUTPUT DROP

#Now, allow connection to website serverfault.com on port 80
iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

#allow loopback
iptables -I INPUT 1 -i lo -j ACCEPT

그것은 잘 작동하지 않습니다 :

  • 모든 것을 버리고 규칙 3으로 넘어갑니다.

    iptables -A 출력 -p tcp -d serverfault.com –dport 80 -j ACCEPT

이 오류가 발생합니다.

iptables v1.4.4: host/network `serverfault.com' not found
Try `iptables -h' or 'iptables --help' for more information.

DNS와 관련이 있다고 생각하십니까? 나도 허용해야합니까? 아니면 규칙에 IP 주소를 넣어야합니까? 내가하려는 일이 더 단순한 규칙으로 달성 될 수 있다고 생각하십니까? 방법?

나는 이것에 대한 도움이나 힌트를 주셔서 감사합니다. 고마워요!



답변

IPTables 규칙을 사용하면 주문이 중요합니다. 규칙이 순서대로 추가되고 적용됩니다. 또한 규칙을 수동으로 추가하면 즉시 적용됩니다. 따라서 예제에서 기본 정책이 설정 되 자마자 INPUT 및 OUTPUT 체인을 통과하는 모든 패킷이 삭제되기 시작합니다. 또한 실수로 오류 메시지가 표시됩니다. 무슨 일이 일어나고 있습니까 :

  1. 기본 DROP 정책이 적용됩니다
  2. IPTables는 호스트 이름을 대상으로받습니다.
  3. IPTables가 ‘serverfault.com’에서 DNS 조회를 시도합니다
  4. DNS 조회는 DROP 작업에 의해 차단됩니다

소스 / 대상 옵션은 호스트 이름을 허용하지만 사용하지 않는 것이 좋습니다. 매뉴얼 페이지를 인용하면

호스트 이름은 규칙이 커널에 제출되기 전에 한 번만 해결됩니다. DNS와 같은 원격 쿼리로 해결할 이름을 지정하는 것은 실제로 나쁜 생각입니다.

Slillibri는 그의 대답에 따라 머리에 못을 박았으며 DNS 수락 규칙을 놓쳤습니다. 귀하의 경우 중요하지 않지만 일반적으로 프로세스 후반에 기본 정책을 설정합니다. 마지막으로 원하는 것은 원격으로 작업 하고 기본 거부를 켠 SSH 허용 하는 것입니다.

또한 배포에 따라 시작시 자동으로 적용되도록 방화벽 규칙을 저장할 수 있어야합니다.

모든 것을 알고 스크립트를 다시 정렬하면 여기에 내가 추천하는 것이 있습니다.

# Allow loopback
iptables -I INPUT 1 -i lo -j ACCEPT

# Allow DNS
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

# Now, allow connection to website serverfault.com on port 80
iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Drop everything
iptables -P INPUT DROP
iptables -P OUTPUT DROP


답변

더하다

iptables -A OUPUT -p udp --dport 53 -j ACCEPT

DNS 조회를 허용합니다.


답변

이러한 종류의 요구 사항은 웹 프록시 및 / 또는 필터로 더 잘 처리 될 수 있습니다. 이를 수행하도록 Dansgaurdian을 구성 할 수 있습니다. 필터를 통과하는 트래픽을 강제하려면 NAT 규칙을 사용해야합니다.

iptables를 사용하여 필터링하면 관련 IP 주소에서 모든 사이트를 사용할 수 있습니다. 이것은 일반적으로 전체 웹의 작은 하위 집합입니다.


답변

iptables 가이 수준에서 작동하지 않을까 걱정됩니다. 호스트 이름이 아닌 ip 주소에만 관심이 있습니다. 동일한 IP에서 다른 이름의 가상 호스트에 대한 액세스를 차단하려면 .htaccess 파일을 넣어야합니다.


답변

웹 서버에서이를 구성해야합니다. iptables는 패킷 필터입니다. HTTP 트랜잭션은 사이트 이름 (예 : 스택 오버 플로우)을 TCP 페이로드의 일부로 보냅니다 (즉, iptables가 쉽게 읽을 수있는 TCP 헤더의 일부가 아님).

HTTP 트랜잭션이 거의 확실하게 여러 패킷에 분산된다는 사실을 감안할 때 (즉, HTTP 헤더의 문자열과 일치 할 수는 없음) 웹 서버 구성이나 프록시 앞에 훨씬 더 잘 처리됩니다. 그것의.

이것 뒤에 추론을 아는 것이 유용 할 것입니다. 몇 가지 다른 대안이 있습니다.

  1. 잘못된 URL을 입력하면 올바른 URL로 리디렉션합니다 (예 : www.stackoverflow.com을 입력하면 stackoverflow.com으로 리디렉션)
  2. 웹 서버에 stackoverflow.com 이외의 호스트를 제공하지 않도록 지시하십시오.
  3. 다른 방법으로는 해결할 수없는 별도의 IP에 사이트를 배치하고 웹 서버가 그 정보를 수신하도록하십시오.

답변