Я установил клиент OpenVPN на моем домашнем маршрутизаторе. В тот момент, когда туннель поднимается, я больше не могу пропинговать свой роутер из интернета, используя его WAN_IP. Я хотел бы разрешить определенные входящие соединения (ping, ssh) через интерфейс WAN, когда туннель vpn включен. Я прочитал немного об этом, и я понимаю, что мне нужна маршрутизация на основе источника.
Я пытался реализовать это, но это не работает. Вот что я сделал:
# ip rule list
0: from all lookup local
32765: from all fwmark 0x1 lookup 128
32766: from all lookup main
32767: from all lookup default
# ip route list table 128
default via WAN_IP dev vlan2
# iptables -t mangle -nvL PREROUTING
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 CONNMARK all -- br0 * 0.0.0.0/0 0.0.0.0/0 CONNMARK restore
0 0 CONNMARK all -- vlan2 * 0.0.0.0/0 0.0.0.0/0 CONNMARK set 0x1
# iptables -t mangle -nvL OUTPUT
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 CONNMARK all -- * * 0.0.0.0/0 0.0.0.0/0 CONNMARK restore
Мое мышление было следующим. Пожалуйста, поправьте меня, если я что-то не так понял:
- Когда пакет приходит на vlan2 (WAN iface), PREROUTING:2 устанавливает метку соединения 0x1
- Пакет не имеет маркировки пакета на данный момент (это правильно?)
- Пакет имеет маршрутизатор в качестве пункта назначения, поэтому он будет получен. Если бы это было DNATed, предыдущий пункт был бы решающим, потому что таблица 128 пропускает вещи LAN.
- Ответный пакет генерируется локально.
- ВЫХОД:1 установит метку пакета 0x1, используя метку соединения на ответном пакете
- PREROUTING:1 будет делать то же самое для соединений DNAT в локальной сети (br0)
- Ответный пакет с меткой 0x1 будет маршрутизирован с использованием таблицы 128.
К сожалению, это не работает, и я хотел бы понять, почему. С удаленного сервера, если я пингую WAN_IP, я не вижу никаких ответов. Я также включил удаленный доступ ssh на маршрутизаторе и не могу открыть порт с удаленного компьютера с помощью telnet WAN_IP SSH_PORT
, так что это проблема не только icmp. Как отладить эти проблемы?
Обновление: я проверил rp_filter
и он был установлен в 1. Я попытался установить его на 0, и теперь все работает как положено (2 тоже не сработало). Так как это интернет-роутер, я думаю, что ни один RPF не может быть хорошей идеей. Из того, что я понимаю, когда строгий RPF запускается на начальном пакете, ядро наблюдает, как маршрут к REMOTE_IP проходит через TUN_IF, в то время как пакет прибыл на WAN_IF, поэтому он отбрасывается. Это правильно? Я попытался MARK set 0x1 && CONNMARK save
как mangle PREROUTING, надеясь, что ядро увидит метку во время RPF, но это не так.