Iptables pour rediriger l'IP et le port de recherche DNS

22

J'ai découvert que mon FAI (verizon) intercepte tout le trafic DNS sur le port 53.

En utilisant iptables, je veux rediriger tout le trafic de recherche DNS vers une IP et un port spécifiques (5353). Toute tentative de connexion de mon ordinateur à un autre ordinateur sur le port 53 doit être redirigée vers 23.226.230.72:5353.

Pour vérifier le serveur DNS et le port que j'essaie d'utiliser, j'ai exécuté cette commande.

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

Ceci est la règle iptables que j'essaie d'utiliser.

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

Après avoir ajouté cette règle, toutes les recherches DNS sont introuvables. Les pings du site Web reviennent unknown host. Les pages Web indiquent «Serveur introuvable».

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

Je veux que mes recherches DNS soient extraites de 23.226.230.72:5353. Comment puis-je faire fonctionner la règle iptables?

MODIFIER

Démonstration d'interception DNS (port 53) par mon FAI. Tracez la sortie de dig à 23.226.230.72 via le port 5353, puis le port 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

Mes iptables actuels. 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
Rucent88
la source
Vous essayez donc de rediriger tout le trafic du port 53 vers cette IP (23.226.230.72) et ce port (5353)?
tachomi
veuillez poster votre iptables rulesici
Networker
@tachomi Correct
Rucent88
Ou vous ne pouviez pas utiliser le DNS de votre FAI ... Les serveurs DNS publics de Google sont 8.8.8.8et8.8.4.4
Creek
@Creek Je pense que vous vous méprenez. Mon FAI intercepte tout le trafic via le port 53. Même si je voulais utiliser des serveurs google dns, je ne peux pas y accéder.
Rucent88

Réponses:

13

Exécutez toutes ces instructions en tant que root (sudo).

Modifiez ce fichier.

/etc/NetworkManager/NetworkManager.conf

Désactivez DnsMasq en mettant en commentaire la ligne dns=dnsmasq. Mettez un #devant la ligne

#dns=dnsmasq

Redémarrez votre réseau.

service network-manager restart

Ajoutez ces règles iptables.

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
Rucent88
la source
2
Cette solution se met à jour avec le système d'exploitation et ne consomme aucune ressource. Elle présente un risque de sécurité nul, une configuration super facile avec un script de démarrage et aucune maintenance. L'inconvénient est qu'il n'est pas très flexible
Rucent88
3

Il semble que ce que vous recherchez vraiment, c'est de contrôler ce qui se passe avec vos requêtes DNS.

Je ne suis pas sûr que l'utilisation d'iptables serait ma solution préférée.

Avez-vous pensé à mettre en place un serveur DNS local qui transmet simplement vos demandes à l'hôte et au port que vous souhaitez? Un exemple: en utilisant l'option de redirecteurs bind9, vous pouvez ajouter un port à un redirecteur.

Une telle configuration est beaucoup plus facile à entretenir et à dépanner, et peut être beaucoup plus flexible. Considérez l'avantage du cache, ou considérez simplement le cas où votre serveur DNS externe est en panne. Vous pouvez avoir plusieurs redirecteurs dans votre configuration DNS, mais une seule IP dans les règles iptables ....

Il y a un bon aperçu de la configuration de bind9 dans un tutoriel sur l'océan numérique . Ajoutez simplement le port aux redirecteurs et vous devriez être prêt.

Bind9 ne consomme pas beaucoup de ressources et est facilement configuré (ou au moins: plus facile que iptables :-))

