Назад | Перейти на главную страницу

как маршрутизировать внешний IP-адрес на внутренний без MASQUERADE

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