Я пытаюсь перенаправить запросы на свой локальный IP-адрес (10.42.42.152) через порт 80 на удаленный сервер, например google.com (173.194.113.104:80). Удаленный сервер работает, ip_forward включен, но я получаю только сообщение «В соединении отказано».
root@raspi:~# telnet 10.42.42.152 80
Trying 10.42.42.152...
telnet: Unable to connect to remote host: Connection refused
Показать, что переадресация IP включена:
root@raspi:~# cat /proc/sys/net/ipv4/ip_forward
1
Ниже приведены мои правила iptables по умолчанию:
# /etc/iptables.up.rules
# Generated by iptables-save v1.4.14 on Fri Sep 26 10:22:12 2014
*filter
:INPUT ACCEPT [8542:1505054]
:FORWARD ACCEPT [476:105829]
:OUTPUT ACCEPT [6274:968245]
COMMIT
# Completed on Fri Sep 26 10:22:12 2014
# Generated by iptables-save v1.4.14 on Fri Sep 26 10:22:12 2014
*nat
:PREROUTING ACCEPT [533:70053]
:INPUT ACCEPT [491:65475]
:OUTPUT ACCEPT [685:60069]
:POSTROUTING ACCEPT [683:59949]
-A INPUT -i eth0 -p udp -m udp --dport 1194 -j ACCEPT
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to-source 10.42.42.4
COMMIT
# Completed on Fri Sep 26 10:22:12 2014
Загрузите эти правила (только для работы моего VPN), затем добавьте два других правила:
root@raspi:~# iptables-restore < /etc/iptables.up.rules
root@raspi:~# /sbin/iptables -t nat -A PREROUTING -p tcp --dport 80 -d 10.42.42.152 -j DNAT --to-destination 173.194.113.104:80
root@raspi:~# /sbin/iptables -t nat -A POSTROUTING -p tcp --dport 80 -j MASQUERADE
Покажите, что IP-адрес 10.42.42.152 принадлежит локальному устройству:
root@raspi:~# ip address show eth0 | grep 152
inet 10.42.42.152/24 brd 10.42.42.255 scope global secondary eth0:152
root@raspi:~# ping 10.42.42.152 -c 1
PING 10.42.42.152 (10.42.42.152) 56(84) bytes of data.
64 bytes from 10.42.42.152: icmp_req=1 ttl=64 time=0.347 ms
--- 10.42.42.152 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.347/0.347/0.347/0.000 ms
Конфигурация работает как есть, но не для локальных запросов. Поэтому, если какой-либо другой хост в сети (например, из 10.42.42.15) пытается подключиться, все должно работать должным образом.
Для соединений с localhost я нашел https://unix.stackexchange.com/a/113651
Просто добавь:
/sbin/iptables -t nat -A OUTPUT -p tcp --dport 80 -d 10.42.42.152 -j DNAT --to-destination 173.194.113.104:80