Дали задачи закрывать VPN-ом сервер, чтобы без VPN нельзя было открывать сайты на нем и подключаться к портам.
Стандартный кейс выглядит так: у нас есть сервер с VPN-сервисом и есть сервер, который надо закрыть. Тут все просто, открываем доступ к портам только серверу, где есть VPN. Т.е. VPN-сервер является шлюзом к закрытому серверу.
Мой же случай отличался тем, что надо разместить VPN на этом же сервер, который мы хотим закрывать от внешнего мира. Ну в общем тоже не сказать чтобы сложно. Но у меня был нюанс с тем, что на сервере крутится куча docker-compose стэков, которые случают внешние порты, а эти порты невозможно закрыть через INPUT-цепочку iptables. Пришлось много подебажить, чтобы заставить все работать как надо. Были затронуты только 2 цепочки — INPUT, DOCKER-USER. Итоговые настройки iptables у меня получились такие:
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21821 -j ACCEPT
-A INPUT -p udp -m udp --dport 21820 -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p udp -m udp --sport 123 -j ACCEPT
-A INPUT ! -i eth0 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -j DROP
Цепочка DOCKER-USER:
-A DOCKER-USER -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A DOCKER-USER -i eth0 -p udp -m udp --dport 21820 -j ACCEPT
-A DOCKER-USER -i eth0 -p tcp -m tcp --dport 21821 -j ACCEPT
-A DOCKER-USER -i eth0 -p tcp -j DROP
-A DOCKER-USER -i eth0 -p udp -j DROP
eth0 — это внешний интерфейс, торчащий в интернет. Порты 21820, 21821 взяты из настроек подключения к wireguard.
В качестве VPN-сервиса я выбрал wireguard с простой настройкой через web: https://github.com/WeeJeWel/wg-easy
После всех манипуляций, во внешку торчат только 22 и 21820/udp 21821/tcp. Остальные порты, включая веб, доступны только после того как подключишься по VPN.
No comments
RSS / trackback