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

переадресация портов iptables

Я хочу перенаправить трафик, предназначенный для порта 100, на 127.0.0.1:101. Фактическая цель состоит в том, чтобы перенаправить на другой IP: PORT, но для того, чтобы просто заставить все работать, у меня есть сокет, который прослушивает *: 100. На этом сайте и в Google "iptables port forwarding howto" я был убежден, что синтаксис выглядит следующим образом, который является частью моего набора правил.

  #Set default policies to DROP

   iptables -P INPUT DROP

   iptables -P FORWARD DROP

   iptables -P OUTPUT DROP


   #Flush ruleset

   iptables -F

   iptables -t nat -F

   iptables -t filter -F


   #Allow local access

   iptables -A INPUT -i lo -j ACCEPT

   iptables -A OUTPUT -o lo -j ACCEPT


   #Allow ESTABLISHED,RELATED

   iptables -A INPUT -i eth0 -m sate --state ESTABLISHED,RELATED -j ACCEPT

   iptables -A OUTPUT 1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT


   #Allow outbound SYN requests

   iptables -A OUTPUT -o eth0 -m state --state NEW -j accept


   #### The routing related

   # Allow SYN requests for the port-to-be-forwarded

   iptables -A INPUT -i $INET_IFACE -p tcp --dport 100 -m state --state NEW -j ACCEPT


   # Route to 127.0.0.1:101

   iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 100 -j DNAT --to-destination 127.0.0.1:101


   # Accept the forward

   iptables -A FORWARD -t filter -i eth0 -p tcp --dport 101 -j ACCEPT


   # Accept all related in forward 

   iptables -A FORWARD -t filter -i eth0 -p tcp -m state --state ESTABLISHED,RELATED -j 
ACCEPT

Мои настройки sysctl:

 # sysctl -p

net.ipv4.ip_forward = 1

net.ipv4.conf.default.rp_filter = 1

net.ipv4.conf.all.rp_filter = 1

net.ipv4.tcp_syncookies = 1

net.ipv4.conf.all.accept_source_route = 0

net.ipv4.conf.default.accept_source_route = 0

net.ipv4.conf.all.accept_redirects = 0

net.ipv4.conf.default.accept_redirects = 0

net.ipv4.conf.all.secure_redirects = 0

net.ipv4.conf.default.secure_redirects = 0

net.ipv4.icmp_echo_ignore_broadcasts = 1

net.ipv4.conf.all.send_redirects = 0

net.ipv4.conf.default.send_redirects = 0

net.ipv4.conf.all.log_martians = 1

kernel.randomize_va_space = 1


 # cat /proc/sys/net/ipv4/conf/eth0/forwarding

1

nmap утверждает, что порт закрыт для сканирования connect () и SYN, но открыт | фильтруется для сканирования FIN и Xmas.

Что мне не хватает?

Решение было частично основано на вольфгансе. Поскольку я изначально не был зарегистрирован как пользователь на serverfault и с тех пор очистил свои файлы cookie, не похоже, что я могу просто опубликовать комментарий.

Политики по умолчанию: DROP для цепочек INPUT и OUTPUT и ACCEPT для FORWARD.

function add_forward {
# $1 = title
# $2 = internal host
# $3 = external port
# $4 = internal port
if [  "$2" == "" ] || [ "$3" == "" ] || [ "$4" == "" ]; then
  echo Skipping forward $1
else
  echo "Forwarding port "$3" to "$2" port "$4" ("$1")"
  $IPT -t nat -A PREROUTING -p tcp --dst $MYIP --dport $3 -j DNAT --to-destination $2:$4
  $IPT -t nat -A POSTROUTING -p tcp --dst $2 --dport $4 -j SNAT --to-source $VMNETIP
  $IPT -t nat -A OUTPUT --dst $MYIP -p tcp --dport $3 -j DNAT --to-destination $2:$4
fi
}

И, наконец, чтобы использовать его add_forward «Мой форвард», «192.168.0.101» 100 101

$ MYIP определяется как общедоступный IP-адрес eth0. $ VMNETIP - это интерфейс NAT vmware.

Таким образом, это позволяет подключать входящие соединения на eth0: 100 через интерфейс vmnet nat к виртуальной машине.

Надеюсь, это может помочь и кому-то другому.

Основным инструментом для отладки был tcpdump как в хост-системе, так и в гостевой системе.

"tcpdump -i eth0 port 100" для прослушивания на хосте. Это выявило проблему с установкой неправильного IP-адреса в правиле POSTROUTING, из-за которого eth0 просто отбрасывал пакеты.

Спасибо за помощь.

Переадресация портов действительно имеет смысл только от одного интерфейса Ethernet к другому. Поэтому я должен предположить, что $ INET_FACE - это не то же самое, что eth0. В целях дальнейшего я предполагаю, что это будет eth1.

В таком случае вам понадобятся следующие правила:

iptables -A INPUT -i eth1 -p tcp --dport 100 -m state --state NEW -j ACCEPT
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 100 -j DNAT --to-destination 127.0.0.1:101
iptables -A FORWARD -t filter -i eth1 -p tcp --dport 101 -j ACCEPT
iptables -A OUTPUT -t filter -o eth0 -p tcp --dport 101 -j ACCEPT

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

Если приведенное выше не дает достаточно подробностей для продвижения вперед, просто оставьте комментарий, и я могу предоставить дополнительные указатели. Есть несколько хороших диаграмм прохождения трафика через iptables, особенно мне нравятся вот этот и вот этот. Они показывают, какие таблицы и цепочки используются, и должны позволить вам сформулировать свои правила. Всегда помните, вам нужны правила для обоих направлений транспортного потока.

Вы пытаетесь перенаправить трафик, исходящий с вашего собственного компьютера?

Если это так, вам также следует добавить правило DNAT в цепочку OUTPUT таблицы nat. Цепочка PREROUTING будет обрабатывать только пакеты, приходящие от других хостов.