Jump to content
Калькуляторы

IPTABLES перенаправление трафик

Схема такая. В сети поднят DHCP, который выдает белые и серые IP адреса. Белые ходят в интернет, серые тухнут на NAS сервер.

Как можно сделать с помощью iptables что бы весь трафик с серых IP перенаправлялся на биллинг сервер на 80 порт (личный кабинет пользователя)

Share this post


Link to post
Share on other sites

iptables -t nat -I PREROUTING -i eth0 -p tcp -s 10.0.0.0/8 ! -d 10.0.0.0/8 --dport 80 -j DNAT --to-destination ип_личного_кабинета:80

 

вместо 10/8 подставить свой диапазон серости

Share this post


Link to post
Share on other sites

iptables -t nat -I PREROUTING -i eth0 -p tcp -s 10.0.0.0/8 ! -d 10.0.0.0/8 --dport 80 -j DNAT --to-destination ип_личного_кабинета:80

 

вместо 10/8 подставить свой диапазон серости

Подогнал правило под себя

 iptables -t nat -I PREROUTING -i eth1.209 -p tcp -s 10.1.0.0/8 ! -d 10.1.0.0/8 --dport 80 -j DNAT --to-destination 91.*.*.158:80

не работает. Уже тонну мануалов перерыл.

Вот что говорит tcpdump на NAS

root@nas3:~# tcpdump -n host 10.1.0.3
tcpdump: WARNING: eth1: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
09:48:31.317385 IP 10.1.0.3.1087 > 213.180.193.3.80: Flags [s], seq 452347902,
win 65535, options [mss 1460,nop,nop,sackOK], length 0
09:48:31.914375 IP 10.1.0.3.1088 > 213.180.193.3.80: Flags [s], seq 1399971826,
win 65535, options [mss 1460,nop,nop,sackOK], length 0
09:48:34.817184 IP 10.1.0.3.1088 > 213.180.193.3.80: Flags [s], seq 1399971826,
win 65535, options [mss 1460,nop,nop,sackOK], length 0

213.180.193.3 это IP адрес яндекса. На тестовой машине в браузере я набираю ya.ru

 

Вот что говорит tcpdump на биллинге

root@my:~# tcpdump -n host 10.1.0.3
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
13:48:17.299280 IP 10.1.0.3.1087 > 91.*.*.158.80: Flags [s], seq 452347902,
win 65535, options [mss 1460,nop,nop,sackOK], length 0
13:48:17.299323 IP 91.*.*.158.80 > 10.1.0.3.1087: Flags [s.], seq 409408263
0, ack 452347903, win 5840, options [mss 1460,nop,nop,sackOK], length 0
13:48:17.299586 IP 10.1.0.3.1087 > 91.*.*.158.80: Flags [R], seq 452347903,
win 0, length 0
13:48:23.314824 IP 10.1.0.3.1087 > 91.*.*.158.80: Flags [s], seq 452347902,
win 65535, options [mss 1460,nop,nop,sackOK], length 0
13:48:23.314860 IP 91.*.*.158.80 > 10.1.0.3.1087: Flags [s.], seq 418807538
9, ack 452347903, win 5840, options [mss 1460,nop,nop,sackOK], length 0
13:48:23.315070 IP 10.1.0.3.1087 > 91.*.*.158.80: Flags [R], seq 452347903,
win 0, length 0
13:48:23.911814 IP 10.1.0.3.1088 > 91.*.*.158.80: Flags [s], seq 1399971826
, win 65535, options [mss 1460,nop,nop,sackOK], length 0
13:48:23.911829 IP 91.*.*.158.80 > 10.1.0.3.1088: Flags [s.], seq 738921429
, ack 1399971827, win 5840, options [mss 1460,nop,nop,sackOK], length 0
13:48:23.912311 IP 10.1.0.3.1088 > 91.*.*.158.80: Flags [R], seq 1399971827
, win 0, length 0
13:48:26.814884 IP 10.1.0.3.1088 > 91.*.*.158.80: Flags [s], seq 1399971826
, win 65535, options [mss 1460,nop,nop,sackOK], length 0
13:48:26.814914 IP 91.*.*.158.80 > 10.1.0.3.1088: Flags [s.], seq 784282069
, ack 1399971827, win 5840, options [mss 1460,nop,nop,sackOK], length 0
13:48:26.815498 IP 10.1.0.3.1088 > 91.*.*.158.80: Flags [R], seq 1399971827
, win 0, length 0

91.*.*.158.80 это IP адрес биллинг

Share this post


