У меня есть установка, в которой у меня есть сервер CentOS, который действует как интернет-шлюз. Эта машина выполняет NAT между нашим главным коммутатором и нашим интернет-соединением. Я также размещаю на этом сервере виртуальную машину, к которой можно получить доступ с помощью удаленного рабочего стола через порт 3389.
Что я хочу сделать, так это настроить iptables так, чтобы порт 10101 перенаправлялся со стороны WAN на 3389 на стороне LAN. Я хочу, чтобы люди извне могли ТОЛЬКО видеть порт 10101 и перенаправлять его на порт 3389 на локальном IP-адресе компьютера.
В моей настройке у меня есть локальный адаптер с именем lan0 (192.168.1.15) и другой адаптер с именем wan0, который получает назначенный ему наш общедоступный IP-адрес. Итак, я хочу, чтобы это выглядело так:
wan0 xxx.xxx.xxx.xxx:10101 -> lan0 192.168.1.15:3389
Я пробовал несколько вещей и просто не могу понять. Похоже, что разница между тем, что я делаю, и большинством примеров в Интернете заключается в том, что в большинстве примеров используется шлюз, который перенаправляет трафик на другой компьютер, тогда как мой все еще находится в той же системе.
Обновить:
Чтобы было понятнее, вот весь мой файл конфигурации iptables, включая cjc's предложение. Я добавил комментарии к строкам, как я понимаю. Я ОЧЕНЬ мало разбираюсь в iptables, поэтому, пожалуйста, поправьте меня, если я ошибаюсь в НИЧЕГО.
# Generated by iptables-save v1.3.5 on Fri Jul 8 12:41:58 2011
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [5:316]
# route all requests for web traffic through squid on port 3128
-A PREROUTING -i lan0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.15:3128
# forward outside requests from 10101 to 3389 per cjc
-A PREROUTING -i wan0 -p tcp --dport 10101 -j DNAT --to 192.168.1.15:3389
# needed for transparent squid proxy
-A POSTROUTING -j MASQUERADE
COMMIT
# Completed on Fri Jul 8 12:41:58 2011
# Generated by iptables-save v1.3.5 on Fri Jul 8 12:41:58 2011
*filter
:INPUT ACCEPT [89:5788]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1046:126223]
:RH-Firewall-1-INPUT - [0:0]
# accept all traffic from loopback
-A INPUT -i lo -j ACCEPT
# accept traffic destined to this machine regarding as part of existing connections
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# accept traffic destined to this machine from our local network
-A INPUT -s 192.168.1.0/24 -j ACCEPT
# accept traffic destined to this machine from the wan on port 10101 per cjc
-A INPUT -i wan0 -p tcp --dport 10101 -j ACCEPT
# reject all other wan traffic
-A INPUT -i wan0 -j REJECT --reject-with icmp-port-unreachable
# drop ping requests from the outside (is this needed and in the right order?)
-A INPUT -i wan0 -p icmp -m icmp --icmp-type 8 -j DROP
# allow forwarding of packets from the lan to the wan for squid proxying
-A FORWARD -s 192.168.1.0/24 -i lan0 -o wan0 -m state --state NEW -j ACCEPT
# allow forwarding of any packets pertaining to an existing connection
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Fri Jul 8 12:41:58 2011
Что-то вроде этого не работает?
iptables -A INPUT -i wan0 -p tcp --dport 10101 -j ACCEPT
iptables -t nat -A PREROUTING -i wan0 -p tcp --dport 10101 -j DNAT --to 192.168.1.15:3389
Если виртуальная машина находится в сети, отличной от других ваших ящиков, вам также может потребоваться директива пересылки, например (при условии, что это еще не разрешено другими вашими правилами):
iptables -A FORWARD -i wan0 -d 192.168.1.15 -j ACCEPT
Это не будет работать с использованием только iptables. Поскольку запрос предназначен для моего шлюзового сервера и в этом случае он не просто действует как прокси, я не могу использовать SNAT для изменения исходного адреса пакетов. Если я заблокирую запросы к порту 3389 от wan0, даже пакеты, отправляемые DNAT с портов 10101 на 3389, будут заблокированы, потому что wan0 по-прежнему является их источником.
cjc указывает на то, что для этого можно комбинировать другое программное обеспечение с iptables, но такой уровень сложности не требуется для моей проблемы.
Вы четко излагаете проблему в этом комментарии к сценарию:
"# accept traffic destined to **this machine** from the wan on port 10101"
Нет, вы не принимаете трафик, предназначенный для этого компьютера, вы принимаете трафик, предназначенный для другого компьютера. Если вы хотите ПЕРЕДАТЬ трафик на 192.168.1.15, откройте фильтр в цепочке FORWARD, а не INPUT.
iptables -A FORWARD -i wan0 -p tcp --dport 10101 -j ACCEPT
DNAT в PREROUTING правильный.
«Общие» СВЯЗАННЫЕ, УСТАНОВЛЕННЫЕ правила в цепочках фильтров тоже хороши, но вы можете захотеть поместить их в начало цепочки. Вы сэкономите процессор, если правила, которые совпадают чаще (например, большая часть пакетов, принадлежащих уже разрешенным соединениям), будут выходить из таблиц как можно быстрее.