DNS 조회 IP 및 포트를 리디렉션하기위한 IP 테이블


21

ISP (verizon)가 포트 53의 모든 DNS 트래픽을 가로 채고 있음을 발견했습니다.

iptables를 사용하여 모든 DNS 조회 트래픽을 특정 IP 및 포트 (5353)로 리디렉션하고 싶습니다. 컴퓨터가 포트 53의 다른 컴퓨터에 연결하려고하면 23.226.230.72:5353으로 리디렉션되어야합니다.

사용하려는 DNS 서버와 포트를 확인하기 위해이 명령을 실행했습니다.

~$ dig +short serverfault.com @23.226.230.72 -p5353
198.252.206.16

이것이 내가 사용하려는 iptables 규칙입니다.

iptables -t nat -A OUTPUT -p udp -m udp --dport 53 -j DNAT --to-destination 23.226.230.72:5353

해당 규칙을 추가 한 후 모든 DNS 조회를 찾을 수 없습니다. 웹 사이트 핑 반환 unknown host. 웹 페이지에 '서버를 찾을 수 없습니다'라고 표시됩니다.

~$ mtr serverfault.com
Failed to resolve host: Name or service not known

23.226.230.72:5353에서 DNS 조회를 가져 오기를 원합니다. iptables 규칙을 작동 시키려면 어떻게해야합니까?

편집하다

ISP의 DNS (포트 53) 차단 시연 포트 5353을 통해 dig에서 23.226.230.72로 출력을 추적 한 다음 포트 53을 추적하십시오.

~$ dig +trace stackexchange.com @23.226.230.72 -p5353

; <<>> DiG 9.9.5-3-Ubuntu <<>> +trace stackexchange.com @23.226.230.72 -p5353
;; global options: +cmd
.           86395   IN  NS  ns7.opennic.glue.
.           86395   IN  NS  ns4.opennic.glue.
.           86395   IN  NS  ns3.opennic.glue.
.           86395   IN  NS  ns5.opennic.glue.
.           86395   IN  NS  ns2.opennic.glue.
.           86395   IN  NS  ns10.opennic.glue.
.           86395   IN  NS  ns1.opennic.glue.
.           86395   IN  NS  ns6.opennic.glue.
.           86395   IN  NS  ns8.opennic.glue.
dig: couldn't get address for 'ns8.opennic.glue': no more


~$ dig +trace stackexchange.com @23.226.230.72 -p53

; <<>> DiG 9.9.5-3-Ubuntu <<>> +trace stackexchange.com @23.226.230.72 -p53
;; global options: +cmd
.           7440    IN  NS  f.root-servers.net.
.           7440    IN  NS  d.root-servers.net.
.           7440    IN  NS  j.root-servers.net.
.           7440    IN  NS  i.root-servers.net.
.           7440    IN  NS  g.root-servers.net.
.           7440    IN  NS  k.root-servers.net.
.           7440    IN  NS  a.root-servers.net.
.           7440    IN  NS  h.root-servers.net.
.           7440    IN  NS  e.root-servers.net.
.           7440    IN  NS  m.root-servers.net.
.           7440    IN  NS  c.root-servers.net.
.           7440    IN  NS  b.root-servers.net.
.           7440    IN  NS  l.root-servers.net.
;; Received 239 bytes from 23.226.230.72#53(23.226.230.72) in 2948 ms

stackexchange.com.  215 IN  A   198.252.206.16
;; Received 62 bytes from 192.228.79.201#53(b.root-servers.net) in 116 ms

내 현재 iptables. iptables-save

~# iptables-save
# Generated by iptables-save v1.4.21 on Tue Jul 15 23:06:52 2014
*mangle
:PREROUTING ACCEPT [79950528:41742899703]
:INPUT ACCEPT [78748282:41360159554]
:FORWARD ACCEPT [13:5427]
:OUTPUT ACCEPT [85455483:57472640071]
:POSTROUTING ACCEPT [85480442:57475512901]
-A POSTROUTING -o lxcbr0 -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill
COMMIT
# Completed on Tue Jul 15 23:06:52 2014
# Generated by iptables-save v1.4.21 on Tue Jul 15 23:06:52 2014
*nat
:PREROUTING ACCEPT [71:18713]
:INPUT ACCEPT [7:474]
:OUTPUT ACCEPT [109:7855]
:POSTROUTING ACCEPT [109:7855]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -d 172.17.0.0/16 -j MASQUERADE
-A POSTROUTING -s 10.0.3.0/24 ! -d 10.0.3.0/24 -j MASQUERADE
COMMIT
# Completed on Tue Jul 15 23:06:52 2014
# Generated by iptables-save v1.4.21 on Tue Jul 15 23:06:52 2014
*filter
:INPUT ACCEPT [78748139:41360144354]
:FORWARD ACCEPT [13:5427]
:OUTPUT ACCEPT [85454926:57472600172]
:fail2ban-ssh - [0:0]
:fail2ban-vsftpd - [0:0]
-A INPUT -p tcp -m multiport --dports 21,20,990,989 -j fail2ban-vsftpd
-A INPUT -p tcp -m multiport --dports 22,6622 -j fail2ban-ssh
-A INPUT -i lxcbr0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i lxcbr0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i lxcbr0 -p tcp -m tcp --dport 67 -j ACCEPT
-A INPUT -i lxcbr0 -p udp -m udp --dport 67 -j ACCEPT
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -o lxcbr0 -j ACCEPT
-A FORWARD -i lxcbr0 -j ACCEPT
-A fail2ban-ssh -j RETURN
-A fail2ban-vsftpd -j RETURN
COMMIT