Link to post
Share on other sites

Подогнал правило под себя

 

iptables -t nat -I PREROUTING -i eth1.209 -p tcp -s 10.1.0.0/8 ! -d 10.1.0.0/8 --dport 80 -j DNAT --to-destination 91.*.*.158:80

добавьте

 

 

iptables -t nat -I POSTROUTING -i eth1.209 -p tcp -s 10.1.0.0/8 ! -d 10.1.0.0/8 --dport 80 -j SNAT --to x.x.x.x

 

где x.x.x.x ip интерфейса этого роутера который смотрит в сторону 91.*.*.158

 

т.е. вам нужно делать nat 2 раза, либо как вариант:

поднимаете на этом роутере http сервер (apache lighttpd mini-httpd) и настраиваете для всего трафика редирект на 91.*.*.158 (т.е. http сервер всегда отвечает пользователю редиректом на биллинг).

после этого можно будет сделать

iptables -t nat -I PREROUTING -i eth1.209 -p tcp -s 10.1.0.0/8 ! -d 10.1.0.0/8 --dport 80 -j REDIRECT --to 91.*.*.158

Share this post


Link to post
Share on other sites

двойной нат не удобен тем что в биллинге вы получите IP вашего НАСа, а не абонента, можно конечно решить двойным редиректом... я лично предпочел ставить nginx на nasах, это не требует ресурсов сервера... за то достаточно обычного редиректа в иптайлесе:

iptables -t nat -A PREROUTING ! -d 10.0.0.0/8 -i vlan256 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 81 (точим под себя.)

 

конфиг выглядит так:

 

server {
	keepalive_timeout 3;
	listen		81;
	server_name	localhost;
	access_log off;
	access_log /var/log/nginx-no_access main;
	if ($http_user_agent ~ "MailRuSputnik") { return 503; }
	if ($http_user_agent ~ "torrent") { return 503; }
	if ($http_user_agent ~ "Torrent") { return 503; }
	if ($http_user_agent ~ "Windows-Update-Agent") { return 503; }
	if ($http_user_agent ~ "Microsoft NCSI") { return 503; }
	if ($http_user_agent ~ "NOD32 Update") { return 503; }
	if ($http_user_agent ~ "ESS Update") { return 503; }
	if ($http_user_agent ~ "Google Update") { return 503; }

	add_header Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0";
	add_header Pragma "no-cache";
	expires -1;
        add_header Last-Modified $sent_http_Expires;


	rewrite .* http://ваш-сайт/block/no_access.php?$remote_addr|__|$local_day|__|http://$host$uri redirect;
	location / {
	    root /var/www;
	    deny all;
	}
}

 

т.к. я вставил в строку редиректа время-дату, то в основной секции nginx у меня ещё есть строчка:

perl_set $local_day 'sub { my @x = localtime; return sprintf "%04u-%02u-%02u_%02u:%02u:%02u", $x[5]+1900, $x[4]+1, $x[3], $x[2],$x[1],$x[0] }';

п.с. требует сборки nginx с поддержкой perl, но более красивого решения как вставить время редиректа в урл - я не нашел :(

в итоге абонент получает страницу на сайте провайдера с ошибкой и комментариями, ссылкой куда он пытался перейти.

все настройки подобраны что бы кеширования не было вообще, хотя нужно признать иногда случается, глюки браузеров... и в этот момент какраз помогает время дата в ссылке, можно сразу понять, это глюк и правило не добавилось, или тупой кеш со вчерашнего дня :)

 

логи советую отключать после тестов, ибо не к чему они....

 

забросы от свяких левых программ отбрасываем, ибо ни к чему им отсылать html страницы если они ждут чего-то другого, это нам позволит снизить нагрузку на сайт, ибо обычно эти проги получая в ответ не то чего они ожидали долбятся до потери пульса каждую секунду :) вполне возможно что в список можно добавить ещё что-то, составлялся давно на основе логов...

Edited by KotikBSd

Share this post


Link to post
Share on other sites

Всем спасибо за подсказку. Решил все таким способом

 iptables -t nat -A PREROUTING -i eth1.209 -p tcp -s 10.0.0.0/8 -j DNAT --to-destination 91.*.*.153:80
iptables -t nat -A PREROUTING -i eth1.209 -p udp -s 10.0.0.0/8 -j DNAT --to-destination 91.*.*.153:80

И прописаным route на биллинге что бы пакеты обратно на источник уходили

10.1.0.0        91.*.*.153  255.255.252.0   UG    0      0        0 eth0

Edited by FATHER_FBI

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.