iptables перенаправляет трафик в vpn-туннель, если открыт

iptables перенаправляет трафик в vpn-туннель, если открыт

Я использовал следующее руководство для настройки своего Raspberry Pi в качестве точки доступа:

Raspberry Pi 3 как точка доступа Wi-Fi

Я пересылаю wlan0и eth0NATирую весь свой трафик. Работает отлично!

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интерфейс.

Связанный контент