У меня есть экземпляр AWS EC2, работающий под управлением Amazon Linux, к которому подключены два эластичных сетевых интерфейса (ENI): eth0 и eth1. Я подключаюсь к публичному IP на eth0. Все работает отлично, за исключением того, что я хотел бы направлять незашифрованный трафик из eth1. т.е. клиент подключается к eth0 для настройки зашифрованного VPN-туннеля, затем его незашифрованный интернет-трафик направляется в / из eth1 и обратно через туннель на eth0.
Я недостаточно знаю об iptables, чтобы заставить эту конфигурацию работать, несмотря на попытки в течение нескольких часов. Надеюсь, это просто?
Я установил последнюю версию OpenVPN из исходников и сделал следующее:
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
iptables -A INPUT -i eth0 -m state --state NEW -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.18.14.0/24 -o eth0 -j MASQUERADE
Файл конфигурации моего сервера выглядит так:
port 443 proto tcp-server dev tun tls-server server 10.18.14.0 255.255.255.0 ca /etc/openvpn/pki/ca.crt cert /etc/openvpn/pki/vpnserver.crt key /etc/openvpn/pki/vpnserver.key dh /etc/openvpn/pki/dh.pem ifconfig-pool-persist ipp2.txt push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 8.8.8.8" push "dhcp-option DNS 8.8.4.4" keepalive 5 15 comp-lzo max-clients 5 persist-key persist-tun status openvpn-status.log log-append /var/log/openvpn_road.log verb 6 mute 20 tun-mtu 1500 auth SHA1 keysize 128 cipher BF-CBC
Вам нужно настроить маршрутизацию, ваши правила выглядят нормально, но вам нужно изменить правило MASQ.
iptables -t nat -A POSTROUTING -s 10.18.14.0/24 -o eth1 -j MASQUERADE
Я бы также предложил несколько более простых правил для исходящих пакетов.
# Allows packets from connections initiated by the box or already established
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
Что касается маршрутизации, я предполагаю, что вы хотите, чтобы клиенты OpenVPN выходили только через eth1, а не через сам сервер, который, как я полагаю, имеет маршрут по умолчанию через eth0. Нам нужно создать новую таблицу маршрутизации для ваших клиентов OpenVPN, мы назовем ее ovpn-inet.
редактировать /etc/iproute2/rt_tables
, вставьте в конце следующее и сохраните.
1 ovpn-inet
Затем создайте /etc/sysconfig/network-scripts/route-eth1
со следующим содержанием, заменив <gw on eth1>
и другие атрибуты внутри <>
.
default via <gw for eth1> dev eth1 table ovpn-inet
<local network on eth1> dev eth1 src <eth1 ip adress> table ovpn-inet
Теперь создайте /etc/sysconfig/network-scripts/rule-eth1
from <ip address of eth1>/32 table ovpn-inet
from 10.18.14.0/24 table ovpn-inet
to <ip address of eth1>/32 table ovpn-inet
Было бы также предложено переключить OpenVPN на UDP для повышения производительности. Это также позволит вам запустить HTTPS-сервер, если он вам когда-нибудь понадобится, через TCP. Также рассмотрите возможность использования tls-crypt
в конфигурации вашего сервера OpenVPN, как простой способ немного укрепить вашу установку.
proto udp4
Теперь перезапустите сеть, чтобы изменения вступили в силу.
/etc/init.d/network restart