Как перенаправить трафик локальной сети к клиентскому соединению L2TP / IPsec на шлюзе?
3996
hgl
Я установил на шлюзе соединение клиента L2TP / IPsec и пытаюсь перенаправить свой хост в локальной сети, чтобы использовать это соединение при доступе к Интернету.
Вот топология сети.
Это таблица маршрутизации моего шлюза:
$ ip route default dev pppoe-wan scope link 1.0.0.1 dev ppp1 proto kernel scope link src 192.168.179.11 6.6.6.6 dev pppoe-wan scope link 5.5.5.5 dev pppoe-wan proto kernel scope link src 5.5.5.5 192.168.1.0/24 dev br-lan proto kernel scope link src 192.168.1.1 $ ip rule 1: from all lookup local 10: from 192.168.1.2 lookup 10 32766: from all lookup main 32767: from all lookup default $ ip route show table 10 default dev ppp1 scope link 6.6.6.6 via 5.5.5.5 dev pppoe-wan 192.168.1.0/24 via 192.168.1.1 dev br-lan
Проблема в том, что после добавления маршрута по умолчанию в таблицу 10 мой хост больше не может выходить в Интернет. Использование tcpdump для прослушивания интерфейса ppp1 ( tcpdump -i ppp1) показывает, что через него не проходит никаких пакетов .
Я попытался замаскировать интерфейс ppp1:
$ iptables -t nat -A POSTROUTING -o ppp1 -j MASQUERADE
Это не помогло, до сих пор пакеты не проходили через интерфейс. Также ядру разрешено перенаправлять пакеты:
$ cat /proc/sys/net/ipv4/ip_forward 1
Но если я использую интерфейс непосредственно на шлюзе, он работает просто отлично:
$ curl --interface ppp1 google.com <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> <TITLE>302 Moved</TITLE></HEAD><BODY> <H1>302 Moved</H1> The document has moved <A HREF="http://www.google.com.hk/?gfe_rd=cr&ei=suORVbLfOKXC8Af3noGwDA">here</A>. </BODY></HTML>
Похоже, ядро Linux шлюза каким-то образом отбросило пакеты с моего хоста. Но ни в одном интерфейсе не включена фильтрация обратного пути:
PS Только IP-адрес шлюза и IP-адрес сервера были заменены поддельными IP-адресами, все остальные IP-адреса являются реальными.
Вы помните, чтобы разрешить пересылку IPv4? * echo 1> / proc / sys / net / ipv4 / ip_forward * как sudo.
MariusMatutiae 9 лет назад
0
Да, я сделал. Спасибо за упоминание этого. Я редактировал вопрос, чтобы упомянуть ядро позволяет пересылку. (OpenWrt позволяет пересылку по умолчанию.)
hgl 9 лет назад
0
Откуда вы знаете, что ваше L2TP / IPSec соединение работает? Если вы * свернули Google * из шлюза, вы используете * main * таблицу рутинга, а не таблицу маршрутизации * 10 *. Убедитесь, что VPN-соединение работает, изменив правила ip для принудительного подключения к Google через туннель. Но делайте это временно, все идет не так (как я думаю), вы перезагружаете маршрутизатор и все в порядке.
MariusMatutiae 9 лет назад
0
Обратите внимание на флаг `--interface`. Я почти уверен, что соединение L2TP / IPSec работает. Если я запускаю `curl --interface ppp1 ipinfo.io`, он сообщает о местонахождении моего l2tp-сервера в стране, отличной от шлюза.
hgl 9 лет назад
0
Пожалуйста, попробуйте мой ответ, чтобы проверить, правильно ли он? Ty
MariusMatutiae 9 лет назад
0
2 ответа на вопрос
1
hgl
Я наконец решил это. Пакеты отбрасываются сетевым фильтром (iptables).
OpenWrt по умолчанию отбрасывает пакеты, пересылаемые с br-lan. Поэтому нам нужно разрешить пересылку пакетов из br-lan в ppp1.
$ iptables -I FORWARD -i br-lan -o ppp1 -j ACCEPT
После этого хозяин получает доступ в интернет.
Обратите внимание, что вам необходимо использовать -Iэто правило, чтобы оно вставлялось перед правилом удаления, чтобы оно имело приоритет.
Поэтому мой комментарий об использовании tcpdump для проверки того, что пакеты из br-lan могут достигать ppp1 и ppoe-wan, в конце концов, сработал. Рад это видеть.
MariusMatutiae 9 лет назад
0
Извините, я не очень хорошо поняла ваше намерение. интерфейс проверки связи не поразил меня, что netfilter может быть дьяволом. :) Но почему я проголосовал?
hgl 9 лет назад
0
Вы не против меня.
MariusMatutiae 9 лет назад
0
0
MariusMatutiae
Вы маскируете не тот интерфейс. Вы должны маскироваться, потому что, по сути, вы НАСТАИВАЕТЕ, но виртуальный интерфейс не может быть напрямую маскирован.
Вместо этого вы должны использовать:
iptables -t nat -A POSTROUTING -o pppoe-wan -j MASQUERADE
Это маскирует все, что выходит из вашего обычного интерфейса, среди которых будут пакеты NATted с вашего хоста Yosemite.
Меня поразило, что это единственное слабое место в вашей дискуссии выше. После некоторых поисков я смог убедиться, что это действительно так, прочитав эту вики-страницу Debian . На этот раз мой любимый Arch Linux Wiki бросил меня.
Сначала я очень хочу поблагодарить вас за ваши усилия. Я действительно хотел бы принять ваш ответ, но, к сожалению, это правило добавляется openwrt по умолчанию, иначе хост никогда не смог бы получить доступ к Интернету, даже без маршрута по умолчанию для соединения l2tp.
hgl 9 лет назад
0
@hgl Можете ли вы запустить tcpdump на своем роутере? просто пингуйте с хоста и слушайте сначала pp1, затем ppoe-wan.
MariusMatutiae 9 лет назад
0
Конечно. Я почти уверен, что ping с хоста на br-lan не генерирует пакетов на ppp1 или pppoe-wan; pppoe-wan, ppp1 ничего, pppoe-wan, ну, я не уверен, какие пакеты фильтровать на pppoe-wan.
hgl 9 лет назад
0