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

Хорошо, я все еще работаю над созданием http-сервера dmz'd

Итак, теперь у меня есть Ethernet-туннель с использованием ssh -w 0:0, и у меня есть интерфейсы на каждом конце, которые могут общаться друг с другом:

предыдущий вопрос


Так что теперь я пытаюсь сделать так, чтобы этот http-сервер был виден во внешней сети. Вот полная настройка

Поэтому я создаю новый экземпляр ec2 и запускаю установку:

источник./HOST

scp -i green.pem server / * root @ $HOST:
ssh -i green.pem root @ $HOST./setup

он по очереди запускает настройку на удаленной машине:

apt-get update
apt-get установить telnet

эхо 1 | тройник /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:

#####
# серверная маршрутизация
# поднять кран
ifconfig tap0 up
# маршрутизировать весь трафик для 192.168.2.* через него
ip route add 192.168.2.0/24 dev tap0

#####
# сервер iptables
REMOTE_INTERNAL_IP = $ 1

iptables -F
iptables -t nat -F

### end init firewall.. Запустить DMZ материал ####
# переадресация трафика между DMZ и LAN
iptables -A FORWARD -i eth0 -o tap0 -m состояние - состояние НОВОЕ, УСТАНОВЛЕНО, СВЯЗАНО -j ПРИНЯТЬ
iptables -A FORWARD -i tap0 -o eth0 -m состояние - УСТАНОВЛЕНО, СВЯЗАНО -j ПРИНЯТЬ

# Направить входящий порт на сервер DMZ 192.168.2.1
iptables -t nat -A ПРЕДУПРЕЖДЕНИЕ -p tcp -i eth0 --dport 8000 -j DNAT - к месту назначения 192.168.2.1:8000
iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to $REMOTE_INTERNAL_IP
### Завершить DMZ .. Добавить другие правила ###

наконец на клиенте я добавляю маршруты и переадресацию портов

##########
# клиент
HOST = $ 1

# поднять кран
ifconfig tap0 up
# поставить ip на него, чтобы мы могли слушать
ifconfig tap0 192.168.2.1
# добавить явный маршрут для нашего ssh
ip route добавить $HOST через 192.168.1.1 dev eth0

# сделать крана маршрутизацией по умолчанию
ip route заменить по умолчанию dev tap0
# удалить ссылку по умолчанию
#ip route del 192.168.2.0/24 dev tap0 Proto Link области видимости src 192.168.2.1

и я запускаю веб-сервер

python -m SimpleHTTPServer

когда я делаю telnet 192.168.2.1 с любого сервера, он проходит через нормально. но если я делаю телнет к $THE_REAL_IP, он не работает.

если я добавлю правило MASQUERADE iptables, то оно будет нормально работать, но я делаю это, чтобы избежать MASQUERADE. Я хочу, чтобы исходный IP-адрес оставался в пакете.


Есть идеи, что я делаю не так?

-----


Дополнительная информация

-----


Хорошо, теперь я перепробовал множество других попыток. И все равно ничего не работает.

Тот, который я думал, мог бы работать, добавил бы это к клиенту:

# они должны направлять пакеты обратно на tap0
IP-правило добавить из 192.168.2.0/24 таблицы 42
ip route добавить по умолчанию dev tap0 таблица 42

Потому что это должно поставить принудительное правило для всего, что написано для 192.168.2.1, должно возвращаться через этот интерфейс tap0. Но это не работает, к сожалению.

Также я попытался связать ip с tap0 на удаленной стороне.

ifconfig tap0 192.168.2.5

И это кажется интересным, потому что теперь мне не нужно настраивать маршрутизацию, система, кажется, делает это почти автоматически:

#####
# серверная маршрутизация
# поднять кран
ifconfig tap0 192.168.2.5
ifconfig tap0 up
# маршрутизировать весь трафик для 192.168.2.* через него
ip route add 192.168.2.0/24 dev tap0


#####
# сервер iptables

iptables -F
iptables -t nat -F

# переадресация трафика между DMZ и LAN
iptables -A FORWARD -i eth0 -o tap0 -m состояние - состояние НОВОЕ, УСТАНОВЛЕНО, СВЯЗАНО -j ПРИНЯТЬ
iptables -A FORWARD -i tap0 -o eth0 -m состояние - состояние НОВОЕ, УСТАНОВЛЕНО, СВЯЗАНО -j ПРИНЯТЬ

# Направить входящий порт на сервер DMZ 192.168.2.1
iptables -t nat -A ПРЕДУПРЕЖДЕНИЕ -p tcp -i eth0 --dport 8000 -j DNAT - к месту назначения 192.168.2.1:8000
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

### Конечный сервер ####

#############################
#############################

##########
# клиент
эхо 1 | тройник / proc / sys / net / ipv4 / ip_forward

# поднять кран
ifconfig tap0 up
# поставить ip на него, чтобы мы могли слушать
ifconfig tap0 192.168.2.1

# они должны направлять пакеты обратно на tap0
# но они на самом деле не имеют никакого значения
#ip правило add из 192.168.2.0/24 таблица 42
#ip route add default dev tap0 table 42

2 ответа

Я понимаю, что вы заявили, что хотите сохранить исходный IP-адрес для вашего сервера Python, но здесь вы, возможно, ошибаетесь. Это стандартная практика - передавать через IP-адрес исходный IP-адрес в заголовке X-Forwarded-For. Большинство веб-фреймворков извлекают этот заголовок и используют вместо исходного IP-адреса, если он указан.

Если вы хотите пойти по этому пути, все, что вам нужно, это интерфейсный веб-сервер. В любом случае, неплохо иметь внешний интерфейс: он более безопасен, потому что никто не имеет прямого доступа к вашему серверу приложений, и вы можете легко реализовать такие сервисы, как HTTPS и кэширование, не занимая больше циклов ЦП на сервере приложений. Что-то вроде Nginx прекрасно справится с задачей.

Если вы используете DNAT скорее, чем MASQUERADE тогда вы должны оставить исходный IP-адрес как есть на входящих пакетах.

Конечно, с DNAT, так как адрес источника не изменяется, вам нужно быть осторожным, чтобы убедиться, что другой конец знает, чтобы отправлять ответные пакеты таким же образом - в вашем случае обратно в туннель, а не через открытый интерфейс, который будет шлюз по умолчанию.

Другие вопросы по тегам