for string in Dogs.pgp.123sda Dogs.pgpsjaksdasdasdaw Dogs.pgp-asasdawad2
do
printf '%s --> %s\n' "$string" "${string%${string#*.???}}"
done
Выход:
Dogs.pgp.123sda --> Dogs.pgp
Dogs.pgpsjaksdasdasdaw --> Dogs.pgp
Dogs.pgp-asasdawad2 --> Dogs.pgp
Цикл перебирает три строки. В теле цикла исходная строка печатается вместе с преобразованной строкой.
Строка преобразуется путем удаления всего, кроме части перед первой точкой в строке и трех символов, следующих за точкой.
Для этого сначала нужно выяснить, что нужно удалить из исходной строки. Это ${string#*.???}
, т.е. остаток строки после удаления до первой точки и еще трех символов. Затем он удаляется с конца строки через ${string%${string#*.???}}
.
Если цикл повторяется по именам файлов , совпадающим, например. *.pgp*
, то это также будет обрабатывать случаи, когда имена файлов содержат символы новой строки. Единственное, что могло бы сбить с толку приведенное выше преобразование, это если бы перед подстрокой .pgp
были точки, но вы могли бы справиться с этим, явно сопоставив .pgp
вместо.???
:
for fname in *.pgp*
do
printf '%s --> %s\n' "$fname" "${fname%${fname#*.pgp}}"
done
Все:
Оказывается, в моем исходном правиле iptables -t nat отсутствовало определение --dport 443 и причина, по которой оно взаимодействовало с другими HTTP-запросами.
# Create the RPDB rules
ip rule add from 0/0 fwmark "0x1000/0x1000" table ovpnc1 prio 9993 # VPN 1 fwmark
iptables -t mangle -A PREROUTING -i br0 -p tcp --dport 443 -d 172.67.168.48 -j MARK --set-mark 0x2000/0x2000
iptables -t nat -A PREROUTING -i br0 -p tcp --dport 443 -j DNAT --to-destination 172.67.168.48:443 -m mark --mark 0x2000/0x2000
Как только определение --dport 443 было добавлено в правило iptables -t nat, проблема была решена.
Надеюсь, это поможет кому-нибудь в будущем.
С уважением,
Гэри
VPN-сервер:Предполагая, что eth0(IP-адрес1.2.3.4
)является физическим интерфейсом, который напрямую подключен или, по крайней мере, имеет маршрут к IP-адресу или сети целевого веб--сервера, вы можете отслеживать любой трафик, предназначенный для веб-сервера -с IP-адресом 172.67.168.48:443
, должен быть принудительно пропущен через VPN-туннель, а затем передан по NAT на IP-адрес eth0(1.2.3.4
в этом примере ). В этом случае br0 интерфейс (IP10.10.10.1
)— это виртуальный интерфейс, который сервер VPN использует для туннелирования трафика. Пока VPN работает, она уже знает, как направлять пакеты на IP-адрес назначения 172.67.168.48
Если нет, то необходимо добавить статический маршрут:
$ ip route show
172.67.168.48/32 via 10.10.10.1 dev br0 metric 101
Как только оператор маршрута будет удовлетворен, вы можете заставить трафик, предназначенный для IP 172.67.168.48:443
, маршрутизироваться через туннель и выходить на другой стороне как 1.2.3.4
en -маршрут172.67.168.48
$ sudo iptables -t nat -A POSTROUTING -o eth0 -p tcp -m tcp -d 172.67.168.48 --dport 443 -j SNAT --to-source 1.2.3.4
$ sudo iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
Если клиент отправляет пакет, например, на 172.67.168.48:80
, исходный IP-адрес не изменится, и пакет может быть отброшен, если он не разрешен последующими цепочками.