모든 포트 53 트래픽을 해당 IP (23.226.230.72) 및 포트 (5353)로 리디렉션하려고합니까?
tachomi

iptables rules여기에 게시 하십시오
Networker

@tachomi Correct
Rucent88

또는 당신이 당신의 ISP의 DNS를 사용할 수없는 ... 구글의 공개 DNS 서버는 8.8.8.88.8.4.4
크릭

@Creek 난 당신이 오해 생각합니다. 내 isp는 포트 53을 통해 모든 트래픽을 가로 채고 있습니다. Google dns 서버를 사용하려고하더라도 액세스 할 수 없습니다.
Rucent88

답변:


12

이 지침을 모두 루트 (sudo)로 수행하십시오.

이 파일을 편집하십시오.

/etc/NetworkManager/NetworkManager.conf

행을 주석 처리하여 DnsMasq를 비활성화하십시오 dns=dnsmasq. #라인 앞에 놓으십시오

#dns=dnsmasq

네트워킹을 다시 시작하십시오.

service network-manager restart

이 iptable 규칙을 추가하십시오.

iptables -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to 23.226.230.72:5353
iptables -t nat -A OUTPUT -p tcp --dport 53 -j DNAT --to 23.226.230.72:5353

2
이 솔루션은 OS로 업데이트되며 리소스를 소비하지 않으며 보안 위험이 없으며 부팅 스크립트를 사용하여 매우 쉽게 설정할 수 있으며 유지 관리가 필요 없습니다. 단점은 매우 유연하지 않다는 것입니다
Rucent88

3

마치 DNS 쿼리에서 발생하는 일을 실제로 제어하는 ​​것 같습니다.

iptables를 사용하는 것이 선호되는 솔루션인지 확실하지 않습니다.

요청을 원하는 호스트 및 포트로 전달하는 로컬 DNS 서버 설정에 대해 생각해 보셨습니까? 한 가지 예 : bind9 전달자 옵션을 사용하여 전달자에 포트를 추가 할 수 있습니다.

이러한 설정은 유지 관리 및 문제 해결이 훨씬 쉬우 며 훨씬 유연 할 수 있습니다. 캐시의 이점을 고려하거나 외부 DNS 서버가 다운 된 경우를 고려하십시오. DNS 구성에 여러 전달자를 가질 수 있지만 iptables 규칙에 하나의 IP 만있을 수 있습니다 ....

digital ocean의 튜토리얼에서 bind9 설정에 대한 좋은 개요가 있습니다. 전달자에 포트를 추가하기 만하면 모든 설정이 완료됩니다.

Bind9은 많은 리소스를 전혀 소비하지 않으며 쉽게 구성됩니다 (또는 적어도 iptables :-)보다 쉽습니다)


말할 것도없이, 해당 설정에서 로컬 포워딩 DNS 서버를 사용하도록 장치를 설정하는 것을 잊지 마십시오.
Vincent De Baere

DNS 서버가 실행 중이지만 신뢰할 수 없었습니다 (정크 하드웨어). 보안을 최신 상태로 유지하는 것은 쉽지 않았습니다. 더 많은 시간과 자원, 전기를 소비했으며 마침내 양동이를 밟았습니다. 회사 네트워크 뒤에 수백 대의 컴퓨터가 있다면 DNS 서버가 좋은 아이디어라는 데 동의합니다. 그러나 나는 노트북을 가진 사람입니다. 몇 가지 iptable 규칙이 가장 쉽고 가장 낮은 리소스 여야합니다.
Rucent88

