Хорошо, я все еще работаю над созданием http-сервера dmz'd
Итак, теперь у меня есть Ethernet-туннель с использованием ssh -w 0: 0, и у меня есть интерфейсы на каждом конце, которые могут общаться друг с другом:
Итак, теперь я пытаюсь сделать этот http-сервер видимым для внешней сети. Вот полная настройка
Итак, я создаю новый экземпляр ec2 и запускаю настройку:
source ./HOST scp -i green.pem server/* root@$HOST: ssh -i green.pem root@$HOST ./setup
он, в свою очередь, запускает настройку на удаленном компьютере:
apt-get update apt-get install telnet echo 1 | tee /proc/sys/net/ipv4/ip_forward echo "PermitTunnel yes" >> /etc/ssh/sshd_config /etc/init.d/ssh restart
затем я инициирую ssh-соединение:
sudo ./runserver $ HOST:
HOST=$1 ssh -i green.pem root@$HOST -w 0:0 -o Tunnel=ethernet -o ServerAliveInterval=60
затем внутри этого термина ssh я начинаю маршрутизировать пересылку iptables:
##### # server routing # bring up the tap ifconfig tap0 up # route all traffic for 192.168.2.* through it ip route add 192.168.2.0/24 dev tap0 ##### # server iptables REMOTE_INTERNAL_IP=$1 iptables -F iptables -t nat -F ### end init firewall .. Start DMZ stuff #### # forward traffic between DMZ and LAN iptables -A FORWARD -i eth0 -o tap0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -i tap0 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT # Route incoming port to DMZ server 192.168.2.1 iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 8000 -j DNAT --to-destination 192.168.2.1:8000 iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to $REMOTE_INTERNAL_IP ### End DMZ .. Add other rules ###
наконец, на клиенте я добавляю маршруты и переадресацию портов
########## # client HOST=$1 # bring up the tap ifconfig tap0 up # put an ip on it so we can listen ifconfig tap0 192.168.2.1 # add an explicit route for our ssh ip route add $HOST via 192.168.1.1 dev eth0 # make the tap the default routing ip route replace default dev tap0 # remove the default link #ip route del 192.168.2.0/24 dev tap0 proto kernel scope link src 192.168.2.1
и я запускаю веб-сервер
python -m SimpleHTTPServer
когда я делаю telnet 192.168.2.1 с любого сервера, он проходит нормально. но если я использую telnet для $ THE_REAL_IP, это не сработает.
если я поставлю правило MASQUERADE iptables, то оно работает нормально, но я делаю это, чтобы избежать MASQUERADE. Я хочу, чтобы исходный IP оставался в пакете.
Есть идеи, что я делаю не так?
больше информации
Хорошо, теперь я испробовал гораздо больше попыток. И все равно ничего не работает.
Я думал, что может сработать, добавив это клиенту:
# these should route packets back to tap0 ip rule add from 192.168.2.0/24 table 42 ip route add default dev tap0 table 42
Потому что это должно установить принудительное правило для всего, что написано для 192.168.2.1, должно возвращаться через этот интерфейс tap0. Но, к сожалению, не работает.
Также я попытался связать ip с tap0 на удаленной стороне.
ifconfig tap0 192.168.2.5
И это кажется интересным, потому что теперь мне не нужно настраивать маршрутизацию, система, кажется, делает это почти автоматически:
##### # server routing # bring up the tap ifconfig tap0 192.168.2.5 ifconfig tap0 up # route all traffic for 192.168.2.* through it ip route add 192.168.2.0/24 dev tap0 ##### # server iptables iptables -F iptables -t nat -F # forward traffic between DMZ and LAN iptables -A FORWARD -i eth0 -o tap0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -i tap0 -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT # Route incoming port to DMZ server 192.168.2.1 iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 8000 -j DNAT --to-destination 192.168.2.1:8000 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE ### End Server #### ############################# ############################# ########## # client echo 1 | tee /proc/sys/net/ipv4/ip_forward # bring up the tap ifconfig tap0 up # put an ip on it so we can listen ifconfig tap0 192.168.2.1 # these should route packets back to tap0 # but they actually don't make any difference #ip rule add from 192.168.2.0/24 table 42 #ip route add default dev tap0 table 42
Я понимаю, что вы заявили, что хотите, чтобы исходный IP-адрес попадал на ваш сервер Python, но, возможно, вы здесь ошиблись. Стандартная практика - передавать исходный IP-адрес через HTTP в заголовке X-Forwarded-For. Большинство веб-фреймворков выбирают этот заголовок и используют вместо исходного IP-адреса, если он указан.
Если вы хотите пойти по этому пути, все, что вам нужно, - это интерфейсный веб-сервер. В любом случае, иметь внешний интерфейс - хорошая идея: он более безопасен, потому что никто не имеет прямого доступа к вашему серверу приложений, и вы можете легко реализовать такие службы, как HTTPS и кеширование, не занимая больше циклов ЦП на сервере приложений. Что-то вроде Nginx прекрасно подойдет.
Если вы используете DNAT
скорее, чем MASQUERADE
тогда вы должны оставить исходный IP-адрес как есть во входящих пакетах.
Конечно, с DNAT, поскольку адрес источника не изменяется, вам нужно быть осторожным, чтобы убедиться, что другой конец знает, что нужно отправлять ответные пакеты таким же образом - в вашем случае обратно по туннелю, а не через общедоступный интерфейс, который будет шлюз по умолчанию.