Jump to content

Archived

This topic is now archived and is closed to further replies.

Mephisto

[Résolu] iptables, redirection de ports/NAT

Recommended Posts

Bonjour

Je profite de ce beau week-end pour installer une gate, a laquelle je brancherai ma freebox en bridge.

Je passe par dnsmasq pour le cote DNS/DHCP, marche au poil.

Par contre, au niveau des redirections, je galere.

Avant de tout casser, j'ai configurer deux machines ayant deux interfaces, pour qu'elles aient aussi acces a 10.0.0.0 (tout le reste du reseau etant sur 192.168.0.0)

Pour mes tests, je veux pouvoir rediriger le traffic entrant sur ma gate par 10.0.0.250, sur un poste de 192.168.0.0, en fonction du port.

Une fois que tout ca marchera, je verrai comment bridger la Fbox sur l'interface actuellement en 10.0.0.0

mon probleme:

quand iptables est stop, ssh root@10.0.0.250 me log bien sur la gate

une fois iptables lance, ssh root@10.0.0.250 devrait me rediriger sur 192.168.0.42, mais ssh mouline, il ne se passe rien, connection timeout.

de meme, un telnet sur un port sence etre redirige ne donne rien.

mon iptables.rules:

*filter

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

-A INPUT -i lo   -j ACCEPT
-A INPUT -i eth0 -j ACCEPT
-A INPUT -i eth1 -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p igmp -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

#-A INPUT -p tcp --dport 20		  -j ACCEPT
#-A INPUT -p tcp --dport 21		  -j ACCEPT
#-A INPUT -p tcp --dport ssh		 -j ACCEPT
#-A INPUT -p tcp --dport 23		  -j ACCEPT
#-A INPUT -p tcp --dport domain	  -j ACCEPT
#-A INPUT -p udp --dport domain	  -j ACCEPT
#-A INPUT -p tcp --dport http		-j ACCEPT
#-A INPUT -p tcp --dport https	   -j ACCEPT
#-A INPUT -p tcp --dport netbios-ssn -j ACCEPT
#-A INPUT -p udp --dport netbios-ssn -j ACCEPT
-A INPUT -p tcp --dport x11-1	   -j ACCEPT
-A INPUT -p udp --dport 1234		-j ACCEPT
-A INPUT -p udp -d 224.0.0.251 --dport mdns -j ACCEPT
-A INPUT -j LOG --log-prefix "malformated IPV4 packet "
-A INPUT -j REJECT #un drop sera probablement mieux, une fois que je serai sur que tout marche

COMMIT

*nat

:PREROUTING ACCEPT [13:1035]
:POSTROUTING ACCEPT [5:516]
:OUTPUT ACCEPT [12:966]
#j'ai croise ces trois-la, je sais pas a quoi ca correspond...

-A PREROUTING -i eth1 -p tcp --dport 20   -j DNAT --to 192.168.0.45
-A PREROUTING -i eth1 -p tcp --dport 21   -j DNAT --to 192.168.0.45
-A PREROUTING -i eth1 -p tcp --dport 22   -j DNAT --to-destination 192.168.0.42:22
-A PREROUTING -i eth1 -p tcp --dport 23   -j DNAT --to 192.168.0.45
-A PREROUTING -i eth1 -p tcp --dport 139  -j DNAT --to 192.168.0.42
-A PREROUTING -i eth1 -p tcp --dport 445  -j DNAT --to 192.168.0.42
-A PREROUTING -i eth1 -p tcp --dport 3389 -j DNAT --to 192.168.0.42
-A POSTROUTING -o eth1 -j MASQUERADE
#je tente --to et --to-destination, mais aucun des deux ne semble marcher

COMMIT

*mangle
-A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS -o eth1 --clamp-mss-to-pmtu
#parait que c'es mieux comme ca

COMMIT

C'est donc du script pompe sur google (principalement ici).

Mais sur le principe, j'immagine que ca devrait fonctionner

j'ai juste commente quelques "-A INPUT ....", en presumant qu'ils serait ignore par le nat s'ils sont deja pris en compte ailleurs

mais dans ce cas comme dans l'autre, ca ne solutionne pas mon probleme.

l'ipforwarding est active

un fois iptables lance, j'ai les routes suivantes:

[root@omega ~]# iptables -nvL
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target	 prot opt in	 out	 source			   destination		 
0	 0 ACCEPT	 all  --  lo	 *	   0.0.0.0/0			0.0.0.0/0		   
  58  4628 ACCEPT	 all  --  eth0   *	   0.0.0.0/0			0.0.0.0/0		   
