] Я знаю, что это немного поздно, однако ... Знает ли хост []-T[], что он ответственен за этот IP? Вот схема, которую я разместил в верхней части файлов с правилами, которые я создаю. Подобные схемы можно найти где угодно, но их наличие в ASCII (не хотелось бы называть искусством ;)) может быть весьма полезно на терминале.[
] []Большую часть я знаю это от души, но не повредит иметь ссылку, если возникнет забывчивость.[
] [###############################################################################
###
### PACKET FLOW THROUGH NETFILTER TABLES AND CHAINS
###
###
### {Packet in}
### |
### v
### +-----------------+
### |mangle/PREROUTING|
### +-----------------+
### |
### v
### +-----------------+
### | nat/PREROUTING |
### +-----------------+
### |
### v
### *~~~~~~~~~~~~~~~~~*
### | kernel routing |
### *~~~~~~~~~~~~~~~~~*
### |
### v
### .------------{?for this host?}------------.
### yes! | | no!
### v v
### +-----------------+ +-----------------+
### | mangle/INPUT | | mangle/FORWARD |
### +-----------------+ +-----------------+
### | |
### v v
### +-----------------+ +-----------------+
### | filter/INPUT | | filter/FORWARD |
### +-----------------+ +-----------------+
### | |
### v |
### *~~~~~~~~~~~~~~~~~~~~* |
### | response & routing | |
### *~~~~~~~~~~~~~~~~~~~~* |
### | |
### v |
### +-----------------+ |
### | mangle/OUTPUT | |
### +-----------------+ |
### | |
### v |
### +-----------------+ |
### | nat/OUTPUT | |
### +-----------------+ |
### | |
### v |
### +-----------------+ |
### | filter/OUTPUT | |
### +-----------------+ |
### | |
### .-------------------+---------------------.
### |
### v
### +------------------+
### |mangle/POSTROUTING|
### +------------------+
### |
### v
### +------------------+
### | nat/POSTROUTING |
### +------------------+
### |
### v
### {Packet out}
###
###############################################################################
]
[]Что это значит?[
] []Маршрутизация может происходить как с помощью таблицы маршрутизации ("маршрутизация ядра" в вышеприведенной схеме), так и с помощью netfilter. Теперь, если - и это наиболее вероятный сценарий в вашем случае - вы не установили таблицу маршрутизации соответственно, ядро не будет знать, куда пакет должен пойти и в конце концов сбросит его. Btw: в таких случаях полезно создать пользовательскую цепочку, которая будет []LOG[
], а затем []DROP[
] или добавить правила в этом порядке. Таким образом вы увидите, какие правила были удалены. Также полезно использовать []iptables-save -c[
], который подготовит счетчики пакетов и байтов к каждой строке правила так же, как он добавляет их для цепочек (формат [][пакеты:байты][
]).[
]Для портов, перенаправляемых на ВМ через []DNAT[
] у меня есть следующий рецепт (будет объяснено ниже):[
#!/bin/bash
VMNET=192.168.1.0/24
MAINIP=66.249.67.195
CONTIP=192.168.1.2
VMPORT=80
INPORT=80
ACTION="-I"
iptables -t nat $ACTION PREROUTING -d $MAINIP -p tcp --dport $INPORT -j DNAT --to-destination $CONTIP:$VMPORT
iptables -t nat $ACTION POSTROUTING -s $VMNET ! -d $VMNET -p tcp -j MASQUERADE --to-ports 1024-65535
iptables -t nat $ACTION POSTROUTING -s $VMNET ! -d $VMNET -p udp -j MASQUERADE --to-ports 1024-65535
iptables -t nat $ACTION POSTROUTING -s $VMNET ! -d $VMNET -j MASQUERADE
iptables -t filter $ACTION INPUT -p tcp -d $MAINIP --dport $INPORT -j ACCEPT
iptables -t filter $ACTION FORWARD -p tcp --dport $INPORT -d $VMNET -j ACCEPT
iptables -t filter $ACTION FORWARD -p tcp --dport $INPORT -d $MAINIP -j ACCEPT
]
[]Имейте в виду, что вы можете захотеть изменить порядок, чтобы подогнать правила под свои собственные. Также, если цепочка []OUTPUT[
] не имеет в качестве политики по умолчанию []ACCEPT[
], убедитесь, что вы добавили выходное правило, хотя для всех практических целей оно должно быть обработано с помощью правила состояния []RELATED,ESTABLISHED[
]. Вы также можете уточнить интерфейсы для совпадения или подстановки подстановочного знака. Например, я дал мостам моих виртуальных гостей все префиксы []_[
] (подчеркивание) и, следовательно, может совпадать с []-i _+[
] и []-o _+[
]. Аналогично для нескольких сетевых карт ([]eth0[
], []eth1[
]) вы бы совпали с []-i eth+[
]. [
]Так что здесь происходит следующее:[
] []DNAT[
], которое принимает входной порт (хост) []$INPORT[
] для TCP и "маршрутизирует" его в []$CONTIP:$VMPORT[
], т.е. IP-адрес контейнера и порт в контейнере. Да, они могут отличаться. Если они этого не делают, то можно пропустить часть назначения (т.е. просто `$CONTIP`). []INPUT[
], позволяющее входящим пакетам на публичном IP (интерфейс не указан, но может быть!) портировать []$INPORT[
]. Я думаю, что это правило не является строго необходимым, по крайней мере, если вы привязываете его к публичному интерфейсу. []$INPORT[
] для виртуальной гостевой подсети ([]$VMNET[
])[]$INPORT[
]. на публичной IP ([]$MAINIP[
])[]И последнее, но не менее важное значение для []sysctl[
] ([]/proc/sys/net/ipv4/ip_forward[
]) должно быть: [
# cat /proc/sys/net/ipv4/ip_forward
1
]
[], чтобы сделать ваш хост маршрутизатором. [
] [] Если не используется []echo 1[
] для записи в вышеприведенный "файл" в []procfs[
] или лучше использовать []sysctl -w net.ipv4.ip_forward=1[
] в качестве []root[
].[
Вам нужно разрешить вашей командной строке ssh
где-нибудь подключиться к ssh-серверу. Ваша существующая ProxyCommand
не делает этого - она предоставляет все средства для входа куда-либо, и ничего не осталось для вашего исходного ssh
.
Мне кажется, что это работает достаточно хорошо, и я думаю, что я правильно понял вашу цепочку (очевидно, мне сложнее тестировать с теми же самыми именами хостов, которые вы используете). Обратите внимание, что на бастионном хосте используется nc
, а не ssh
:
Host destination.net
User user
ProxyCommand ssh -A user@bastion.net nc %h %p
ForwardAgent yes
RemoteForward 40022 git.some.pt:22
я также рассматривал возможность запуска /usr/sbin/sshd -i
в конце ssh -p %p user@%h
(вместо nc %h %p
), как предложил man ssh_config, но я не могу заставить это работать. Может быть, тебе повезет больше.