웹에 액세스하기 위해 루프백 트래픽을 승인하기 위해 iptables를 사용해야 하는 이유는 무엇입니까?

웹에 액세스하기 위해 루프백 트래픽을 승인하기 위해 iptables를 사용해야 하는 이유는 무엇입니까?

데스크탑(서버 아님)에서 나가는 HTTP에는 다음이 필요하다고 생각합니다.

iptables -A INPUT  -p tcp -m multiport --sports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

그러나 그것이 작동하려면 둘 다 필요하다는 것이 밝혀졌습니다. 나는 이유를 모른다:

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

마지막 규칙이 lo인터페이스에 대한 UDP 액세스를 허용한다는 것을 알고 있습니다.

그러나 필요한 것은 outgoing TCP for NEW/ESTABLISHED connections+ 뿐이라고 생각합니다 incoming TCP for ESTABLISHED connections. (아직 배우고 있는 중이기 때문에) 이것은 나에게 반직관적인 것 같습니다.

답변1

분명히 lo인터넷 접속이 필요하지 않습니다. 하지만 로컬 DNS 서버(전달자)가 실행 중일 수도 있습니다. DNS는 UDP를 사용하며 웹 액세스에는 HTTP 외에 DNS가 필요합니다.

그런데 귀하의 규칙은 (관련) ICMP 응답을 허용하지 않습니다. 이로 인해 문제가 발생할 수 있습니다(낮은 MSS/MTU 값을 사용하지 않는 한). 하지만 나가는 ICMP도 허용하지 않으므로 경로 MTU 검색도 작동하지 않습니다.

답변2

기본 정책을 나열하지 않았기 때문에 가정만 할 수 있습니다. 출력 상단에 있습니다 iptables -S. 나는 당신이 제한되어 있고 비슷한 것을 가지고 있다고 가정합니다.

-P INPUT DROP
-P FORWARD DROP
-P OUTPUT DROP

엄청난! 이제 귀하의 컴퓨터는 완전히 눈에 띄지 않고, 눈을 가리고, 테더링되어 IP 패킷에 차단됩니다. 이는 이더넷에서 플러그를 뽑는 것과 거의 같습니다.

그러니까 이 잔인하고 어두운 세상에서 희망을 갖고 싶다면 몇 가지 규칙을 만들어서 어떤 꾸러미를 받아들여야 하고, 칼을 들고 누군가를 만나 밧줄을 잘라야 할 수도 있는데, 어떤 꾸러미가 맞는 걸까요?

서버가 http/https 트래픽에 사용하는 포트에 패킷이 도달하도록 허용하려면 출력 규칙이 필요합니다.

-A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

패킷이 http/https 트래픽에 사용되는 포트에서 브라우저로 진입하도록 허용하려면 INPUT 규칙이 필요합니다.

-A INPUT -p tcp -m multiport --sports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT

이제 웹 브라우저에서 새로운 http/https 연결을 설정하고 설정된 연결을 통해 정보를 다시 받을 수 있습니다.

그렇다면 문제는 무엇입니까? DNS 정보를 얻을 수 없으면 방문하려는 웹사이트의 IP 주소를 웹 브라우저에 입력할 수 있어야 하지만 이는 우리가 원하는 것이 아닙니다. DNS 트래픽은 UDP 프로토콜을 사용하여 포트 53을 통해 처리됩니다.

-A OUTPUT -p udp --dport 53 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

이러한 편리한 응답을 받기 위해서는 아이 마스크에 구멍을 더 뚫어야 합니다.

-A INPUT -p udp --sport 53 -m conntrack --ctstate ESTABLISHED -j ACCEPT

이제 빛이 좀 들어오고 Google 서버 중 하나에 DNS 쿼리를 하면 들을 수 있습니다.

dig @8.8.8.8 slashdot.org

이런 반응! 하지만 아마도 귀하의 브라우저는 아직도 슬래시닷이 어디에 있는지 파악하지 못할 수도 있습니다. 내부 DNS 프록시를 사용하도록 하나 이상의 배포판(Ubuntu)이 설정되어 있으므로 서버로서 통신할 수 있도록 규칙을 설정하여 스스로 대화할 수 있어야 합니다(나머지 세상은 어쨌든 지루합니다). 포트 53

-A OUTPUT -o lo -p udp --sport 53 -m conntrack --ctstate ESTABLISHED -j ACCEPT
-A INPUT -i lo -p udp --dport 53 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

이러한 "나는 나만의 서버입니다" 규칙과 이전의 "나는 세상을 보고 싶을 뿐이에요" 규칙 사이의 미묘한 차이점에 유의하세요. 또한 서버가 해당 시스템에만 서비스를 제공한다는 것을 나타내는 것은 정교한 DNS 바운스 유형 공격에 빠지는 것을 방지하는 좋은 방법입니다 -o lo.-i lo

이제 브라우저가 다시 제대로 작동하는 것을 볼 수 있습니다.

답변3

INPUT이는 일치하지 않는 패킷 OUTPUT에 대해 체인이 설정되었는지 여부에 따라 달라집니다 . ACCEPT그렇다면 어떤 규칙도 전혀 필요하지 않습니다. 변경하지 않은 경우 이는 아마도 기본값일 것입니다.

마지막 2개의 규칙은 loUDP뿐만 아니라 인터페이스(예: 127.0.0.1/::1)와 주고받는 모든 트래픽을 허용합니다. 로컬 데스크톱의 웹 서버에 연결하지 않는 한 HTTP와 아무 관련이 없습니다.

관련 정보