Назад | Перейти на главную страницу

iptables - получите сетевой доступ с nat и одним публичным IPv4

У меня есть один общедоступный IPV4-адрес, хост и одна виртуальная машина (IP 192.168.100.10). С iptables на стороне хоста мне удалось перенаправить только порт 22 (ssh) на хост с помощью таблицы nat.

Таблица Nat:

iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination 192.168.100.10

Таблица фильтров:

iptables -A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT

Теперь я хотел бы по-прежнему иметь доступ в Интернет с хоста и виртуальной машины.

Я пробовал добавить на вкладке Фильтр:

iptables -I OUTPUT -o eth0 -d 0.0.0.0/0 -j ACCEPT

Но получить доступ к сети с хоста по-прежнему невозможно. Кстати PING с хоста на внешний IP работает отлично.

Таблица NAT:

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
DNAT       all  --  anywhere             anywhere             to:192.168.100.10

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

Таблица ФИЛЬТРА:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination                     
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     icmp --  anywhere             anywhere            
DROP       all  --  anywhere             anywhere            

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     icmp --  anywhere             anywhere             ctstate NEW,RELATED,ESTABLISHED

Любая помощь приветствуется!

Ваш веб-доступ с хоста не работает, потому что фильтр INPUT вашего брандмауэра отбрасывает (почти) все входящие пакеты, включая те, которые являются ответами на пакеты, отправленные с хоста. Только пакеты icmp и tcp 22 соответствуют правилам ACCEPT и принимаются, поэтому работают только ping и ssh, но ничего больше.

Скажем, вы получаете доступ к DNS, ваш хост отправляет пакет извне с некоторого порта на udp 53, DNS-сервер отвечает с портами и адресами в обратном порядке. На ваш хост приходит ответный пакет: udp-пакет от DNS-сервера с портом источника 53, но первое правило в фильтре INPUT, которое ему соответствует, - это правило DROP.

В Linux есть трекер соединений, который проверяет все пакеты, входящие в хост (кроме тех, которые установлены как NOTRACK в необработанной таблице), и устанавливает некоторые флаги, если он определяет, что пакет принадлежит или относится к какому-либо известному соединению (созданному пакетом, который вы ПРИНЯЛИ ранее. с каким-либо другим правилом политики по умолчанию, например цепочкой ВЫХОДОВ фильтра). Вы можете проверить некоторые из этих флагов в цепочке фильтров INPUT. Сделайте это перед действием DROP:

iptables -t filter -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Это правило использует флаги conntrack, чтобы разрешить ответы на пакеты, отправленные в локальной системе.

Чтобы получить доступ к внешнему миру с виртуальной машины, вам нужно добавить еще одно правило перевода:

iptables -t nat -A POSTROUTING -s 192.168.100.10 -o eth0 -j MASQUERADE

это своего рода правило SNAT, но в нем говорится «транслировать на любой адрес выходного интерфейса», а не указывать этот адрес в правиле.

Остерегайтесь пакетов, идущих из внешнего мира на виртуальную машину и наоборот, все проходят через цепочку фильтров FORWARD, но не через фильтр INPUT или filter OUTPUT. Если вы когда-нибудь собираетесь отбросить что-то в цепочке FORWARD, чтобы ограничить доступ к какой виртуальной машине и кто может получить к ней доступ, вы можете также добавить аналогичное правило conntrack в начало цепочки фильтров FORWARD, чтобы ответы установленных подключений могли достигать их назначения, как и для самого хоста в цепочке INPUT фильтра.

Ваши правила ACCEPT в цепочке OUTPUT в этом случае ничего не делают. В фильтре ВЫХОДА ничего не ОТКЛЮЧАЙТЕ и НЕ ОТКЛЮЧАЙТЕ, ваша политика по умолчанию для ВЫХОДА - ПРИНЯТЬ. Вы можете очистить (очистить) цепочку OUTPUT фильтра, и она все равно будет работать.