2   372 ACCEPT	 all  --  eth1   *	   0.0.0.0/0			0.0.0.0/0		   
0	 0 ACCEPT	 icmp --  *	  *	   0.0.0.0/0			0.0.0.0/0		   
0	 0 ACCEPT	 2	--  *	  *	   0.0.0.0/0			0.0.0.0/0		   
0	 0 ACCEPT	 all  --  *	  *	   0.0.0.0/0			0.0.0.0/0		   state RELATED,ESTABLISHED 
0	 0 ACCEPT	 udp  --  *	  *	   0.0.0.0/0			224.0.0.251		 udp dpt:5353 
0	 0 LOG		all  --  *	  *	   0.0.0.0/0			0.0.0.0/0		   LOG flags 0 level 4 prefix `malformated IPV4 packet ' 
0	 0 REJECT	 all  --  *	  *	   0.0.0.0/0			0.0.0.0/0		   reject-with icmp-port-unreachable 

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target	 prot opt in	 out	 source			   destination		 

Chain OUTPUT (policy ACCEPT 28 packets, 3552 bytes)
pkts bytes target	 prot opt in	 out	 source			   destination		 
[root@omega ~]# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target	 prot opt source			   destination		 
DNAT	   tcp  --  0.0.0.0/0			0.0.0.0/0		   tcp dpt:20 to:192.168.0.45 
DNAT	   tcp  --  0.0.0.0/0			0.0.0.0/0		   tcp dpt:21 to:192.168.0.45 
DNAT	   tcp  --  0.0.0.0/0			0.0.0.0/0		   tcp dpt:22 to:192.168.0.42:22 
DNAT	   tcp  --  0.0.0.0/0			0.0.0.0/0		   tcp dpt:23 to:192.168.0.45 
DNAT	   tcp  --  0.0.0.0/0			0.0.0.0/0		   tcp dpt:139 to:192.168.0.42 
DNAT	   tcp  --  0.0.0.0/0			0.0.0.0/0		   tcp dpt:445 to:192.168.0.42 
DNAT	   tcp  --  0.0.0.0/0			0.0.0.0/0		   tcp dpt:3389 to:192.168.0.42
Chain POSTROUTING (policy ACCEPT)
target	 prot opt source			   destination		 
MASQUERADE  all  --  0.0.0.0/0			0.0.0.0/0		   

Chain OUTPUT (policy ACCEPT)
target	 prot opt source			   destination

quelqu'un voit ou je fais de la merde ?

Merci pour votre aide :craint:

Share this post


Link to post
Share on other sites

J'ai egalement tente (j'en arrive au meme resultat) avec un script (plutot que toucher la conf du rc), comme presente sur le wiki archlinux:

iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables --flush
iptables -t nat --flush
iptables -X

iptables -N external
iptables -N localnet
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -j localnet
iptables -A INPUT -j external
iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset
iptables -A INPUT -p UDP -j REJECT --reject-with icmp-port-unreachable
iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
#iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
#iptables -A INPUT -f -j DROP
#iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
#iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

iptables -A localnet -i lo -j ACCEPT
iptables -A localnet -i eth0 -j ACCEPT
iptables -A external -i eth1 -p tcp --dport 22 -j ACCEPT

iptables -N fwexternal
iptables -N fwlocalnet
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -j fwexternal
iptables -A FORWARD -j fwlocalnet
iptables -A FORWARD -j REJECT --reject-with icmp-host-unreachable
iptables -P FORWARD DROP
iptables -A fwlocalnet -i lo -j ACCEPT
iptables -A fwlocalnet -i eth0 -j ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.0.0/255.255.255.0 -o eth1 -j MASQUERADE
iptables -A FORWARD -i eth1 -o eth0 -p tcp --sport 22 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -p tcp --dport 22 -j ACCEPT
iptables -A fwexternal -d 192.168.0.42 -p tcp --dport 22 -j ACCEPT
iptables -t nat -A PREROUTING -t nat -p tcp -i eth1 --dport 22 -j DNAT --to 192.168.0.42

dans les deux cas, je lance

- un tcpdump sur eth1 (itf publique sur la gate)

- un tcpdump sur eth0 (itf ciblé par la redirection sur le serv ssh)

le résultat:

#SUR LA GATE
tcpdump -i eth0 -ln -n port 22 | grep -v '\.42\.40051'											   10:51
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
10:54:05.734703 IP 10.0.0.42.33631 > 192.168.0.42.22: Flags [S], seq 3248074688, win 5840, options [mss 1460,sackOK,TS val 14978768 ecr 0], length 0
10:54:08.731020 IP 10.0.0.42.33631 > 192.168.0.42.22: Flags [S], seq 3248074688, win 5840, options [mss 1460,sackOK,TS val 14979668 ecr 0], length 0
10:54:14.734423 IP 10.0.0.42.33631 > 192.168.0.42.22: Flags [S], seq 3248074688, win 5840, options [mss 1460,sackOK,TS val 14981468 ecr 0], length 0

# SUR LE SERV SSH
tcpdump -i eth1 -nl -n port 22 | grep -v '62\.100'													10:51
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
10:54:09.301121 IP 10.0.0.42.33631 > 192.168.0.42.22: Flags [S], seq 3248074688, win 5840, options [mss 1460,sackOK,TS val 14978768 ecr 0], length 0
10:54:09.303660 IP 192.168.0.250.22 > 192.168.0.42.40051: Flags [P.], ack 4002601273, win 18216, options [nop,nop,TS val 20932459 ecr 14977404], length 192
10:54:09.303668 IP 192.168.0.42.40051 > 192.168.0.250.22: Flags [.], ack 192, win 62712, options [nop,nop,TS val 14978769 ecr 20932459], length 0
10:54:12.297570 IP 10.0.0.42.33631 > 192.168.0.42.22: Flags [S], seq 3248074688, win 5840, options [mss 1460,sackOK,TS val 14979668 ecr 0], length 0
10:54:12.300471 IP 192.168.0.250.22 > 192.168.0.42.40051: Flags [P.], ack 1, win 18216, options [nop,nop,TS val 20933358 ecr 14978769], length 192
10:54:12.300479 IP 192.168.0.42.40051 > 192.168.0.250.22: Flags [.], ack 384, win 62712, options [nop,nop,TS val 14979668 ecr 20933358], length 0
10:54:18.301245 IP 10.0.0.42.33631 > 192.168.0.42.22: Flags [S], seq 3248074688, win 5840, options [mss 1460,sackOK,TS val 14981468 ecr 0], length 0
10:54:18.304090 IP 192.168.0.250.22 > 192.168.0.42.40051: Flags [P.], ack 1, win 18216, options [nop,nop,TS val 20935159 ecr 14979668], length 192
10:54:18.304094 IP 192.168.0.42.40051 > 192.168.0.250.22: Flags [.], ack 576, win 62712, options [nop,nop,TS val 14981470 ecr 20935159], length 0

# Ce que j'ai lancé, du serv ssh
telnet 10.0.0.250 22																							10:51
Trying 10.0.0.250...
telnet: Unable to connect to remote host: Connection timed out

Share this post


Link to post
Share on other sites

Bonjour à tous !

j'ai pas trop le temps de vérifier (au taf, j'ai déjà un desktop consacré aux ssh à la maison...), mais je crois avoir trouver une solution !

quand je lance un telnet, je reçois bien 'SSH-2.0-OpenSSH_5.3'

et ce qui aura solutionné la chose:

iptables -t nat -A PREROUTING -j DNAT -i eth1 -p tcp --dport 22 --to-destination 192.168.0.42:22

iptables -t nat -A POSTROUTING -j MASQUERADE -o eth0 -p tcp --dport 22 -d 192.168.0.42

avec donc eth1 l'itf publique, eth0 la privé, et 192.168.0.42 le serveur ssh.

je regarderai ce soir si j'arrive à faire marcher ça sur mes autres ports, et l'intégrer à une configuration viable.

pour le principe, ce que j'ai actuellement dans mon script (dont 90% certainement inutile):

iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X

iptables -N external
iptables -N localnet
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -j localnet
iptables -A INPUT -j external
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

iptables -A localnet -i lo -j ACCEPT
iptables -A localnet -i eth0 -j ACCEPT
iptables -A external -i eth1 -p tcp --dport 22 -j ACCEPT

iptables -t nat -A PREROUTING -j DNAT -i eth1 -p tcp --dport 22 --to-destination 192.168.0.42:22
iptables -t nat -A POSTROUTING -j MASQUERADE -o eth0 -p tcp --dport 22 -d 192.168.0.42

Share this post


Link to post
Share on other sites

Bonsoir

la gate est en place, tout a l'air de fonctionner parfaitement !

le premier probleme que j'ai rencontre concernait les dns, mal confes sur la gate (c'est un comble...)

echo "nameserver 8.8.4.4" >/etc/resolv.conf.head si vous utilisez dhcp

sinon, rajouter la ligne a la main directement dans resolv.conf suffit

un dnsmasq (je poste pas la conf, c'est pas sorcier, mais pour ceux qui connaissent pas: vous vous faites vraiment chier pour rien avec bind)

et mon nouveau script iptables:

# re-init
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X

# default policy
iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -N external
iptables -N localnet
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -j localnet
iptables -A INPUT -j external
iptables -A localnet -i lo -j ACCEPT
iptables -A localnet -i eth0 -j ACCEPT

# ports opening
iptables -A external -i eth1 -p tcp --dport 20   -j ACCEPT	# ftp - recv
iptables -A external -i eth1 -p tcp --dport 21   -j ACCEPT	# ftp
iptables -A external -i eth1 -p tcp --dport 22   -j ACCEPT	# ssh
iptables -A external -i eth1 -p tcp --dport 23   -j ACCEPT	# telnet
iptables -A external -i eth1 -p udp --dport 53   -j ACCEPT	# domain
iptables -A external -i eth1 -p tcp --dport 53   -j ACCEPT	# domain
iptables -A external -i eth1 -p tcp --dport 80   -j ACCEPT	# http
iptables -A external -i eth1 -p udp --dport 139  -j ACCEPT	# netbios-ssn
iptables -A external -i eth1 -p tcp --dport 139  -j ACCEPT	# netbios-ssn
iptables -A external -i eth1 -p tcp --dport 443  -j ACCEPT	# https
iptables -A external -i eth1 -p tcp --dport 6001 -j ACCEPT	# x11-1

# ports forwarding
iptables -t nat -A PREROUTING  -j DNAT	   -i eth1 -p tcp --dport 20   --to-destination 192.168.0.45:20
iptables -t nat -A POSTROUTING -j MASQUERADE -o eth0 -p tcp --dport 20   -d 192.168.0.45
iptables -t nat -A PREROUTING  -j DNAT	   -i eth1 -p tcp --dport 21   --to-destination 192.168.0.45:21
iptables -t nat -A POSTROUTING -j MASQUERADE -o eth0 -p tcp --dport 21   -d 192.168.0.45
iptables -t nat -A PREROUTING  -j DNAT	   -i eth1 -p tcp --dport 22   --to-destination 192.168.0.42:22
iptables -t nat -A POSTROUTING -j MASQUERADE -o eth0 -p tcp --dport 22   -d 192.168.0.42
iptables -t nat -A PREROUTING  -j DNAT	   -i eth1 -p tcp --dport 23   --to-destination 192.168.0.45:23
iptables -t nat -A POSTROUTING -j MASQUERADE -o eth0 -p tcp --dport 23   -d 192.168.0.45
#iptables -t nat -A PREROUTING  -j DNAT	   -i eth1 -p udp --dport 53   --to-destination 192.168.0.254:53
#iptables -t nat -A POSTROUTING -j MASQUERADE -o eth0 -p udp --dport 53   -d 192.168.0.250
#iptables -t nat -A PREROUTING  -j DNAT	   -i eth1 -p tcp --dport 53   --to-destination 192.168.0.254:53
#iptables -t nat -A POSTROUTING -j MASQUERADE -o eth0 -p tcp --dport 53   -d 192.168.0.250
iptables -t nat -A PREROUTING  -j DNAT	   -i eth1 -p tcp --dport 80   --to-destination 192.168.0.45:80
iptables -t nat -A POSTROUTING -j MASQUERADE -o eth0 -p tcp --dport 80   -d 192.168.0.45
iptables -t nat -A PREROUTING  -j DNAT	   -i eth1 -p udp --dport 139  --to-destination 192.168.0.254:139
iptables -t nat -A POSTROUTING -j MASQUERADE -o eth0 -p udp --dport 139  -d 192.168.0.250
iptables -t nat -A PREROUTING  -j DNAT	   -i eth1 -p tcp --dport 139  --to-destination 192.168.0.254:139
iptables -t nat -A POSTROUTING -j MASQUERADE -o eth0 -p tcp --dport 139  -d 192.168.0.250
iptables -t nat -A PREROUTING  -j DNAT	   -i eth1 -p tcp --dport 443  --to-destination 192.168.0.46:443
iptables -t nat -A POSTROUTING -j MASQUERADE -o eth0 -p tcp --dport 443  -d 192.168.0.46
iptables -t nat -A PREROUTING  -j DNAT	   -i eth1 -p tcp --dport 6001 --to-destination 192.168.0.42:6001
iptables -t nat -A POSTROUTING -j MASQUERADE -o eth0 -p tcp --dport 6001 -d 192.168.0.42
iptables -t nat -A POSTROUTING -s 192.168.0.0/255.255.255.0 -o eth1 -j MASQUERADE

avec donc redirection de ftp, ssh, telnet, samba (si jme suis pas plante, faudra que je test), dns, http, rdesktop (sur une VM, d'ou la meme IP qu'ssh) et X11

a noter: l'option save du rc.d/iptables, qui permet de sauver la conf actuelle dans /etc/iptables.rules

ainsi, la configuration est recharge au demarrage (si iptables dans la liste de rc a lancer)

(ouai, ca parrait con, mais je debute: c'est cool d'avoir penser a la rajouter, ce serait con de passer a cote)

en esperant que ca puisse aider/motiver ceux qui aiment les reseaux propres :)

edit: tiens, j'ai commente les domaines, la redir DNS entrante est certainement plus valide

bof, a bien y reflechire, je m'en cogne...

Share this post


Link to post
Share on other sites

×
×
  • Create New...