Я использую Ubuntu Server Box (10.04) для маршрутизации моей сети в Интернет. В этом ящике есть 2 карты Ethernet (eth0 для подключения к Интернету, eth1 для lan - 192.168.1.1), и я хотел бы перенаправить порт 80 на свой сервер (192.168.1.254). Итак, я настраиваю следующее:
iptables -F
iptables -t nat -F
iptables -X
iptables -t nat -X
iptables -t mangle -F
# default route:
ip route add default via 200.160.111.67
# www tunnel:
iptables -I FORWARD -p tcp -d 192.168.1.254 --dport 80 -i eth0 -j ACCEPT
# this line locks up internet access for all users:
#iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.254:80
# ssh tunnel
iptables -I FORWARD -p tcp -d 192.168.1.254 --dport 22 -i eth0 -j ACCEPT
# this line uncommented locks all my accesses to external ssh servers:
#iptables -t nat -A PREROUTING -p tcp --dport 22 -j DNAT --to-destination 192.168.1.254:22
# NAT
modprobe iptable_nat
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
NAT для подключений внутри моей сети работает, но переадресация портов (ssh и www) не работает, и я не знаю, что делаю не так. Не могли бы вы помочь мне?
Ваши правила DNAT должны быть немного более конкретными, чтобы они работали правильно. Один из способов продолжить - добавить --destination
(или -d
) к каждому из них, например
iptables -t nat -A PREROUTING -d $EXT_IP -p tcp --dport 80 -j DNAT \
--to-destination 192.168.1.254
iptables -t nat -A PREROUTING -d $EXT_IP -p tcp --dport 22 -j DNAT \
--to-destination 192.168.1.254
где $EXT_IP
- это внешний (глобально маршрутизируемый) IP-адрес вашего маршрутизатора.
Предостережение: если внутренние клиенты попытаются подключиться к службам www или ssh на 192.168.1.254 через внешний (глобально маршрутизируемый) IP-адрес, то их попытки подключения не удастся (в то время как подключение напрямую к 192.168.1.254 будет успешным).
Чтобы решить эту проблему, лучше всего сказать вашим внутренним клиентам, чтобы они получали доступ к серверу через его внутренний IP-адрес. Кроме того, вы можете настроить «шпильку NAT», добавив еще пару правил iptables, как показано ниже:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 192.168.1.254 -p tcp \
--dport 80 -j SNAT --to-source $INT_IP
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 192.168.1.254 -p tcp \
--dport 22 -j SNAT --to-source $INT_IP
где $INT_IP
- это внутренний IP-адрес маршрутизатора (например, 192.168.1.1). Согласно этим правилам, соединения от внутренних клиентов к внешнему IP-адресу будут проходить через маршрутизатор. По возможности лучше избегать использования жесткого NAT, поскольку это довольно неэффективное использование сетевых ресурсов и системных ресурсов маршрутизатора.