Толик Панков
hex_laden
............ .................. ................

October 2025
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Толик Панков [userpic]
Настройка IPTables на сервере. Часть вторая, с поправками.

Итак, раньше копия мы уже делали первоначальную настройку IPTables, но оказалось, что делали не очень верно.

Товарищ [info]wasserstrahl внес поправку:

Открытие порта на исходящие соединения.

Ну чтоб с чем-то связаться по определенному порту.

iptables -A INPUT -p tcp --sport <# порта> -j ACCEPT
iptables -A OUTPUT -p tcp --dport <# порта> -j ACCEPT"

Нет.

iptables -A OUTPUT -p tcp --dport <# порта> -j ACCEPT" -- это верно вроде,

а "iptables -A INPUT -p tcp --sport <# порта> -j ACCEPT" -- нет. Потому что это правило позволяет любой входящий пакет с указанного порта с любого адреса. Если ты хочешь открыть ответы на исходящий трафик, то нужно писать что-то в стиле iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

Поправка верная, потому изменяем настройку IPTables в скрипте инициализации сервера.

Удаляем все правила файерволла:

# Delete all rules
echo "Delete firewall rules..."
iptables -F
iptables -F -t nat
iptables -F -t mangle
iptables -X
iptables -t nat -X
iptables -t mangle -X


Устанавливаем основную политику по умолчанию. Запретить все соединения (параноидальный режим):

# Drop all traffic
echo "Set main policy..."
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP


Разрешаем принимать все установленные входящие соединения. Это надо для того, что если мы откроем порт на исходящие соединения, для того, чтоб сервер мог с чем-то связываться (например с WWW или rsync), то ответ был бы принят.

#prinimat' vse ustanovlennye vhodashie soedineniya
echo "Accepts all established inbound connections..."
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT


Открываем порт для клиентов, которые подключаются к серверу по протоколу PPTP (входящий трафик):

#open VPN ports and GRE
echo "Open VPN ports and GRE..."
#to computer
iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 1723 -j ACCEPT


И разрешаем для них же протокол GRE:

iptables -A INPUT -p gre -j ACCEPT
iptables -A OUTPUT -p gre -j ACCEPT


Поскольку сам сервер не будет соединяться с VPN-провайдером по протоколу PPTP (есть OpenVPN), то следующие строки я убрал:

iptables -A INPUT -p tcp --sport 1723 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 1723 -j ACCEPT


Разрешаем весь трафик на loopback (lo) интерфейсе. Если у нас будут сервисы, такие как Web-сервер и сервер баз данных MySQL на одном сервере, то связываться они будут как раз через lo-интерфейс.

#accept all traffic an lo interface
echo "Accept all lo interface traffic..."
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT


Открываем на вход 22 порт (ssh) для клиентов, которые подключатся к серверу через PPTP VPN:

# ssh (22 port)
echo "Open 22 port (ssh) for VPN clients..."
iptables -A INPUT -s 172.16.1.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -s 172.16.1.0/24 -p tcp --sport 22 -j ACCEPT


Так же разрешаем им доступ к удаленному рабочему столу (XDMCP):

# XDMCP
echo "Open 177 port UDP (XDMCP) for VPN clients..."
iptables -A INPUT -s 172.16.1.0/24 -p udp --dport 177 -j ACCEPT
iptables -A OUTPUT -s 172.16.1.0/24 -p udp --sport 177 -j ACCEPT

echo "Open 6000:6005 ports (Windows XDMCP) in both directions for VPN clients..."
iptables -A INPUT -s 172.16.1.0/24 -p tcp -m multiport --dports 6000:6005 -j ACCEPT
iptables -A OUTPUT -s 172.16.1.0/24 -p tcp -m multiport --sports 6000:6005 -j ACCEPT

iptables -A INPUT -s 172.16.1.0/24 -p tcp -m multiport --sports 6000:6005 -j ACCEPT
iptables -A OUTPUT -s 172.16.1.0/24 -p tcp -m multiport --dports 6000:6005 -j ACCEPT


Разрешаем VPN-клиентам доступ к DNS:

echo "Open DNS for VPN clients..."
iptables -A INPUT -s 172.16.1.0/24 -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -s 172.16.1.0/24 -p udp --sport 53 -j ACCEPT

iptables -A INPUT -s 172.16.1.0/24 -p tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -s 172.16.1.0/24 -p tcp --sport 53 -j ACCEPT


Разрешаем протокол ICMP (ping):

# Allow ICMP
echo "Allow ICMP and ports for TRACEROUTE..."
iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT


И исходящие порты для TRACEROUTE (ответы, входящий трафик уже разрешен командой iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT):

#open ports from traceroute
iptables -A OUTPUT -p udp -m multiport --dports 33434:33534 -j ACCEPT


Открываем стандартные порты (HTTP, HTTPS, email, rsync) для доступа к соответствующим сервисам с сервера (входящие):

#Open standart ports (from computer)
echo "Open standart ports (DNS,WWW, email) from server"
# 53-DNS,80 8080/tcp - WWW, 443/tcp - https, 110,443,25,587 - e-mail 873/tcp - rsync (for sbopkg)
iptables -A OUTPUT -p udp -m multiport --dports 53,443 -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --dports 53,80,8080,443,110,443,25,587,873 -j ACCEPT


Запускаем PPTP VPN сервер (к его настройке вернусь несколько позже):

#start VPN server
echo "Starting PPTD VPN server..."
pptpd &


Производим окончательную настройку файервола для PPTP VPN клиентов:
1. Организуем NAT (маскарадинг):

echo "Final firewall settings for VPN clients..."
#NAT for VPN clients
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE


И немного подправляем пакеты (без этого виснут некоторые соединения). Буду благодарен, если мне кто-нибудь объяснит почему, но кстати, в Ростелекомовском файерволе такая настройка не установлена, потому это плохой провайдер, и их VPN висючий. В свое время задолбался с этим глюком.

#popravlaem pakety (bez etogo visnut nekotorye soedinenia)
iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu


Скрипт целиком на PasteBin

Источники к сожалению пролюбил.

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/10/26/nastrojka-iptables-na-servere-chast-vtoraya-s-popravkami/

Comments

Вероятно, у тебя где-то по дороге бывают сегменты с пониженным MTU, если я правильно понял.
Когда сидел на РТ, то проблемы были, что смешно, где-то по дороге к ЛЖР, потом когда можно было ходить напрямую через LAN провайдера проблемы исчезли, а когда перешел по известным причинам на VPN, они опять вылезли. И да, бяка как раз в MTU.

Альзо, ты бы протестил всю эту порнографию на адекватность поведения.
Вот как это сделать?

Поставил бы ты лимиты хотя бы на входящие (против гипотетического ICMP flood).
Когда сервер будет не в ЛВС, а в интернетах - надо будет сделать, да.

Кроме того, ты не только пинги разрешил, но и все остальное.

Насколько я понимаю, по другому никак не сделать.

А fail2ban у тебя установлен?
Пока нет, сервер исключительно локальный. А клиентов 3-20 максимум. Так что пока незачем.