![dns(포트 53), 팀뷰어 포트(5938) 및 내 서버 IP(포트 80)를 제외한 iptables-block-all-inbound-and-outbound](https://linux55.com/image/136933/dns(%ED%8F%AC%ED%8A%B8%2053)%2C%20%ED%8C%80%EB%B7%B0%EC%96%B4%20%ED%8F%AC%ED%8A%B8(5938)%20%EB%B0%8F%20%EB%82%B4%20%EC%84%9C%EB%B2%84%20IP(%ED%8F%AC%ED%8A%B8%2080)%EB%A5%BC%20%EC%A0%9C%EC%99%B8%ED%95%9C%20iptables-block-all-inbound-and-outbound.png)
다음을 사용하여 몇 가지 예외를 제외하고 모든 트래픽을 차단해 보았습니다 iptables
.
- 도메인 명 시스템
- 내 서버(포트 80만 사용함)
- 팀뷰어(포트 5938)
- adb 연결을 허용하는 포트 5555
현재 다음과 같은 코드 줄이 있지만 필요한 방식으로 작동하지 않습니다.
// Allow my own server - this seems to work
iptables -A INPUT -s 1.1.1.1 -j ACCEPT
iptables -A OUTPUT -d 1.1.1.1 -j ACCEPT
// Allow DNS requests - dont know if it´s correct
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT
// Allow Teamviewer - same as above - dont know if it´s correct
iptables -A INPUT -p tcp --dport 5938 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 5938 -j ACCEPT
iptables -A OUTPUT -p udp --dport 5938 -j ACCEPT
iptables -A INPUT -p udp --dport 5938 -j ACCEPT
// Allow ADB - same as above - dont know if it´s correct
iptables -A INPUT -p tcp --dport 5555 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 5555 -j ACCEPT
iptables -A OUTPUT -p udp --dport 5555 -j ACCEPT
iptables -A INPUT -p udp --dport 5555 -j ACCEPT
// Block all other requests
iptables -P INPUT DROP
iptables -P OUTPUT DROP
Teamviewer가 연결되지 않고 이름 확인이 작동하지 않으며 adb가 연결되지 않습니다. 뭔가 문제가 있는 것 같은데, 그게 뭔지 잘 모르겠습니다. 해당 도메인을 하드코딩하면 작동하는 유일한 방법은 내 서버에 연결하는 것뿐입니다 /etc/hosts
.
여기 전문가 중 한 분이 iptables
저를 도와주실 수 있나요?
답변1
무엇이 작동하지 않나요? 실제로 내 말이 맞다면 첫 번째 iptable 항목은 모든 트래픽 tcp/udp를 허용합니다. 따라서 다른 ACE도 공격하지 않습니다. HTTP 트래픽만 필요한 경우 TCP 포트 80만 허용해야 합니다.
IPtables는 위에서 아래로 작동합니다. 서버는 IP 주소 1.1.1.1을 가지며 모든 패킷의 소스는 1.1.1.1입니다. 그렇지 않으면 들어오는 모든 트래픽이 소스 xxxx와 대상 1.1.1.1을 가지게 되므로 처음 두 항목은 모든 트래픽과 일치하게 됩니다. 필요에 따라 처음 두 규칙 없이 구성해야 합니다. DNS 트래픽이 허용됩니다:
iptables -A OUTPUT -p udp --sport 1024:65535 --dport 53 -j ACCEPT
HTTP/HTTPS 트래픽용 서버를 설정해야 합니다.
iptables -A OUTPUT -p tcp --sport 1024:65535 -m multiport --dports 80,443 -j ACCEPT
Teamviewer는 우선적으로 5938을 통해 TCP 연결을 가져오므로 다음과 같아야 합니다.
iptables -A OUTPUT -o eth0 -p tcp --dport 5938 -m state --state NEW -j ACCEPT
나는 ADB에 노출된 적이 없기 때문에 ADB에 대해 잘 모르겠습니다. 하지만 TCP 스트림이라면 다음과 같이 해야 합니다.
iptables -A OUTPUT -p tcp --dport 5555 -j ACCEPT
답변2
아웃바운드 트래픽을 올바르게 허용하고 있지만 원본 포트와 대상 포트를 혼동하고 있기 때문에 응답 패킷을 차단하고 있습니다.
원격 시스템의 서비스에 연결할 때 일반적으로 서비스의 대상 포트로 소켓을 열고 소스 포트는 정의되지 않습니다. 즉, 커널이 소스 포트를 무작위로 할당합니다. 그러면 원격 서비스의 응답은 소스 포트가 대상 포트이고 대상 포트가 소스 포트인 네트워크 패킷으로 다시 전송됩니다. 그러나 규칙은 또한 서비스 대상 포트를 반환 트래픽의 대상 포트로 사용하는데, 이는 실제 트래픽과 일치하지 않으므로 작동하지 않습니다.
이론적으로 --sport
반환 트래픽의 소스 포트를 일치시킬 수는 있지만 권장하지는 않습니다. 이렇게 하면 포트 53을 소스 포트(또는 열려 있는 다른 서비스)로 사용하는 한 누구나 서버의 모든 서비스로 트래픽을 보낼 수 있습니다.
대신 연결 추적 모듈을 사용하는 것이 좋습니다.
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
설명하다:
-m conntrack
conntrack
: 알려진 연결 상태를 추적하는 모듈을 로드하도록 iptables에 지시합니다.--ctstate RELATED,ESTABLISHED
: 알려진 네트워크 연결의 일부로 전송된 패킷만 일치합니다(ESTABLISHED
).또는예상되는 새 연결(RELATED
)을 만듭니다. RELATED는 여러 네트워크 연결을 사용하는 FTP와 같은 작업에 유용합니다. 사용 중인 프로토콜과 아무 관련이 없다고 생각하므로 원하는 경우 삭제할 수 있습니다(그러나 100% 확실하지는 않습니다. 그래서... .)
이 규칙을 추가한 후에는 초기 연결에 대한 규칙 추가에 대해서만 걱정하면 됩니다.
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 5938 -j ACCEPT
(허용하려는 모든 프로토콜에 대해 이 과정을 반복하세요)
conntrack
나가는 트래픽을 차단하려는 경우 OUTPUT 체인에서도 사용할 수 있습니다.
마지막으로 일치시킬 수 있는 INVALID 상태도 있다는 점에 유의하세요. iptables
이 이벤트는 네트워크 연결의 일부라고 주장하는 패킷이 도착했지만 상태를 찾을 수 없을 때 트리거됩니다. 이는 상태 테이블의 메모리가 부족하거나 공격자가 방화벽을 우회하려고 하기 때문일 수 있습니다. 무언가를 기록하고 패킷을 삭제하고 싶을 수도 있습니다.