Здравствуйте!
Помогите, пожалуйста, разобраться в ситуации.Есть маленькая локальная сеть с одним выходом в интернет.
Есть компьютер "А", который работает шлюзом (две сетевые, ipfw, nat, proxy).
Есть компьютер "Б", который работает веб-сервером (одна сетевая).
Есть компьютер "В", который просто компьютер (одна сетевая).Компьютер "А" даёт доступ компьютерам "Б" и "В" наружу, и переадресует http запросы снаружи на веб-сервер "Б". Всё прекрасно работает, интернет есть, веб-сайт извне виден. Проблема в том, к этому самому сайту не получается получить доступ с компьютера "В".
То есть, получается запрос от компьютера "В" сначала проходит через первый nat, а потом должен пройти через второй, который сделает "redirect_port" и где-то вот тут что-то и происходит.
По условиям задачи, обращаться к внутреннему веб-сайту можно только по внешнему адресу.
Задача сейчас вроде бы решена прописыванием в hosts компьютера "В" соответствия между внешним dns-именем веб-сервера и его внутренним (локальным) адресом. Интересует, может ли она решаться без этого.
====
Внешний адрес шлюза: 53.54.55.56
Внутренний адрес шлюза: 192.168.0.150
Внутренний адрес веб-сервера "Б": 192.168.0.221
Внутренний адрес просто компьютера "В": 192.168.0.200
====#!/bin/sh
ipfw -q -f flush
cmd="ipfw -q add"
skip="skipto 800"
pif="rl0"
pip="53.54.55.56"
prnet="192.168.0.0/24"
ipfw -q nat 1 config log if $pif
ipfw -q nat 2 config if rl0 same_ports redirect_port tcp 192.168.0.200:3389 33333 redirect_port tcp 192.168.0.221:80 80 redirect_port tcp 192.168.0.221:9123 9123 redirect_port tcp 192.168.0.221:1935 1935
ipfw -q table 0 flush
ipfw -q table 0 add 8.8.8.8
ipfw -q table 0 add 8.8.8.8
ipfw -q table 0 add 8.8.8.8
ipfw -q table 1 flush
ipfw -q table 1 add 26.27.28.29
ipfw -q table 1 add 26.27.28.30
ipfw -q table 1 add 26.27.28.31$cmd 005 allow all from any to any via vr0
$cmd 008 fwd 127.0.0.1,3128 ip from 192.168.0.0/24 to any dst-port 80,8080 out xmit rl0
$cmd 010 allow all from any to any via lo0$cmd 014 nat 2 tcp from table\(1\) to $pip 33333 in recv rl0
$cmd 015 nat 2 tcp from 192.168.0.200 3389 to any out xmit rl0
$cmd 016 nat 2 tcp from any to $pip 80,9123,1935 in recv rl0
$cmd 017 nat 2 tcp from 192.168.0.221 80,9123,1935 to any out xmit rl0
$cmd 019 nat 1 ip from any to $pip in recv rl0$cmd 050 allow tcp from $pip to any 80 out xmit $pif
$cmd 055 allow tcp from $pip to any 443 out xmit $pif
$cmd 060 allow tcp from $pip to table\(0\) 53 out xmit $pif
$cmd 065 allow udp from $pip to table\(0\) 53 out xmit $pif
$cmd 070 allow tcp from $pip to any out xmit $pif uid root
$cmd 075 allow icmp from $pip to any out xmit $pif
$cmd 080 allow tcp from $pip 53133 to table\(1\) out xmit $pif
$cmd 081 allow tcp from $pip 33333 to table\(1\) xmit $pif
$cmd 082 allow tcp from 192.168.0.200 3389 to any out xmit rl0
$cmd 083 allow tcp from 192.168.0.221 80,9123,1935 to any out xmit rl0
$cmd 084 allow tcp from $pip 80 to any out xmit $pif
$cmd 085 skipto 800 tcp from 192.168.0.200 to any 25,110,443,6669,53134 out xmit rl0$cmd 0100 allow tcp from table\(0\) 53 to $pip in recv $pif
$cmd 0101 allow udp from table\(0\) 53 to $pip in recv $pif
$cmd 0105 allow tcp from any 80 to $pip in recv $pif
$cmd 0110 allow tcp from any 443 to $pip in recv $pif
$cmd 0115 allow tcp from table\(1\) to $pip 53133 in recv $pif
$cmd 0120 allow icmp from any to $pip in recv $pif$cmd 320 deny tcp from any to any 137 in recv $pif
$cmd 321 deny tcp from any to any 138 in recv $pif
$cmd 322 deny tcp from any to any 139 in recv $pif
$cmd 323 deny tcp from any to any 81 in recv $pif
$cmd 400 deny log all from any to any in recv $pif
$cmd 450 deny log all from any to any out xmit $pif$cmd 800 nat 1 ip from $prnet to any out xmit $pif
$cmd 801 allow ip from any to any$cmd 999 deny log all from any to any
> По условиям задачи, обращаться к внутреннему веб-сайту можно только по внешнему адресу.Под внешним адресом подразумевается днс-адрес?
Если да, то может проще поднять внутренний днс-сервер и вашему www.site.com прописать локальный ip?
>> По условиям задачи, обращаться к внутреннему веб-сайту можно только по внешнему адресу.Решение задачи называется DNS view.
WWell,
Спасибо большое за ответы, но насчёт манипуляций с ДНС всё более-менее понятно.Насчёт IPFW какие-нибудь варианты могут быть?
> Спасибо большое за ответы, но насчёт манипуляций с ДНС всё более-менее понятно.
> Насчёт IPFW какие-нибудь варианты могут быть?Скажу честно, с IPFW вам непросто будет это сделать. Дополнительный редирект - это, как правило, еще один инстанс ната. Вэб сервер у вас прямо линком с роутером или через коммутатор?
Если через коммутатор, то можно настроить к нему одностороннюю видимость. Т.е. доступ к нему из локальной сети с правилом keep-state, а все исходящие в локалку - блокировать.
Тогда на роутере пишете правило с fwd и указываете адрес вэб сервера.Если вэб-сервер напрямую с роутером отдельным линком со своей адресацией, то тогда, вводите еще один нат на внутреннем интерфейсе и возможно в позе revers. В общем, экспериментируйте!
Средствами ipfw на шлюзе:
ipfw forward 192.168.0.221 tcp from 192.168.0.200 to 53.54.55.56 dst-port 80 in recv rl0
Возможно придется на веб сервере добавить на lo0 внешний ip адрес шлюза.P.S.
Я бы посоветовал на шлюзе поднять nginx с таким конфигом:
listen 80;
location /
{
proxy_pass http://192.168.0.221;
}
И не нужны пробросы портов, тем более http (который проксируется на ура).Ещё вариант - тупо редирект порта.
Для этого можно использовать redir (есть в портах), или xinetd (умеет делать редирект порта).
Хотя я порекомендовал бы nginx - он решит проблемы, которые у вас, возможно, появятся в будущем.
> Средствами ipfw на шлюзе:
> skipped
> Я бы посоветовал на шлюзе поднять nginx с таким конфигом:
> skipped
> Ещё вариант - тупо редирект порта.
> skippedБлагодарю Вас!