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.