
Я использовал следующее руководство для настройки своего Raspberry Pi в качестве точки доступа:
Raspberry Pi 3 как точка доступа Wi-Fi
Я пересылаю wlan0
и eth0
NATирую весь свой трафик. Работает отлично!
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
Теперь я хочу настроить те же правила, но использовать интерфейс tun0-00
и пересылатьвсемой трафик через мой vpn туннель. Я хочу отправить его весь, не хочу, чтобы что-то просочилось в хост-сеть. Думаю, это будет примерно так:
sudo iptables -t nat -A POSTROUTING -o tun0-00 -j MASQUERADE
sudo iptables -A FORWARD -i tun0-00 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o tun0-00 -j ACCEPT
К сожалению, я знаю, что эти правила iptables не являются полными... Проблема в том, что они eth0
остаются; исходное правило пересылки трафика все eth0
еще существует.
Я хочу направлять весь свой трафик через туннель, если он открыт; если нет, то меня вполне устроит использование eth0
.
Обновлять:
Использовал флаг -I для вставки своих правил:
sudo iptables -t nat -I POSTROUTING 1 -o tun0-00 -j MASQUERADE
sudo iptables -I FORWARD 1 -i tun0-00 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -I FORWARD 1 -i wlan0 -o tun0-00 -j ACCEPT
Цепочка FORWARD:
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT all -- wlan0 tun0-00 0.0.0.0/0 0.0.0.0/0
2 0 0 ACCEPT all -- tun0-00 wlan0 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
3 0 0 ACCEPT all -- eth0 wlan0 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
4 0 0 ACCEPT all -- wlan0 eth0 0.0.0.0/0 0.0.0.0/0
5 0 0 ACCEPT all -- wlan1 wlan0 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
6 0 0 ACCEPT all -- wlan0 wlan1 0.0.0.0/0 0.0.0.0/0
По-прежнему ничего не радует, пересылка, похоже, не работает.
Конфигурация VPN-клиента
Я удалил то, что показалось мне деликатным:
dev tun
persist-tun
persist-key
cipher AES-256-CBC
auth SHA1
tls-client
client
resolv-retry infinite
remote XXX.XXX.XXX.XXX PORT_NUM udp
lport XXX
verify-x509-name "VPN_Certificate" name
pkcs12 CERT_NAME.p12
tls-auth CERTIFICATE-tls.key 1
ns-cert-type server
redirect-gateway local def1
Pi подключается нормально и отображает другой публичный IP. Клиенты по-прежнему показывают pi как свой шлюз, но они больше не могут подключиться.
Решение
Сначала мне нужно было добавить redirect-gateway def1
в файл .ovpn на pi.
Затем мне нужно было на самом деле правильно ввести имя моего интерфейса... Тьфу. Я чувствую себя сумасшедшим, но, видимо, я видел его tun0-00
в начале, и это был единственный раз, когда он существовал. Интерфейс на самом деле просто tun0
.
Итак, соответствующие команды iptables были следующими:
sudo iptables -t nat -I POSTROUTING 1 -o tun0 -j MASQUERADE
sudo iptables -I FORWARD 1 -i tun0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -I FORWARD 1 -i wlan0 -o tun0 -j ACCEPT
Теперь работает отлично!
решение1
Вам понадобятся оба набора правил в iptables
. Два набора правил гарантируют, что трафик, исходящий от указанных интерфейсов, будет соответствующим образом замаскирован. Вот мое предложение, которое немного проще вашего:
# Masquerade outgoing traffic
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
# Allow return traffic
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
# Forward everything
iptables -A FORWARD -j ACCEPT
Часть головоломки, которой не хватает, — это маршрутизация. Если туннель работает, вы хотите, чтобы «весь» исходящий трафик использовал его. В противном случае используйте обычный маршрут.
Это обрабатываетсяв OpenVPNиспользуя redirect-gateway def1
параметр в конфигурации вашего клиента.
решение2
Удобный инструмент — составить список существующих правил с номерами строк:
iptables --line-numbers -t filter -L FORWARD
Вы можете удалить правила с помощью -D
опции:
iptables -t filter -D FORWARD 1
Вы можете вставить новое правило в указанное место с помощью -I
опции:
iptables -t filter -I FORWARD 0 blah-blah-blah
это приведет к вставке нового правила в самое начало таблицы, поэтому оно будет применено в первую очередь.
Редактировать:
Как правило, вам нужно только одно правило в FORWARD
таблице, которое соответствует -m state --state RELATED,ESTABLISHED
:
-I FORWARD 1 -m state --state RELATED,ESTABLISHED -j ACCEPT
поскольку отслеживание соединений позволит маршрутизировать все уже известные соединения.
И да, вам нужно настроитьмаршрутизация политикиперенаправлять ваш wlan
трафик не на шлюз по умолчанию, который, скорее всего, доступен через ваш ethernet
интерфейс, а через vpn
интерфейс.