shorewall при устранении неполадок с прокси-сервером Debian
Настройка: прокси-сервер debian -> маршрутизатор linsys -> внутренний сервер Ubuntu
Проблема в том, что я могу получить доступ к веб-серверу Ubuntu (apache2), введя 192.168.1.128 в браузере на моем прокси Debian. Однако мое правило пересылки shorewall не позволяет использовать одно из следующих правил:
#Web/DNAT net loc:192.168.1.128
#DNAT net loc:192.168.1.128:80 tcp 80 - 70.90.XXX.XX
Дополнительная информация:
У меня есть внутренний сервер Ubuntu, принимающий все соединения прямо сейчас для целей отладки (также установлен shorewall)
вырвал вывод из 'shorewall show log' (на компьютере с Debian):
Feb 1 19:37:15 fw2loc:ACCEPT:IN= OUT=eth1 SRC=192.168.1.137 DST=224.0.0.251 LEN=104 TOS=0x00 PREC=0x00 TTL=255 ID=0 DF PROTO=UDP SPT=5353 DPT=5353 LEN=84
Feb 1 19:40:31 fw2loc:ACCEPT:IN= OUT=eth1 SRC=192.168.1.137 DST=224.0.0.251 LEN=104 TOS=0x00 PREC=0x00 TTL=255 ID=0 DF PROTO=UDP SPT=5353 DPT=5353 LEN=84
Вывод 'shorewall show nat' (на компьютере с Debian):
Chain PREROUTING (policy ACCEPT 235 packets, 74689 bytes)
pkts bytes target prot opt in out source destination
12 724 net_dnat all -- eth0 * 0.0.0.0/0 0.0.0.0/0
Chain POSTROUTING (policy ACCEPT 8 packets, 670 bytes)
pkts bytes target prot opt in out source destination
3 242 eth0_masq all -- * eth0 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 7 packets, 611 bytes)
pkts bytes target prot opt in out source destination
Chain eth0_masq (1 references)
pkts bytes target prot opt in out source destination
1 69 MASQUERADE all -- * * 192.168.1.0/24 0.0.0.0/0
Chain net_dnat (1 references)
pkts bytes target prot opt in out source destination
2 128 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:192.168.1.128
0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 to:192.168.1.128
РЕДАКТИРОВАТЬ:
Я должен также упомянуть, что после проверки журналов apache на компьютере с Ubuntu, ни один из запросов, кажется, не делает это. Когда я делаю запрос из локальной сети, я получаю запись в журнале доступа, но когда я делаю запрос извне локальной сети через прокси, я ничего не получаю.
Вывод 'iptables -vnL' на прокси:
22 1280 TCPMSS tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x06/0x02 TCPMSS clamp to PMTU
22 1280 eth0_fwd all -- eth0 * 0.0.0.0/0 0.0.0.0/0
22 1280 dynamic all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID,NEW
22 1280 smurfs all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID,NEW
22 1280 tcpflags tcp -- * * 0.0.0.0/0 0.0.0.0/0
22 1280 net2loc all -- * eth1 0.0.0.0/0 0.0.0.0/0
1 60 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443
22 1280 ACCEPT tcp -- * * 0.0.0.0/0 192.168.1.128 tcp dpt:80
Не совсем уверен, что делать с этим...
Я начинаю задаваться вопросом, есть ли фундаментальная проблема с попыткой пройти через маршрутизатор Linksys, и если я должен просто пойти Debian -> Ubuntu с кроссовером...
РЕДАКТИРОВАТЬ 2
Похоже, что пакеты пересылаются правильно (я думаю, именно это для нас сделал вывод 'shorewall show nat')
Вывод из 'tcpdump -n -i port 80'
общедоступный интерфейс:
20:15:40.458118 IP 71.182.212.251.57261 > 70.90.XXX.XXX.80: S 2834662754:2834662754(0) win 65535 <mss 1452,nop,wscale 3,nop,nop,timestamp 25163236 0,sackOK,eol>
приватный интерфейс:
20: 15: 45.405347 IP 71.182.212.251.57261> 192.168.1.128.80: S 2834662754: 2834662754 (0) победа 65535
После нескольких вышеперечисленных пакетов это превращается в:
20:16:17.623882 IP 71.182.212.251.57254 > 70.90.XXX.XXX.80: S 1673429824:1673429824(0) win 65535 <mss 1452,sackOK,eol>
а также
20:16:17.623917 IP 71.182.212.251.57254 > 192.168.1.128.80: S 1673429824:1673429824(0) win 65535 <mss 1452,sackOK,eol>
3 ответа
Какой хост установлен как шлюз по умолчанию на вашем сервере Ubuntu? Если это не ваш прокси-сервер Debian, вы должны добавить другое правило в /etc/shorewal/masq:
eth1:192.168.1.128 0.0.0.0/0 192.168.1.137 tcp 80
Я предполагаю, что ваша сетевая карта прокси-сервера Debian является eth1, а IP-адрес сервера Debian - 192.168.1.137. По сути, проблема в том, что правило DNAT не изменяет исходный IP-адрес в переадресованных пакетах, поэтому ваш сервер Ubuntu пытается напрямую ответить на источник запроса, который находится за пределами вашей локальной сети. Для связи он использует шлюз по умолчанию, поэтому ответ никогда не попадает в окно Debian. Это дополнительное правило изменяет исходный IP-адрес на IP-адрес самого прокси-сервера, поэтому оно должно помочь. В любом случае, вероятно, это не то, что вам нужно, потому что Apache в Ubuntu будет записывать IP-адрес Debian в качестве IP-адреса клиента для доступа к журналам для каждого запроса.
Прежде всего, я предполагаю, что знак #
перед каждым правилом нет файлов конфигурации (он комментирует эту строку, делая его бесполезным).
Попробуйте отслеживать сетевой трафик на прокси-сервере на обоих интерфейсах, публичном и частном. На общественной стороне:
# tcpdump -n -i <public interface> port 80
На частной стороне:
# tcpdump -n -i <private interface> port 80 and host 192.168.1.128
Когда вы делаете запросы из внешнего мира, вы не видите трафика на частной стороне, тогда вам следует проверить:
Ядро позволяет пересылать трафик (должен быть один):
cat /proc/sys/net/ipv4/ip_forward
Если он возвращает 0:
echo 1 > /proc/sys/net/ipv4/ip_forward
Политика по умолчанию для FORWARD
цепь на столе фильтра
iptables -nL | grep 'Chain FORWARD'
(согласно предоставленной вами информации, вместо FORWARD вы должны увидеть ее в цепочке net2loc)
Если по умолчанию используется политика REJECT / DROP, найдите правило в цепочке FORWARD, которое позволяет перенаправлять трафик на HTTP-сервер:
iptables -vnL FORWARD | grep 192.168.1.128
(again, if nothing meaningfull comes up on FORWARD, check net2loc).
If this doesn't return a line (and policy is REJECT / DROP) then you are missing the rule that allows you to forward traffic... double check shorewall configuration. Установить loc
log to info
on the policy configuration file, force a rule:
iptables -A net2loc -i <public iface> -o <private iface> \
--dst 192.168.1.128 -p tcp --dport 80 -j ACCEPT
And see what happens.
The alternative, when making requests from an external location, and you see it on the private side, that would mean that something else is wrong (check the linksys router forwarding policy, routes, etc).
I wouldn't do what @Alex recomends as it is risked. You loose every trace of who is accessing you service therefore you loose statistics. If there is any attack on your site, it is impossible to determine where is it comming from by just looking at your webserver logs, and lots of other reasons. Обычно SNAT
from public networks to private destinations is highly discouraged.
Ладно, похоже, что теперь все происходит немного по-другому:
Теперь я просто захожу в прокси Debian -> Ubuntu server (больше нет маршрутизатора linksys). Я все равно решил не использовать роутер, потому что это то, что мы используем для беспроводной связи в нашем офисе. В любом случае, с моей стороны, мне кажется, что иметь защищенный сервер, подключенный к маршрутизатору офиса, не слишком разумно.
Сводка изменений:
Дали частным интерфейсам обеих машин статические локальные IP-адреса со следующими
iface eth0 inet static
ipaddress 192.168.1.128 #the other one got 192.168.1.137
netmask 255.255.255.255
network 192.168.1.0
перезапущенные сетевые устройства
перезапустил shorewall
Кажется, что Shorewall работает хорошо, и мои логи apache информативны (они не просто говорят, что все запросы поступают с машины Debian)
Спасибо всем за помощь, я использовал все, что было размещено здесь, чтобы прийти к тому, что я надеюсь, является приемлемым решением.