
У меня есть экземпляр CentOS как NAT для моей локальной сети. В моей локальной сети есть несколько подсетей. Внутри одной из них есть сервер PPTP VPN. Мне нужно опубликовать этот сервер в Интернете.
Итак. Моя проблема в том, что трафик не переходит из nat/PREROUTING
цепочки в filter/FORWARD
цепочку.
1.1.1.1
мой внешний IP192.168.10.1
мой внутренний IP10.0.1.1
это IP VPN-сервераeth0
внешний интерфейсeth1
внутренний интерфейс
Правила NAT(работает PKTS
и BYTES
меняется)
-A PREROUTING -d 1.1.1.1/32 -i eth0 -p tcp -m tcp --dport 1723 -j DNAT --to-destination 10.0.1.1
-A PREROUTING -d 1.1.1.1/32 -i eth0 -p gre -j DNAT --to-destination 10.0.1.1
Правила ФИЛЬТРА(не работает PKTS
и BYTES
не меняется)
-A FORWARD -d 10.0.1.1/32 -i eth0 -o eth1 -p tcp -m tcp --dport 1723 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 10.0.1.1/32 -i eth1 -o eth0 -p tcp -m tcp --sport 1723 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -d 10.0.1.1/32 -i eth0 -o eth1 -p gre -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 10.0.1.1/32 -i eth1 -o eth0 -p gre -m state --state RELATED,ESTABLISHED -j ACCEPT
Конечно, net.ipv4.ip_forward = 1
и я могу пинговать 10.0.1.1
с NAT-сервера.
На порту tcpdump
1723 показаны действия только на внешнем интерфейсе.
Понятия не имею.
UPD1
. Я проверил маршрутизацию с помощью ip route get 10.0.1.1 from <src> iif eth0
и получил RTNETLINK answers: Invalid argument
. Кстати, я получил какой-то ответ, затем использовал любое iif
имя ( eth0
, eth1
, eth2
). Я получил действительный маршрут только тогда не использовал iif
аргумент.
UPD2
. Я добавил -A FORWARD -d 10.0.1.1/32 -j ACCEPT
правило в filter/FORWARD
цепочку первым. Но ничего. Пакеты и байты были нулевыми.
решение1
Другие правила очень важны. И порядок правил тоже. Поэтому проверьте вывод команды
iptables-save -c
. Исследуйте правила выше тех, которые вы создали.Между цепочками
nat/PREROUTING
иfilter/FORWARD
принимается решение о маршрутизации. Проверьте маршрутизацию с помощьюip route get 10.0.1.1 from <src> iif eth0
. Он должен вернуть действительный маршрут. Если это что-то другое, вставьте это в вопрос.Также изучите вывод команды
nstat -az
.Для пропуска pptp через NAT необходимо загрузить модули для conntrack:
nf_conntrack_proto_gre
nf_nat_proto_gre
nf_conntrack_pptp
nf_nat_pptp
В последних ядрах вы должны явно включить conntrack helpers, особенно для pptp. Поэтому вам нужно добавить дополнительное правило.
iptables -t raw -A PREROUTING -p tcp -m tcp --dport 1723 -j CT --helper pptp
- Другой способ включить помощника — команда sysctl:
sysctl -w net.netfilter.nf_conntrack_helper=1
- Другие инструменты для устранения вашей проблемы:
conntrack -E
- мониторинг событий conntracktcpdump
-j NFLOG
иtcpdump -ni nflog
- разрешить перехват пакетов из правила iptables.-j TRACE
цель - вы можете исследовать путь пакетов через правила брандмауэра.
ПСОбновите вопрос, если вы все еще не можете ответить.