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

Перенаправление портов openvpn для SNAT или DNAT с Iptables?

Мне удалось настроить openvpn и заставить его выдавать статические внутренние IP-адреса клиентам. Теперь у меня проблема в том, что я пытаюсь назначить открытый порт для каждого клиента, поскольку теперь у них есть статический внутренний IP-адрес, что позволяет легко быть готовым к добавлению правил. Проблемы возникают с тем, как правильно это сделать с помощью iptables.

В примере внутреннего статического IP-адреса клиента 10.8.0.10 будет перенаправлен порт 1234.

Я пробовал это без везения, vpn действительно использует udp и порт 1194, но попробовал следующие правила, измененные как udp и как tcp, и оба вместе. Обратите внимание, что vpn уже работает и имеет правила маскарада, но в остальном iptables пуст.

iptables -t nat -A PREROUTING -p tcp --dport 1234 -j DNAT --to-destination 10.8.0.10
iptables -A FORWARD -s 10.8.0.10 -p tcp --dport 1234 -j ACCEPT

Я также пробовал, чтобы 10.8.0.1 был шлюзом, а 10.8.0.10 был клиентом, которому нужен порт, все порты перенаправлены

iptables -t nat -A PREROUTING -d 10.8.0.1 -j DNAT --to-destination 10.8.0.10

Сначала я пытаюсь выполнить две вещи: перенаправить порт для каждого клиента и, при необходимости, статический общедоступный IP-адрес, если им нужно перенаправить все порты.

openvpn server.conf

local 123.123.123.123 #- your_server_ip goes here
port 1194 #- port
proto udp #- protocol
client-config-dir /etc/openvpn/ccd
push "route 10.8.0.0 255.255.0.0"
ifconfig-pool-persist /etc/openvpn/openvpn.dhcp 30
dev tun
tun-mtu 1500
tun-mtu-extra 32
mssfix 1450
ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt
cert /etc/openvpn/easy-rsa/2.0/keys/server.crt
key /etc/openvpn/easy-rsa/2.0/keys/server.key
dh /etc/openvpn/easy-rsa/2.0/keys/dh1024.pem
plugin /etc/openvpn/radiusplugin.so /etc/openvpn/radiusplugin.cnf
client-cert-not-required
username-as-common-name
server 10.8.0.0 255.255.255.0
push redirect-gateway def1
push dhcp-option DNS 8.8.8.8
push dhcp-option DNS 8.8.4.4
keepalive 5 30
comp-lzo
persist-key
persist-tun
status 1194.log
verb 3

iptables-save:

# Generated by iptables-save v1.3.5 on Sun Aug 26 14:27:12 2012
*nat
:PREROUTING ACCEPT [4834:503608]
:POSTROUTING ACCEPT [1000:70847]
:OUTPUT ACCEPT [1000:70847]
-A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE
COMMIT
# Completed on Sun Aug 26 14:27:12 2012
# Generated by iptables-save v1.3.5 on Sun Aug 26 14:27:12 2012
*filter
:INPUT ACCEPT [21545:23742094]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [14867:1938275]
COMMIT
# Completed on Sun Aug 26 14:27:12 2012

У меня отлично работает. Пара вещей, которые стоит проверить:

  • Это не будет подключений NAT, сделанных от самого сервера VPN, для этого вам понадобится правило в цепочке OUTPUT.
  • Клиент настроен на маршрутизацию все трафик через VPN? В противном случае вы можете обнаружить, что ответные пакеты не отправляются обратно через VPN.
  • Вы уверены, что используете IP-адрес на стороне клиента, а не на стороне сервера для соединения точка-точка этого клиента?
  • Вы хотите сопоставить определенный IP-адрес назначения в правиле, иначе вы поймаете другие соединения на этом номере порта.
  • Использование NAT для всех подключений к 10.8.0.1 может вызвать проблемы, поскольку все клиенты направляют трафик через этот IP-адрес.
-A  PREROUTING -p tcp -m tcp --dport 1234 -j DNAT --to-destination 10.8.0.10

это то, что вы ищете :)

сам прошел через эту же проблему

Я вижу и предполагаю, что вы используете файл ccd для нажатия статического внутреннего IP-адреса? если да, то указанное выше правило должно работать при редактировании в iptables