En el host A
, debe enrutar todo el tráfico de la red de destino al host B
. Asumiré que esto es algo así como192.168.0.0/24
para Linux (en hostA
):
ip r a 192.168.0.0/24 via 10.9.8.3 dev eth0
para Windows (en hostA
):
route ADD 192.168.0.0 MASK 255.255.255.0 10.9.8.3
Después de que el enrutamiento esté en su lugar,todos los paquetes para la red 192.168.0.0/24
se enviarán al host B
.
Para permitir que los paquetes se reenvíen de wlp3s0
a tun0
en el host B
, debe habilitar el reenvío de IP.
Para habilitar temporalmente el reenvío de IP para todas las interfaces:
sysctl net.ipv4.conf.all.forwarding=1
Para habilitar este cambio de forma permanente, agregue una nueva línea a/etc/sysctl.conf
:
net.ipv4.conf.all.forwarding = 1
Además de la configuración de la interfaz, iptables
podría estar activo y necesitar permitir el reenvío de paquetes.
Para verificar si iptables
está activo (al menos para la cadena FORWARD
):
iptables -L FORWARD -nv
Si la cadena no tiene reglas y la política dice ACCEPT
, está listo para continuar, si no, debe agregar reglas relevantes para permitir el reenvío de 192.168.0.0/24
.
Permitir el reenvío de todos los paquetes a 192.168.0.0/24
enwlp3s0
:
iptables -I FORWARD -i wlp3s0 -d 192.168.0.0/24 -j ACCEPT
iptables -I FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
el RELATED,ESTABLISHED
permite automáticamente la devolución de paquetes.
Ahora, después de configurar el reenvío, los paquetes se enviarán al túnel. Pero en la medida en que la red remota detrás de la VPN no conozca nuestra red local, lo cual suele ser el caso, necesitamos NAT
todos los paquetes que provienen de nuestra red local e irán a la VPN a la dirección que obtuvimos de el servidor VPN -(que es la IP en eltun0
).
Para hacer esto, debe crear una regla MASQUERADE
en la tabla POSTROUTING
:
iptables -t nat -I POSTROUTING -o tun0 -j MASQUERADE
Esto enviará todos los paquetes salientes en tun0
a la IP de la interfaz `.
С
sed -r 's/([^0-9]*)([0-9]*)([^0-9]*)/\2/g'
вы можете оставить только число в середине. Это работает только с расширенными регулярными выражениями, поэтому вам нужна опция -r
для sed
.
На самом деле достаточно использовать
sed -r 's/([^0-9]*)([0-9]*)(.*)/\2/g'
Здесь используется функция ссылки на части выражения с помощью \1
, \2
,... Затем вам нужно использовать круглые скобки (...)
вокруг той части выражения, на которую вы хотите сослаться. В приведенном выше коде вторая часть ([0-9]*)
будет соответствовать числу в середине, и вы можете сослаться на это как \2
.
Редактировать:Как указал terdon, нам не нужно захватывать начальную часть, так как мы ее больше не используем. Так
sed -n -r 's/[^0-9]*([0-9]+).*/\1/p'
достаточно.
Подводя итог, приведенная выше команда сохраняет только первое число в вашей строке ввода.
Ваша попытка
sed s/rapido// | sed s/bonk.[abc](sweet|sour)potato.net//
был довольно близок, но вы допустили две ошибки. Во-первых, вы не заключали команду в кавычки, поэтому bash
интерпретирует специальные символы «(» и «|». (Тот факт, что вы получили сообщение об ошибке bash, должен был навести вас на это ).
Вторая ошибка более тонкая. Sed
и grep
используют базовые регулярные выражения, в которых всего несколько символов(. *^ $ [ ])имеют особое значение. Если вы хотите использовать расширенные операторы регулярных выражений(| (){} ), перед ними нужно поставить обратную косую черту. Итак, вот как должна была выглядеть ваша команда:
sed < t 's/rapido//' | sed 's/bonk.[abc].\(sweet\|sour\)potato.net//'
и поскольку sed
может обрабатывать несколько команд за один запуск, вы можете упростить это до
sed < t 's/rapido//; s/bonk.[abc].\(sweet\|sour\)potato.net//'
sed -e '/\.\([abc]\.\)\{0,1\}\(sweet\|sour\)potato\.net$/s/[^0-9]//g'
Выберите строки для редактирования, а затем удалите из них нецифровые символы.
Чтобы он выглядел менее загроможденным, используйте параметр -r
команды sed:
sed -re '/[.]([abc][.])?(sweet|sour)potato\.net$/ s/[^0-9]//g'