Skip to content

StrongSwan VPN туннельный IP

В предыдущем посте мы описывали как настроить StrongSwan IPSec.

Приведём общую конфигурацию /etc/swanctl.conf:

swanctl {
    load = pem pkcs1 x509 revocation constraints pubkey openssl pkcs8 random
}

connections {
    eap {
        local {
            auth = pubkey
            certs = fullchain.pem
            id = vpn.domain.com
        }
        remote {
            auth = eap-mschapv2
            eap_id = %any
        }
        children {
            eap {
                local_ts  = 0.0.0.0/0
                start_action = start
        }
    }
    unique = never
    version = 2
    dpd_delay = 30s
    send_cert = always
    proposals=aes128-aes192-aes256-sha1-sha256-sha384-modp1024,default
    pools = ipv4
    }
}

pools {
    ipv4 {
        addrs = 10.90.1.0/24
        dns = 94.140.14.14
    }
}

secrets {
    private {
        file=privkey.pem
    }
    eap-username {
        id = username
        secret = "userpassword"
    }
}

В такой конфигурации VPN клиент подключается к серверу vpn.domain.com, авторизует сервер по сертификату privkey, и авторизуется на сервере по имени username.

Клиент получает туннельный IP адрес из подсети 10.90.1.0/24.

Допустим на сервере мы хотим разместить еще веб сервер, доступный только клиентам в VPN. Возникает вопрос: а как клиентам теперь обращаться к ресурсам сервера через установленный туннель?

Если посмотреть список IP адресов, использующихся на сервере, то там будет только публичный адрес сервера 1.1.1.1:

# ip --brief a

lo               UNKNOWN        127.0.0.1/8 ::1/128
ens3             UP             1.1.1.1/24

Для этого добавим IP адрес из туннеля на интерфейс ens3:

ip addr add 10.90.1.254 dev ens3

Чтобы сделать постоянной конфигурацию добавим в /etc/network/interfaces для Ubuntu:

iface ens3 inet static
    address   10.90.1.254

Далее разрешим доступ из туннельной сети в фаерволе iptables:

iptables -I INPUT -s 10.90.1.0/24 -j ACCEPT

Чтобы сделать постоянной конфигурацию сохраним текущие правила в /etc/iptables/rules.v4:

iptables-save > /etc/iptables/rules.v4

В итоге список правил брендмауэра должен быть похож на /etc/iptables/rules.v4:

*filter
:INPUT DROP [8:629]
:FORWARD ACCEPT [136:28340]
:OUTPUT ACCEPT [82:12291]
-A INPUT -s 2.2.2.2/32 -j ACCEPT
-A INPUT -s 10.90.1.0/24 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p udp -m udp --dport 500 -j ACCEPT
-A INPUT -p udp -m udp --dport 4500 -j ACCEPT
-A INPUT -p esp -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
COMMIT
*nat
:PREROUTING ACCEPT [22307:4916022]
:INPUT ACCEPT [1897:162914]
:OUTPUT ACCEPT [48:3463]
:POSTROUTING ACCEPT [48:3463]
-A POSTROUTING -s 10.90.1.0/24 -o ens3 -m policy --dir out --pol ipsec -j ACCEPT
-A POSTROUTING -s 10.90.1.0/24 -o ens3 -j MASQUERADE
COMMIT

На CentOS дистрибутивах с firewalld правило можно добавить командой:

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.90.1.0/24" accept'
firewall-cmd --reload

Не забываем разрешить пересылку IP между сетями (IP forwarding):

sysctl -w net.ipv4.ip_forward=1
iptables -I FORWARD -s 10.90.1.0/24 -j ACCEPT
iptables -I FORWARD -d 10.90.1.0/24 -j ACCEPT

Или на постоянной основе добавить строчку в файл /etc/sysctl.conf:

net.ipv4.ip_forward = 1

После этих изменений VPN клиент сможет подключаться к серверу на адрес 10.90.1.254.