랩톱에 하나만 추가하면 리소스가 거의 소비되지 않으며 배포 패키지를 사용한다고 가정 할 때 기본 OS로 업데이트되며 로컬 호스트에서 수신 대기합니다. 보안 위험이 거의 없습니다.
Vincent De Baere

실제로 IMHO는 사례의 99 %에서 시나리오를 유지하는 것이 더 좋습니다. 적용되지 않는 유일한 1 %는 Captive Portal 시스템을 구성 할 때이지만 다른 이야기입니다.
ivanleoncz

2

이 시도:

먼저 전달 옵션을 활성화해야합니다.

/etc/sysctl.conf

하나의 값으로 설정

net.ipv4.ip_forward = 1

변경 사항 사용

sysctl -p 

다음을 저장하고 실행하십시오.

iptables -t nat -A PREROUTING -p tcp --sport 53 -j DNAT --to-destination 23.226.230.72:5353
iptables -t nat -A POSTROUTING -j MASQUERADE

PREROUTING에서 인터 인터페이스 (-i eth1) 및 / 또는 인터 펙터 링 (-o eth0)을 지정할 수있는 경우 IN POSTROUTING이 유용 할 수 있습니다.

참고 : MASQUARADE 라인은 주 IP로 대상 IP를 마스크하는 동안 필요합니다.


나는 sysctl net.ipv4.ip_forward=1iptables 규칙을 넣었다 . DNS는 작동하지만 여전히 isp에 의해 가로 채고 있습니다. DNS가 여전히 포트 53을 통해 전송되고 있음을 나타냅니다.
Rucent88

나는 당신의 규칙을로 바꾸 udp었지만 같은 결과를 얻었습니다.
Rucent88

iptables-save의 출력을 넣을 수 있습니까? 당신이 그 선을 해제하고 -A POSTROUTING -j MASQUERADE 하나를 떠날 수 있다면 10.0.3.0/24, 그래서 도움이 될 수 - 내가 수도 당신의 마스킹은 지정된 무도회 모든 것입니다
tachomi

요청하신 정보를 추가했습니다
Rucent88

좋아, 약간의 비트를 이해하자 .... 모든 포트 53 들어오는 트래픽은 23.226.230.72 또는 나가는 트래픽으로 리디렉션하려는 트래픽입니까?
tachomi

1

이 시도:

iptables -t nat -A OUTPUT -p tcp --dport 53 -j DNAT --to 23.226.230.72:5353;

iptables -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to 23.226.230.72:5353;

iptables -t nat -A POSTROUTING -j MASQUERADE

그것은 의미 :
1) 모든 로컬 사용자는 포트 5353에서 23.226.230.72 53 전송 TCP 포트에 세계를 접촉
1과 동일 2) 만에 UDP
세트) 3 우리로부터 들어오는 나가는 패킷의 소스 정보.


0
iptables -t nat -A PREROUTING -p tcp --dport 53 -j DNAT --to XX.XX.XX.XX:5353
iptables -t nat -A PREROUTING -p udp  --dport 53 -j DNAT --to XX.XX.XX.XX:5353
iptables -t nat -A POSTROUTING -j MASQUERADE

이 답변에“5353”이 언급되어 있지 않다는 것이 자동으로 잘못되었다고 생각합니다.
G-Man은

수정 .........
Zibri

좋아, 나는 당신의 대답을 다시 살펴보고 있습니다. 매우 유사 것으로 보인다 tachomi의 대답 (1) 변경 한 제외 sport에  dport(이 분명히 있다는 tachomi의 대답 오류라고 battman622 3 년 전 지적 , (2) 당신이 선 (명령)을 추가 udp이것이 ( 이미 언급 한 합법적 인 tachomi의 대답을 개선하지만, 하나의 코멘트에  ... (계속)를
G-남자 '는 분석 재개 모니카'말한다

(계속)… 그리고 다른 몇 가지 답변) 및 (3)으로 교체 --to-destination했습니다  --to.  남자 페이지는 그런 말을하지 않습니다 --to와  --to-destination동일하다; 반대로 대상 --to과는 NETMAP반대로 대상  과 함께 사용되며 DNAT해당 인수에는 포트 번호가 포함되어 있지 않습니다. (다른 두 가지 답변 --to이 귀하 --to의 방식을 사용 한다는 것을 알지만) 사용하는 방식 (포트 번호, DNAT대상 포함) 이 제대로 작동  합니까? … (계속)
G-Man, 'Reinstate Monica'4

(계속)… (그렇다면 누군가 매뉴얼 페이지의 관리자에게 변경 요청을 제출해야합니다.)  간결함이 아닌 다른 방법 --to보다 낫   --to-destination습니까?
G-Man, 'Reinstate Monica'4
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.