Я пытаюсь настроить правило iptables, которое будет блокировать доступ к удаленным перенаправленным соединениям ssh через локальные удаленные перенаправленные соединения ssh. Итак, IOW:
Client A connects to server: ssh -R 10000:localhost:23 someserver Client B connects to server: ssh -L 23:localhost:10000 someserver
Я не могу заставить iptables заблокировать это. Мне нужна пересылка в некоторых случаях, которые не могут быть покрыты настройками sshd_config (у меня будет программа, специально выделяющая порт, который клиент может пересылать, и, надеюсь, программа затем добавит правило iptables, чтобы разрешить это).
Я пробовал:
iptables --flush iptables -A INPUT -i lo -p tcp --dport 0:1024 -j ACCEPT iptables -A OUTPUT -o lo -p tcp --dport 0:1024 -j ACCEPT iptables --policy INPUT DROP iptables --policy OUTPUT DROP iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
Но он по-прежнему позволяет локальным перенаправленным соединениям ssh получать доступ к удаленному перенаправленному порту. Любые идеи о том, как заставить iptables справиться с этим?
РЕДАКТИРОВАТЬ: Пытался перейти на:
iptables --flush iptables --policy INPUT DROP iptables --policy OUTPUT DROP iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -i eth1 -p tcp --dport 22 -j ACCEPT iptables -A OUTPUT -o eth1 -p tcp --sport 22 -j ACCEPT iptables -A INPUT -j REJECT
Тем не менее я могу устанавливать перенаправленные соединения. Очевидно, это было не совсем так. Спасибо за ответ. У вас есть еще какие-нибудь идеи для меня?
Не было бы проще отключить перенаправление ssh на ssh-сервере? Просто измени AllowTcpForwarding
от да до нет в вашем / etc / ssh / sshd_config. Если это не подходит, вы можете попробовать что-нибудь вроде
iptables -A OUTPUT -o eth1 -p tcp --cmd-owner "sshd" -j DROP
Догадаться. Мой исходный набор правил отлично все блокировал. Проблема заключалась в том, что на этом сервере localhost сначала разрешает (через / etc / hosts) в :: 1 (петля IPv6). Из-за этого эти правила не работали. После того, как я удалил эту запись из моего файла / etc / hosts, я смог заставить все работать нормально. Мой тестовый сценарий выглядит так:
#!/bin/bash iptables --flush iptables -A INPUT -i lo -p tcp --dport 0:1024 -j ACCEPT iptables -A OUTPUT -o lo -p tcp --dport 0:1024 -j ACCEPT iptables --policy INPUT DROP iptables --policy OUTPUT DROP iptables --policy FORWARD DROP iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -i eth1 -p tcp --dport 22 -j ACCEPT iptables -A INPUT -j REJECT #iptables -I INPUT 1 -i lo -p tcp --dport 10001 -m state --state NEW,ESTABLISHED -j ACCEPT #iptables -I OUTPUT 1 -o lo -p tcp --dport 10001 -m state --state NEW,ESTABLISHED -j ACCEPT
Включив последние две строки, я могу открыть локальное перенаправленное соединение ssh на порт 10001. Если они отключены, я не могу. Отлично!
Перенаправленные соединения будут исходить из локальной системы. Вам нужно будет удалить приведенное ниже правило, разрешающее исходящие подключения, а затем, при необходимости, заменить его несколькими правилами, разрешающими только исходящие подключения, которые вы явно разрешаете.
iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Учтите, что вместо localhost можно использовать:
а также вы ничего не писали о попытке клиента B подключиться напрямую к clientA:
ssh -L 23: clientA: 80 someserver (Я выбрал порт 80 b / c, возможно, ваш брандмауэр разрешает исходящий трафик)
Мне очень жаль, но при наличии всех этих (и других) опций, а также ваших базовых знаний об iptables очень вероятно, что вы оставите зияющие дыры в своей настройке. Если на кону есть что-то действительно ценное, я бы посоветовал попросить кого-нибудь, кто лучше знает, сделать все это.