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


20

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 주소를 넣어야합니까? 내가하려는 일이 더 단순한 규칙으로 달성 될 수 있다고 생각하십니까? 방법?

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


2
sstatic.net 및 기타를 잊지 마십시오. serverfault.com은 serverfault.com에서 온 것이 아닙니다
Zoredache

다른 시스템에서 프록시를 실행할 수 있습니까? 이것이 가장
좋고

답변:


29

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

3
아름답고 잘 만들어진 답변.
JakeRobinson 2019 년

1
당신도 내 실수를 놓쳤음에도 불구하고 고맙습니다. 죄송합니다.
Scott Pack

3
실제로 iptables -P체인 정책은 패킷이 체인의 끝에서 "떨어질"경우에만 적용되므로 스크립트의 어느 곳에 나 명령문을 넣을 수 있습니다 . 나는 보통 DROPiptables 스크립트 상단에 정책 설명 (일반적으로 정책)을 넣습니다 .
Steven 월요일

1
@Steven : 당신은 절대적으로 맞습니다. OP가 대화식으로 입력하는 것 같습니다. SSH를 통해 호스트에 연결되었다고 가정하고 첫 번째 규칙은 정책 DROP에 대한 것입니다. 더 이상 규칙을 입력하기 전에 SSH 연결이 끊어집니다. 다른 증상이 나타날 때와 동일한 타이밍 문제입니다.
Scott Pack

감사. 이것을 시도하고있었습니다. 그러나을 추가하지 않으면 작동하지 않았습니다 sudo iptables -I OUTPUT 1 -o lo -j ACCEPT. 추가하지 않아야합니까?
Kiran

7

더하다

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

DNS 조회를 허용합니다.


5

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

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


1
이것에 전적으로 동의합니다. iptablesDNS 이름을 잘 다루지 않으므로 여기에서 사용하는 도구가 잘못되었을 수 있습니다. 적절한 필터 설정을 가진 웹 프록시가 훨씬 더 적합합니다.
Steven 월요일

2

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


문제는 "모든 것을 버리지 않고"규칙 3을 시도 할 때 iptables와 잘 작동한다는 것입니다!
Zenet

2
흠, 나는 질문을 잘못 읽었다. 백그라운드에서 일어나고있는 일은 iptables가 serverfault.com을 64.34.119.12로 해석한다는 것입니다 (해결이 작동하지 않는 이유를 이해하려면 slillibri의 답변 참조). 그러나 iptables는 호스트 이름을 이해하지 못하고 단지 ip를 허용하기 때문에 여러 사이트가있는 경우 해당 ip의 모든 웹 사이트에 연결할 수 있습니다.
Niall Donegan

2
@Emily, 규칙이 추가되었다는 점에서 잘 작동 할 수 있지만 serverfault.com IP가 변경되면 트래픽이 허용되지 않습니다. 자주 변경되는 수백 개의 주소가있는 google.com과 같은 사이트를 허용하면 전혀 작동하지 않습니다.
Zoredache

1

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

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

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

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

필 안녕하세요, 어떤 웹 서버를 이해하고 있는지 잘 모르겠습니다. 웹 서버가 없습니다. 내 컴퓨터에서이 구성을 수행하고 있습니다.
Zenet
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.