Всем привет. Нужна ваша помощь. Ситуация такая: Имею Ethernet модем который пропускает весь трафик на сервер выполняющий роль интернет-шлюза. Работает на GNU / Linux CentOS 5.5. Роль брандмауэра выполняет iptables, а также есть настроенный прозрачный прокси с помощью squid. Нужно сделать следующее - из белого ip перенаправить на конкретный адрес внутренней сети.
Как из белого ip перенаправить на конкретный адрес внутренней сети?
Эм трафик нужно направить на определённый IP или пробросить порт во внутреннюю сеть ?
Входящий из вне на белый ip трафик перенаправить на конкретный ip адрес внутренней сети. То есть я к примеру сижу у себя дома ввожу в браузере белый ip рабочей сети и меня перебрасывает на конкретный ip локальной сети на роботе.
Пример: на работе белый ip 1.2.3.4, внутренний ip 192.168.0.55. Когда я дома через браузер наберу 1.2.3.4 меня надо перенаправить на 192.168.0.55.
Это как технология DMZ на роутерах.
Делал у себя так:
1) Нужный трафик с модема, следует направить на шлюз.
2) Настроить правила iptables.
(для примера)
-- При обращении к серверу 192.168.1.34 по протоколу tcp на порт 8000 интерфейса eth0, перенаправлять запросы на сервер 192.168.2.5 порт 8000
[console]# iptables -t nat -A PREROUTING --dst 192.168.1.34 -i eth0 -p tcp --dport 8000 -j DNAT --to-destination 192.168.2.5:8000[/console]
[console]# iptables -I FORWARD 1 -i eth0 -o eth1 -d 192.168.2.5 -p tcp -m tcp --dport 8000 -j ACCEPT[/console]
Впрочем, я когда-то давно это настраивал.
================
Надеюсь я правильно понял структуру сети
компьютер к которому нужно подключиться --> Шлюз (локальный ip) --> Модем (Белый ip) --> интернет <-- дом
Делал у себя так:
1) Нужный трафик с модема, следует направить на шлюз.
2) Настроить правила iptables.
(для примера)
-- При обращении к серверу 192.168.1.34 по протоколу tcp на порт 8000 интерфейса eth0, перенаправлять запросы на сервер 192.168.2.5 порт 8000
[console]# iptables -t nat -A PREROUTING --dst 192.168.1.34 -i eth0 -p tcp --dport 8000 -j DNAT --to-destination 192.168.2.5:8000[/console]
[console]# iptables -I FORWARD 1 -i eth0 -o eth1 -d 192.168.2.5 -p tcp -m tcp --dport 8000 -j ACCEPT[/console]
Впрочем, я когда-то давно это настраивал.
================
Надеюсь я правильно понял структуру сети
компьютер к которому нужно подключиться --> Шлюз (локальный ip) --> Модем (Белый ip) --> интернет <-- дом
Были похожие мысли:
iptables -t nat -A PREROUTING --dst 1.2.3.4 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.55
iptables -t nat -A POSTROUTING --dst 192.168.0.55 -p tcp --dport 80 -j SNAT --to-source 192.168.0.1
iptables -t nat -A OUTPUT --dst 1.2.3.4 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.55
iptables -I FORWARD 1 -i eth0 -o eth1 -d 192.168.0.55 -p tcp -m tcp --dport 80 -j ACCEPT
где 192.168.0.55 - ip локальной машины
1.2.3.4 - ip белий
192.168.0.1 - внутренний IP-адрес шлюза, в локальной сети
но при вводе команды выдает bash: iptables: command not found. Может вручную отредактировать файл /etc/sysconfig/iptables?
А от рута не пробывали запускать команду???
Я думаю, что нужно было бы просто зайти под root командой:
[console]$ su - root[/console]
При необходимости, подсказать операционной системе, где находится iptables.
[quote=Marley]Делал у себя так:
1) Нужный трафик с модема, следует направить на шлюз.
2) Настроить правила iptables.
(для примера)
-- При обращении к серверу 192.168.1.34 по протоколу tcp на порт 8000 интерфейса eth0, перенаправлять запросы на сервер 192.168.2.5 порт 8000
[console]# iptables -t nat -A PREROUTING --dst 192.168.1.34 -i eth0 -p tcp --dport 8000 -j DNAT --to-destination 192.168.2.5:8000[/console]
[console]# iptables -I FORWARD 1 -i eth0 -o eth1 -d 192.168.2.5 -p tcp -m tcp --dport 8000 -j ACCEPT[/console]
Впрочем, я когда-то давно это настраивал.
================
Надеюсь я правильно понял структуру сети
компьютер к которому нужно подключиться --> Шлюз (локальный ip) --> Модем (Белый ip) --> интернет <-- дом
Были похожие мысли:
iptables -t nat -A PREROUTING --dst 1.2.3.4 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.55
iptables -t nat -A POSTROUTING --dst 192.168.0.55 -p tcp --dport 80 -j SNAT --to-source 192.168.0.1
iptables -t nat -A OUTPUT --dst 1.2.3.4 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.55
iptables -I FORWARD 1 -i eth0 -o eth1 -d 192.168.0.55 -p tcp -m tcp --dport 80 -j ACCEPT
где 192.168.0.55 - ip локальной машины
1.2.3.4 - ip белий
192.168.0.1 - внутренний IP-адрес шлюза, в локальной сети
но при вводе команды выдает bash: iptables: command not found. Может вручную отредактировать файл /etc/sysconfig/iptables?[/quote]
Можно.
И можно 2 варианта:
1. $(which iptables) бла, бла...
2. /usr/sbin/iptables бла, бла...
Главное из под рута.
Я модемы никогда не настраивал, только маршрутизаторы.
У него есть ip адрес внутренней сети?
Т.е. Белый адрес на интерфейсе сервера или на модеме?
Я думаю, что нужно было бы просто зайти под root командой:
[console]$ su - root[/console]
При необходимости, подсказать операционной системе, где находится iptables.
Извините за глупый вопрос, но как подсказать ОС где находится iptables? Все делаю под root.
[console]# echo $PATH[/console]
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[console]# which iptables[/console]
/sbin/iptables
Чтобы вызвать iptables без явного указания пути, нужно, чтобы каталог где находится программа был указан в $PATH
Добавить путь в PATH можно командой:
[console]export PATH=$PATH:/some_folder[/console]
============
Зайти под root можно с выполнением стартовых скриптов и без.
Чтобы зайти с выполнением и задать переменные вроде $PATH, нужно выполнить su - root. Без - он не выполнит какие-то скрипты и переменная $PATH может быть пустой. Деталей точнее не помню.
Я думаю, что нужно было бы просто зайти под root командой:
[console]$ su - root[/console]
При необходимости, подсказать операционной системе, где находится iptables.
Через команду iptables все же удалось забить нужные строчки, сохранил с помощью команды iptables-save, перегрузил /etc/init.d/iptables restart и в итоге нечего. хочу попробовать немножко переделать команды но не вижу их в файле /etc/sysconfig/iptables. Изменений в нем нет. Это потому что они не сохранились, или записались не туда?
обычно так:
iptables-save > /path/file обратно:
iptables-resore < /path/fileвторую строчку обычно в /etc/rc.local
Вот вики написано что нужно вот такой командой сохранят настройки
[console]/sbin/service iptables save[/console]
/sbin/service iptables save сработал лучше чем iptables-save. данные уже сохранились, но не все.
iptables -I FORWARD 1 -i eth1 -o eth0 -d 192.168.0.55 -p tcp -m tcp --dport 80 -j ACCEPT - там нет (/etc/sysconfig/iptables). Может команда неправильная?
Я знаю что зачастую прописывают "eth0 -o eth1" а не "eth1 -o eth0", но у меня eth1 внешний интерфейс шлюза а eth0 внутренний интерфейс шлюза.
Или она сохраняется в другом месте?
iptables хранит правила в 3х таблицах.
filter
nat
mangle
Вывести данные таблиц на экран можно командами:
# iptables -L (таблица fillter по умолчанию)
# iptables -t nat -L
# iptables -t mangle -L
Правила которые вы вводите применяются сразу. Но если их не сохранить, то после перестартовки сервиса iptables они потеряются.
Если при выполнении команды, ошибок не возникает правило добавляется в таблицу.
Iptables сравнивает правила для пакета сверху вниз, до первого подходящего действия которое нужно выполнить.
После сохранения правил, покажыте вывод файла с сохранёными правилами. Можно наверное ручками дописать в него правила.
Правила все сохраняются в /etc/sysconfig/iptables. Потом, после проверки, оказалось что с внешнего адреса, все же идет перенаправление на локальный адрес сети, то есть какой бы из них я не вбил я попадаю на нужный мне вебсерве. Это как раз то что мне нужно, но происходит процесс только когда я делаю его из рабочей сети, когда же пробою подключится из вне, ничего не происходит. то есть как мне кажется тот адрес который я считал белым или внешним, это не он. Сеть у меня имеет 2 интерфейса, один внешний eth1 (как мне кажется) а другой внутренний eth0 который разбит на две подсети. ресурсы вроде http://2ip.ru/ выдает мне ip именно eth1. Может ли быть такое что с реального внешнего ip идет перенапрвления на ip eth1 и по этому ресурсы типа 2ip.ru видят его как внешний. Если да то как узнать настоящий внешний адрес. Адрес модема я не знаю и подключится стандартными способами типа 192.168.0.1 или по адресу шлюза не могу + нет пароля на модем... ресетнуть его тоже не могу так как настройки неизвестны мне его. Человека который когда то настраивал сеть уже не достать. Поделитесь пожалуйста своими мыслями!
Правила все сохраняются в /etc/sysconfig/iptables. Потом, после проверки, оказалось что с внешнего адреса, все же идет перенаправление на локальный адрес сети, то есть какой бы из них я не вбил я попадаю на нужный мне вебсерве. Это как раз то что мне нужно, но происходит процесс только когда я делаю его из рабочей сети, когда же пробою подключится из вне, ничего не происходит. то есть как мне кажется тот адрес который я считал белым или внешним, это не он. Сеть у меня имеет 2 интерфейса, один внешний eth1 (как мне кажется) а другой внутренний eth0 который разбит на две подсети. ресурсы вроде http://2ip.ru/ выдает мне ip именно eth1. Может ли быть такое что с реального внешнего ip идет перенапрвления на ip eth1 и по этому ресурсы типа 2ip.ru видят его как внешний. Если да то как узнать настоящий внешний адрес. Адрес модема я не знаю и подключится стандартными способами типа 192.168.0.1 или по адресу шлюза не могу + нет пароля на модем... ресетнуть его тоже не могу так как настройки неизвестны мне его. Человека который когда то настраивал сеть уже не достать. Поделитесь пожалуйста своими мыслями!
ну так может всетки покажеш нам вывод
iptables -L -n -v
iptables -t nat -L -n -vа то как назло все наши телепаты на летнем отдыхе ;)
Покажу. Только завтра. Нужно до работы добраться.