iptables는 DNS 조회 IP 및 포트를 리디렉션합니다.

iptables는 DNS 조회 IP 및 포트를 리디렉션합니다.

내 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을 통해 23.226.230.72로 이동한 후 포트 53을 통해 dig의 출력을 추적합니다.

~$ 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

답변1

이 모든 지침을 루트(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

이 시도:

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

/etc/sysctl.conf

값을 1로 설정

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)를 지정하거나 POSTROUTING에서 출력 인터페이스(-o eth0)를 지정할 수 있으면 유용할 수 있습니다.

참고: MASQUARADE 라인이 필요하며 기본 IP를 사용하여 대상 IP를 마스킹합니다.

답변3

당신이 정말로 원하는 것은 DNS 쿼리로 일어나는 일을 제어하는 ​​것 같습니다.

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

요청을 원하는 호스트와 포트로 전달하는 로컬 DNS 서버 설정을 고려해 보셨나요? 예: Bind9 전달자 옵션을 사용하면 전달자에 포트를 추가할 수 있습니다.

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

Bind9 설정에 대한 좋은 개요Digital Ocean 튜토리얼에서. 포워더에 포트를 추가하기만 하면 됩니다.

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

답변4

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

관련 정보