Я хочу перенаправить трафик, предназначенный для порта 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 будет обрабатывать только пакеты, приходящие от других хостов.