Vincent De Baere
la source
Ooh, et il va sans dire que dans cette configuration, n'oubliez pas de configurer vos appareils pour qu'ils utilisent votre serveur DNS de transfert local.
Vincent De Baere
J'avais un serveur DNS en cours d'exécution, mais ce n'était pas fiable (matériel indésirable). La mise à jour de la sécurité était pénible. Il a consommé plus de temps, de ressources, d'électricité et a finalement donné un coup de pied. Si j'avais des centaines d'ordinateurs derrière un réseau d'entreprise, je conviens que le serveur DNS serait une bonne idée. Mais je ne suis qu'une personne avec un ordinateur portable. Quelques règles iptables devraient être la ressource la plus simple et la plus basse.
Rucent88
Ajoutez-en un sur votre ordinateur portable, il ne consomme presque pas de ressources et il sera mis à jour avec votre système d'exploitation principal (en supposant que vous utilisez des packages de distribution), et le fera écouter sur localhost. Risque de sécurité presque nul.
Vincent De Baere
En effet, à mon humble avis, il est préférable de maintenir le scénario dans 99% des cas. Le seul 1% qui ne s'applique pas, c'est lorsque vous configurez un système de portail captif, mais c'est une autre histoire.
ivanleoncz
2

Essaye ça:

Vous devez d'abord activer l'option de transfert dans

/etc/sysctl.conf

Réglez à un la valeur de

net.ipv4.ip_forward = 1

Activer les modifications

sysctl -p 

Enregistrez et exécutez les éléments suivants:

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

Si vous pouviez spécifier l'interface (-i eth1) dans PREROUTING ou / et out-interfect (-o eth0) IN POSTROUTING pourrait être utile.

REMARQUE: la ligne MASQUARADE est nécessaire tandis que cette masque l'IP de destination avec l'IP principale.

tachomi
la source
J'ai mis sysctl net.ipv4.ip_forward=1et les règles iptables. Le DNS fonctionne, mais il est toujours intercepté par mon FAI. Cela m'indique donc que le DNS est toujours envoyé via le port 53.
Rucent88
J'ai changé votre règle en udp, mais j'ai obtenu les mêmes résultats.
Rucent88
Pourriez-vous s'il vous plaît mettre la sortie de iptables-save? Ce que je pourrais est que votre masquage uniquement le MASQUERADE spécifié - 10.0.3.0/24, donc si vous pouviez désactiver cette ligne et laisser celle -A POSTROUTING -j MASQUERADE, cela pourrait être utile
tachomi
J'ai ajouté les informations que vous avez demandées
Rucent88
Ok, comprenons un peu le rythme .... Tout le trafic ENTRANT du port 53 est celui que vous voulez rediriger vers 23.226.230.72 ou celui SORTANT?
tachomi
1

Essaye ça:

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

Cela signifie:
1) Tout utilisateur local contactant le monde vers le port TCP 53 envoie au 23.226.230.72 au port 5353.
2) Identique à 1 mais pour UDP
3) Définissez les informations source sur le paquet sortant comme provenant de nous.

George Hidalgo
la source
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
Zibri
la source
Le fait que cette réponse ne mentionne pas «5353» me fait croire que c'est automatiquement faux.
G-Man dit «Réinstalle Monica» le
corrigé .........
Zibri
OK, je jette un deuxième coup d'œil à votre réponse. Cela semble être très similaire à la réponse de tachomi sauf (1) que vous avez changé sporten  dport(c'était, apparemment, une erreur dans la réponse de tachomi que battman622 a signalée il y a trois ans , (2) vous avez ajouté une ligne (commande) pour udp(c'est une amélioration légitime de la réponse de tachomi, mais qui a déjà été mentionnée dans un commentaire  … (suite)
G-Man dit «Reinstate Monica»
(Suite)… et plusieurs autres réponses), et (3) vous avez remplacé --to-destinationpar  --to.  La page de manuel ne dit pas cela --toet  --to-destinationest équivalente; au contraire, il dit qu'il --toest utilisé avec la NETMAPcible (par opposition à la  DNATcible) et que son argument n'inclut pas de numéro de port. (Bien que je remarque que quelques autres réponses utilisent --tocomme vous l'avez fait.) Êtes-vous sûr que cela --tofonctionne comme vous l'utilisez (avec un numéro de port, avec la  DNATcible)? … (Suite)
G-Man dit «Réinstalle Monica» le
(Suite)… (Si oui, quelqu'un devrait peut-être soumettre une demande de modification au (x) responsable (s) des pages de manuel.) Est-ce  --tomieux que   --to-destinationde toute autre manière que la brièveté?
G-Man dit «Réinstalle Monica» le