OpenVpn и linux (ну и частично freebsd =)

Настройка сетевых служб, маршрутизации, фаерволлов. Проблемы с сетевым оборудованием.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
sst78rus
рядовой
Сообщения: 40
Зарегистрирован: 2006-07-18 10:39:55

OpenVpn и linux (ну и частично freebsd =)

Непрочитанное сообщение sst78rus » 2007-03-13 16:14:49

Для создания vpn был выбран openvpn. Теперь уже из принципа заставлю работать =)

Чего есть:
"Сервер" на freebsd 6.2
На время тестирования упростил конфиг до минимума:

Код: Выделить всё

dev tun
ifconfig 10.8.0.1 10.8.0.2
secret /usr/local/etc/openvpn/keys/static.key

user nobody
group nobody

log /var/log/openvpn/openvpn.log
status /var/log/openvpn/openvpn-status.log
Пока тестирую в фаерволе стоит:

Код: Выделить всё

${ipfw} add allow all from any to any via tun0
Ну и разрешение там на соединение по udp на 1194 порт.

Клиенты. Клиентов вообще будет несколько, но пока экспериментирую с ними по очереди. Клиенты на freebsd, linux, и наверно на венде.
Сначала о мелкой проблеме, которую догадываюсь как решить :)
Клиент с freebsd 6.2.
Конфиг:

Код: Выделить всё

dev tun
remote 81.211.121.16
ifconfig 10.8.0.2 10.8.0.1
secret /usr/local/etc/openvpn/keys/static.key

user nobody
group nobody

log /var/log/openvpn/openvpn.log
status /var/log/openvpn/openvpn-status.log
Соединение проходит (логи приводить не буду, там все без ошибок, при таком конфиге).
Соединение поднимается:

Код: Выделить всё

tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
        inet 10.8.0.1 --> 10.8.0.2 netmask 0xffffffff
        Opened by PID 73592
Вывод netstat -r -n на сервере:

Код: Выделить всё

Routing tables

Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            81.211.121.1       UGS         0   319542    rl0
10.8.0.2           10.8.0.1           UH          0        4   tun0
81.211.121/24      link#2             UC          0        0    rl0
81.211.121.1       00:0f:a3:3e:32:51  UHLW        2        0    rl0   1015
127.0.0.1          127.0.0.1          UH          0        2    lo0
192.168.0          link#1             UC          0        0   ste0
192.168.0.12       00:18:f3:9e:40:da  UHLW        1   204807   ste0   1014

На клиенте:

Код: Выделить всё

Routing tables

Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            87.237.119.1       UGS         0 24068724    rl0
10.8.0.1           10.8.0.2           UH          0        2   tun0
87.237.96/19       link#1             UC          0        0    rl0
87.237.112.10      00:13:7f:42:96:1a  UHLW        1        9    rl0   1149
87.237.119.1       00:13:7f:42:96:1a  UHLW        2        0    rl0   1197
127.0.0.1          127.0.0.1          UH          0     2363    lo0
192.168.0          link#2             UC          0        0    rl1
Проблема (маленькая) в следующем: что клиент, что сервер успешно пингуют удаленную сторону, а самого себя никак. Очевидно это связано с таблицей маршрутизации. Т.е. сервер все пакеты шлет на 10.8.0.2, а клиент на 10.8.0.1, даже те, которые предназначены им самим. Как корректно прописать, что на сервере пакеты для 10.8.0.1 никуда слать не надо, а надо самому их обработать?

Проблема номер 2. Основная (ради нее столько букв написал =). Линукс. Конфиг клиентский точно такой же, буква в букву.
Соединение проходит, в логах все нормально.
/sbin/ifconfig

Код: Выделить всё

tun0      Link encap:Point-to-Point Protocol
          inet addr:10.8.0.2  P-t-P:10.8.0.1  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

В этот момент клиент который на фре отключен, поэтому адрес тот же, 10.8.0.2
Маршрутизация:

Код: Выделить всё

Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
10.8.0.1        *               255.255.255.255 UH        0 0          0 tun0
83.136.242.204  *               255.255.255.252 U         0 0          0 eth0
192.168.10.0    *               255.255.255.0   U         0 0          0 eth1
169.254.0.0     *               255.255.0.0     U         0 0          0 eth1
127.0.0.0       *               255.0.0.0       U         0 0          0 lo
default         205.242.telrost 0.0.0.0         UG        0 0          0 eth0
В результате. Сам себя пингую (10.8.0.2), а сервер никак:

Код: Выделить всё

[root@promhimservice olga]# ping 10.8.0.2
PING 10.8.0.2 (10.8.0.2) 56(84) bytes of data.
64 bytes from 10.8.0.2: icmp_seq=1 ttl=64 time=0.096 ms
64 bytes from 10.8.0.2: icmp_seq=2 ttl=64 time=0.058 ms

--- 10.8.0.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.058/0.077/0.096/0.019 ms

[root@promhimservice olga]# ping 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted

--- 10.8.0.1 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3018ms
Думал фаервол не пускает, добавил туда правило, чтоб пускало все, что на интерфейсе tun0. Вот вывод /sbin/iptables-save

Код: Выделить всё

# Generated by iptables-save v1.2.7a on Tue Mar 13 16:11:48 2007
*mangle
:PREROUTING ACCEPT [144934:75620552]
:INPUT ACCEPT [135348:74305874]
:FORWARD ACCEPT [9586:1314678]
:OUTPUT ACCEPT [151527:87215494]
:POSTROUTING ACCEPT [161101:88529164]
COMMIT
# Completed on Tue Mar 13 16:11:48 2007
# Generated by iptables-save v1.2.7a on Tue Mar 13 16:11:48 2007
*filter
:INPUT DROP [155:10236]
:FORWARD DROP [0:0]
:OUTPUT DROP [12:1008]
:bad_packets - [0:0]
:bad_tcp_packets - [0:0]
:icmp_packets - [0:0]
:tcp_inbound - [0:0]
:tcp_outbound - [0:0]
:udp_inbound - [0:0]
:udp_outbound - [0:0]
-A INPUT -i tun0 -j ACCEPT                                  #вот это правило
-A INPUT -i lo -j ACCEPT
-A INPUT -j bad_packets
-A INPUT -d 224.0.0.1 -j DROP
-A INPUT -s 192.168.10.0/255.255.255.0 -i eth1 -j ACCEPT
-A INPUT -d 192.168.10.255 -i eth1 -j ACCEPT
-A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -j tcp_inbound
-A INPUT -i eth0 -p udp -j udp_inbound
-A INPUT -i eth0 -p icmp -j icmp_packets
-A INPUT -d 255.255.255.255 -j DROP
-A INPUT -j LOG --log-prefix "fp=INPUT:99 a=DROP "
-A INPUT -p udp -m udp --dport 1194 -j ACCEPT
-A FORWARD -i tun0 -j ACCEPT                                   #вот это правило
-A FORWARD -j bad_packets
-A FORWARD -i eth1 -p tcp -j tcp_outbound
-A FORWARD -i eth1 -p udp -j udp_outbound
-A FORWARD -i eth1 -j ACCEPT
-A FORWARD -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -j LOG --log-prefix "fp=FORWARD:99 a=DROP "
-A OUTPUT -p icmp -m state --state INVALID -j DROP
-A OUTPUT -s 127.0.0.1 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -s 192.168.10.1 -j ACCEPT
-A OUTPUT -o eth1 -j ACCEPT
-A OUTPUT -o eth0 -j ACCEPT
-A OUTPUT -j LOG --log-prefix "fp=OUTPUT:99 a=DROP "
-A bad_packets -m state --state INVALID -j LOG --log-prefix "fp=bad_packets:1 a=DROP "
-A bad_packets -m state --state INVALID -j DROP
-A bad_packets -p tcp -j bad_tcp_packets
-A bad_packets -j RETURN
-A bad_tcp_packets -i eth1 -p tcp -j RETURN
-A bad_tcp_packets -p tcp -m tcp ! --tcp-flags SYN,RST,ACK SYN -m state --state NEW -j LOG --log-prefix "fp=bad_tcp_packets:1 a=DROP "
-A bad_tcp_packets -p tcp -m tcp ! --tcp-flags SYN,RST,ACK SYN -m state --state NEW -j DROP
-A bad_tcp_packets -p tcp -j RETURN
-A icmp_packets -p icmp -f -j LOG --log-prefix "fp=icmp_packets:1 a=DROP "
-A icmp_packets -p icmp -f -j DROP
-A icmp_packets -p icmp -m icmp --icmp-type 8 -j DROP
-A icmp_packets -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A icmp_packets -p icmp -j RETURN
-A tcp_inbound -p tcp -m tcp --dport 80 -j ACCEPT
-A tcp_inbound -p tcp -m tcp --dport 443 -j ACCEPT
-A tcp_inbound -p tcp -m tcp --dport 21 -j ACCEPT
-A tcp_inbound -p tcp -m tcp --sport 20 -j ACCEPT
-A tcp_inbound -p tcp -m tcp --dport 1352 -j ACCEPT
-A tcp_inbound -p tcp -m tcp --dport 25 -j ACCEPT
-A tcp_inbound -p tcp -m tcp --dport 110 -j ACCEPT
-A tcp_inbound -p tcp -m tcp --dport 143 -j ACCEPT
-A tcp_inbound -p tcp -m tcp --dport 995 -j ACCEPT
-A tcp_inbound -p tcp -m tcp --dport 993 -j ACCEPT
-A tcp_inbound -p tcp -m tcp --dport 22 -j ACCEPT
-A tcp_inbound -p tcp -m tcp --dport 5000:5100 -j ACCEPT
-A tcp_inbound -p tcp -j RETURN
-A tcp_outbound -p tcp -j ACCEPT
-A udp_inbound -p udp -m udp --dport 137 -j DROP
-A udp_inbound -p udp -m udp --dport 138 -j DROP
-A udp_inbound -p udp -m udp --dport 53 -j ACCEPT
-A udp_inbound -p udp -j RETURN
-A udp_outbound -p udp -j ACCEPT
COMMIT
# Completed on Tue Mar 13 16:11:48 2007
# Generated by iptables-save v1.2.7a on Tue Mar 13 16:11:48 2007
*nat
:PREROUTING ACCEPT [601:65037]
:POSTROUTING ACCEPT [10:840]
:OUTPUT ACCEPT [6335:384893]
-A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128
-A POSTROUTING -o eth0 -j SNAT --to-source 83.136.242.206
COMMIT
# Completed on Tue Mar 13 16:11:48 2007
Добавленные строки пометил " #вот это правило". Чего не так, чего добавить надо?

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2460 рублей (8 CPU, 8Gb RAM, 2x500Gb HDD, RAID 3ware 9750):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Непрочитанное сообщение dikens3 » 2007-03-13 16:33:37

Я тоже на такие сообщения думаю, что фаер.
Сам на iptables давно сидел.

Код: Выделить всё

-A OUTPUT -p icmp -m state --state INVALID -j DROP
-A OUTPUT -s 127.0.0.1 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -s 192.168.10.1 -j ACCEPT
-A OUTPUT -o eth1 -j ACCEPT
-A OUTPUT -o eth0 -j ACCEPT
-A OUTPUT -j LOG --log-prefix "fp=OUTPUT:99 a=DROP " 
Что в логах, какие пакеты заблокированы? Судя по сообщению:

Код: Выделить всё

ping: sendmsg: Operation not permitted
iptables не даёт отправить пакет.

Код: Выделить всё

10.8.0.1        *               255.255.255.255 UH        0 0          0 tun0
Под * что скрывается?
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

sst78rus
рядовой
Сообщения: 40
Зарегистрирован: 2006-07-18 10:39:55

Непрочитанное сообщение sst78rus » 2007-03-13 17:47:43

В /var/log/messages

Код: Выделить всё

Mar 13 17:41:21 promhimservice kernel: fp=OUTPUT:99 a=DROP IN= OUT=tun0 SRC=10.8
.0.2 DST=10.8.0.1 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 COD
E=0 ID=64014 SEQ=1
Mar 13 17:41:22 promhimservice kernel: fp=OUTPUT:99 a=DROP IN= OUT=tun0 SRC=10.8
.0.2 DST=10.8.0.1 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 COD
E=0 ID=64014 SEQ=2
Mar 13 17:41:23 promhimservice kernel: fp=OUTPUT:99 a=DROP IN= OUT=tun0 SRC=10.8
.0.2 DST=10.8.0.1 LEN=8
Поразмышляв на эту тему :oops: понял, что во-первых логи надо было почитать раньше, а во вторых прописать

Код: Выделить всё

/sbin/iptables -A OUTPUT -o tun0 -j ACCEPT
Пинги пошли.

Осталось разобраться, как правильно маршруты прописать, чтоб фря могла сама себя пинговать.


PS: а как узнать, что под звездочкой скрывается? Я вывод netstat -r полностью привел.

sst78rus
рядовой
Сообщения: 40
Зарегистрирован: 2006-07-18 10:39:55

Непрочитанное сообщение sst78rus » 2007-03-14 11:07:22

Сейчас прикручиваю шифрование, потом еще с винды попробую. В статью надо это пытаться сверстать? Чтоб тут комплект по всем vpn-ам был? :)

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35035
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2007-03-14 11:56:57

давай.
тока чтоб себя пинговало :)))
Убей их всех! Бог потом рассортирует...

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Непрочитанное сообщение dikens3 » 2007-03-14 12:02:51

sst78rus писал(а):PS: а как узнать, что под звездочкой скрывается? Я вывод netstat -r полностью привел.
Не знаю как на Linux, на фре всё пишет:

Код: Выделить всё

# netstat -nr
Routing tables

Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            10.17.127.254      UGS         0   865434    ed0
10.17/17           link#2             UC          0        0    ed0
10.17.127.254      00:07:ba:30:50:2b  UHLW        2        0    ed0    622
127.0.0.1          127.0.0.1          UH          0      137    lo0
192.168.1          link#1             UC          0        0    rl0
192.168.1.1        00:e0:4c:25:58:fd  UHLW        1   204000    rl0    981
192.168.1.255      ff:ff:ff:ff:ff:ff  UHLWb       1      297    rl0
213.177.127.118    82.208.84.160      UH          0   457151   tun0
Как видно из примера, никаких звёздочек и видно через какой маршрут и что идёт. :-)
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

sst78rus
рядовой
Сообщения: 40
Зарегистрирован: 2006-07-18 10:39:55

Непрочитанное сообщение sst78rus » 2007-03-14 12:36:03

Я линукс ненавидеть начинаю =)
Вообщем добился рабочего состояния: vpn поднимается, у сервера принудительно 10.8.0.1, у клиента 10.8.0.2. Сети за обоими шлюзами друг друга видят (192.168.0.0/24 за сервером и 192.168.10.0/24 за клиентом).
Шифрование прикрутил, работает.

Теперь делаю так, чтоб клиентов было несколько, все друг друга видели, и сети друг за другом видели.
Заодно почитал http://forum.ixbt.com/topic.cgi?id=14:40906, а конкретно там:
В данном режиме OpenVPN-сервер эмулирует работу некоего многопортового виртуального маршрутизатора, к каждому порту которого подключен каждый клиент и сам серверный хост. При этом каждому виртуальному tun-интерфейсу хоста (и сервера в том числе) присваивается IP-адрес, также присваиваивается IP-адрес соответствующему порту этого виртуального маршрутизатора и выделяется подсеть, включающая эти 2 адреса + неожходимые 2 служебных, в итоге для каждого подключения выделяется подсеть /30 (255.255.255.252) из 4 адресов, назначение которых, например, для первой подсети 10.1.1.0/30 из OpenVPN-сети 10.1.1.0/24 таково:
10.1.1.0 - адрес подсети 10.1.1.0/30
10.1.1.1 - адрес tun-интерфейса сервера
10.1.1.2 - адрес интерфейса виртуального маршрутизатора
10.1.1.3 - адрес широковещания (broadcast)
Далее каждому подключающемуся клиенту выделяются подсеть и адрес именно блоками /30, то есть по 4 адреса. В меру художественных способностей изобразил это на рисунке - http://forum.ixbt.com/post.cgi?id=attach:14:40906:38:1
Замечу, что к самим IP-адресам виртуального маршрутизатора непосредственно обратиться никак нельзя, оне НЕ ПИНГУЮТСЯ, и в tracert не отображаются.
Ну и славненько. В конфиг сервера добавляю:

Код: Выделить всё

server 10.8.0.0 255.255.255.0
Стартуем, соединяемся. Цепляю к нему клиента под freebsd и клиента под linux. Клиент под фрей впринципе не интересен пока, за ним такая же подсеть, 192.168.0.0/24 что и за сервером, поэтому экспериментировать как бы не с чем. Вот чего он ему из настроек выдает:

Код: Выделить всё

tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
        inet 10.8.0.6 --> 10.8.0.5 netmask 0xffffffff
        Opened by PID 1202
[root@freegate /home/sst]# ping 10.8.0.1
PING 10.8.0.1 (10.8.0.1): 56 data bytes
64 bytes from 10.8.0.1: icmp_seq=0 ttl=64 time=32.260 ms
64 bytes from 10.8.0.1: icmp_seq=1 ttl=64 time=32.097 ms
^C
--- 10.8.0.1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 32.097/32.178/32.260/0.082 ms
[root@freegate /home/sst]# ping 10.8.0.6
PING 10.8.0.6 (10.8.0.6): 56 data bytes
64 bytes from 10.8.0.6: icmp_seq=0 ttl=64 time=65.049 ms
^C
--- 10.8.0.6 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max/stddev = 65.049/65.049/65.049/0.000 ms
[root@freegate /home/sst]# ping 10.8.0.5
PING 10.8.0.5 (10.8.0.5): 56 data bytes
^C
--- 10.8.0.5 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss
[root@freegate /home/sst]#
Т.е. выдал он ему адрес 10.8.0.6 Сам себя клиент пингует, 10.8.0.1 тоже пингует. 10.8.0.5 как и написанов отквоченном не пингует. Все круто.
Теперь линукс. Чего выдало:

Код: Выделить всё

tun0      Link encap:Point-to-Point Protocol
          inet addr:10.8.0.10  P-t-P:10.8.0.9  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:22 errors:0 dropped:0 overruns:0 frame:0
          TX packets:35 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:1848 (1.8 Kb)  TX bytes:2940 (2.8 Kb)

[root@promhimservice olga]# ping 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
64 bytes from 10.8.0.1: icmp_seq=1 ttl=64 time=28.4 ms

--- 10.8.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 28.460/28.460/28.460/0.000 ms
[root@promhimservice olga]# ping 10.8.0.10
PING 10.8.0.10 (10.8.0.10) 56(84) bytes of data.
64 bytes from 10.8.0.10: icmp_seq=1 ttl=64 time=0.071 ms

--- 10.8.0.10 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.071/0.071/0.071/0.000 ms
[root@promhimservice olga]# ping 10.8.0.9
PING 10.8.0.9 (10.8.0.9) 56(84) bytes of data.

--- 10.8.0.9 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
Т.е. адрес у него 10.8.0.10. Сервер пингует. Клиента на фре (10.8.0.6) тоже пингует. Тоже круто. За линуксом сеть 192.168.10.0/24 Значит можно маршрутизить.
Прописываю на сервере:
route add -net 192.168.10.0/24 10.8.0.10

Код: Выделить всё

Routing tables

Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            81.211.121.1.adsl- UGS         0   484377    rl0
10.8/24            10.8.0.2           UGS         1       45   tun0
10.8.0.2           10.8.0.1           UH          1        0   tun0
81.211.121/24      link#2             UC          0        0    rl0
81.211.121.1.adsl- 00:0f:a3:3e:32:51  UHLW        2        0    rl0   1121
localhost          localhost          UH          0        2    lo0
192.168.0          link#1             UC          0        0   ste0
notebk             00:0f:b0:94:3c:ff  UHLW        1        2   ste0    434
ts2003             00:18:f3:9e:40:da  UHLW        1   316689   ste0   1060
192.168.10         10.8.0.10          UGS         0       67   tun0
Теперь надо линукс:

Код: Выделить всё

[root@promhimservice olga]# /sbin/route add -net 192.168.0.0/24 gw 10.8.0.1
SIOCADDRT: Network is unreachable
[root@promhimservice olga]# netstat -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
10.8.0.9        *               255.255.255.255 UH        0 0          0 tun0
83.136.242.204  *               255.255.255.252 U         0 0          0 eth0
10.8.0.0        10.8.0.9        255.255.255.0   UG        0 0          0 tun0
192.168.10.0    *               255.255.255.0   U         0 0          0 eth1
169.254.0.0     *               255.255.0.0     U         0 0          0 eth1
127.0.0.0       *               255.0.0.0       U         0 0          0 lo
default         205.242.telrost 0.0.0.0         UG        0 0          0 eth0
[root@promhimservice olga]# ping 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
64 bytes from 10.8.0.1: icmp_seq=1 ttl=64 time=34.7 ms
64 bytes from 10.8.0.1: icmp_seq=2 ttl=64 time=24.7 ms
64 bytes from 10.8.0.1: icmp_seq=3 ttl=64 time=24.5 ms

--- 10.8.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2021ms
rtt min/avg/max/mdev = 24.519/28.006/34.707/4.741 ms
И почему она unreachable если адрес пингуется? Если прописать шлюзом 10.8.0.9, то нифига не работает. Самое странное: слушаю tcpdump -i tun0 на сервере и на линуксе.
Пингую с сервера линукс - и там и там вижу пинги. Пингую с сервера 192.168.10.1, на сервере вижу, что пинги в tun0 уходят, а на линуксе тишина. Куда оно девается то?
Вообщем продолжаю эксперимент. Но чувствую на ethernet-bridge меня уже не хватит =)

sst78rus
рядовой
Сообщения: 40
Зарегистрирован: 2006-07-18 10:39:55

Непрочитанное сообщение sst78rus » 2007-03-14 15:53:37

Продолжаю держать в курсе :)
С линухового клиента пингуется сеть за сервером. Ура.
С сервера сеть за линухом не пингуется. Пипец.

Вообщем вот чего на линухе:

Код: Выделить всё

tun0      Link encap:Point-to-Point Protocol
          inet addr:10.8.0.6  P-t-P:10.8.0.5  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:20 errors:0 dropped:0 overruns:0 frame:0
          TX packets:26 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:1548 (1.5 Kb)  TX bytes:1920 (1.8 Kb)

[root@promhimservice olga]# netstat -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
10.8.0.5        *               255.255.255.255 UH        0 0          0 tun0
83.136.242.204  *               255.255.255.252 U         0 0          0 eth0
10.8.0.0        10.8.0.5        255.255.255.0   UG        0 0          0 tun0
192.168.0.0     10.8.0.5        255.255.255.0   UG        0 0          0 tun0
192.168.10.0    *               255.255.255.0   U         0 0          0 eth1
169.254.0.0     *               255.255.0.0     U         0 0          0 eth1
127.0.0.0       *               255.0.0.0       U         0 0          0 lo
default         205.242.telrost 0.0.0.0         UG        0 0          0 eth0
[root@promhimservice olga]# ping 192.168.0.12
PING 192.168.0.12 (192.168.0.12) 56(84) bytes of data.
64 bytes from 192.168.0.12: icmp_seq=1 ttl=127 time=29.1 ms
64 bytes from 192.168.0.12: icmp_seq=2 ttl=127 time=25.5 ms
64 bytes from 192.168.0.12: icmp_seq=3 ttl=127 time=25.6 ms
64 bytes from 192.168.0.12: icmp_seq=4 ttl=127 time=25.3 ms
64 bytes from 192.168.0.12: icmp_seq=5 ttl=127 time=24.8 ms

--- 192.168.0.12 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4042ms
rtt min/avg/max/mdev = 24.844/26.117/29.163/1.561 ms
Т.е. шлюзом для 192.168.0.0/24 прописал "виртуальный порт vpn маршрутизатора" 10.8.0.5 и все пошло. Естественно это прямо со шлюза, в отправляемых пакетах стоит 10.8.0.6 Из сети за линухом не пингуется (наверное), т.к. обратного маршрута нет.

На сервере сейчас:

Код: Выделить всё

tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
        inet 10.8.0.1 --> 10.8.0.2 netmask 0xffffffff
        Opened by PID 83099
[root@bsdgate /var/log/openvpn]# netstat -r
Routing tables

Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            81.211.121.1.adsl- UGS         0   524867    rl0
10.8/24            10.8.0.2           UGS         0       25   tun0
10.8.0.2           10.8.0.1           UH          1        0   tun0
81.211.121/24      link#2             UC          0        0    rl0
81.211.121.1.adsl- 00:0f:a3:3e:32:51  UHLW        2        0    rl0   1124
localhost          localhost          UH          0        2    lo0
192.168.0          link#1             UC          0        0   ste0
Добавляю маршрут: route add -net 192.168.10.0/24 10.8.0.?
Вместо "?" пробовал по аналогии .2, .5, .6
Не работает. Т.е. маршрут-то оно добавляет, но сеть за линухом не пингуется и tcpdump на линухе ничего не показывает.
Между собой 10.8.0.1 и 10.8.0.6 взаимно пингуются.

sst78rus
рядовой
Сообщения: 40
Зарегистрирован: 2006-07-18 10:39:55

Непрочитанное сообщение sst78rus » 2007-03-15 10:27:00

Победил.
Внутри openvpn есть своя маршрутизация. Для того, чтобы с сервера видеть сеть клиента на для этого клиента прописать iroute в конфиге сервера.
Постараюсь теперь все в одну кучу собрать, чтоб типа статьи получилось.

sst78rus
рядовой
Сообщения: 40
Зарегистрирован: 2006-07-18 10:39:55

Непрочитанное сообщение sst78rus » 2007-03-22 17:08:46

Сделать статьей сил нет :roll: поэтому соберу просто тут в кучу все.
Значит по общей конфигурации.
Сервер на фре, один клиент на линухе, один на фре.
По установке на фре вопросов вообще нет, из портов все ставится само (Openvpn, openssl).

На линухе ставил с сорцов. При компиляции требует openssl и lzo. И то и другое скачал так же сорцами, собралось вроде без проблем. Однако при ./configure самого openvpn все равно не находли ssl
Вылечилось указанием мест где все лежит:

Код: Выделить всё

./configure -with-ssl-headers=/usr/local/ssl/include/ --with-ssl-lib=/usr/local/ssl/lib/
Все, на этом месте все скомпилилось и установилось.
Далее по инструкции с сайта openvpn сделал ключи для сервера и клиентов. Там тоже сложного ничего - в vars правим переменные, потом source vars, если первый раз ключи делаем clean-all, и потом уже добавляем ключи.

Конфиг для сервера:

Код: Выделить всё

dev tun
#указываем тип интерфейса. Чем отличается tun от tap описано на сайте Openvpn.

server 10.8.0.0 255.255.255.0
#подсеть которая будет внутри впн-канала. 

ca /usr/local/etc/openvpn/keys/ca.crt
cert /usr/local/etc/openvpn/keys/pavantage.crt
key /usr/local/etc/openvpn/keys/pavantage.key
dh /usr/local/etc/openvpn/keys/dh1024.pem

#местоположение ключей

tls-server
tls-auth /usr/local/etc/openvpn/keys/static.key 0
# это вроде защита от атаки man in the middle, но как именно это работает не #разбирался. В конче строки стоит ноль для сервера и 1 для клиентов.

client-to-client
#разрешает клиентам видеть друг друга. 

client-config-dir /usr/local/etc/openvpn/ccd
#директория с конфигами клиентов. Т.е. для каждого клиента можно свой конфиг 

route 192.168.10.0 255.255.255.0
route 192.168.143.0 255.255.255.0
#настройка маршрутизации на сервере. Обозначает что пакеты для этих сетей будут #уходить внутрь впн. Куда девать их дальше указывается в клиентских конфигах

ifconfig-pool-persist /usr/local/etc/openvpn/ccd/clients-ip.vpn
#файл в котором хранить соответствие клиента и ip, чтоб после переподключения #клиенты получили теже адреса

cipher BF-CBC
#алгоритм шифрования канал

comp-lzo
#алгоритм сжатия трафика

persist-key
persist-tun

#daemon
#если раскоментировать, ключ --deamon при запуске можно опустить

user nobody
group nobody

log /var/log/openvpn/openvpn.log
status /var/log/openvpn/openvpn-status.log

verb 3
#"подробность" логов
Запускается все это

Код: Выделить всё

openvpn --daemon --config /usr/local/etc/openvpn/serv.conf
По умолчанию протокол UDP, порт на сервере 1194. Я в фаерволе открыл входящие соединения на этот порт только для IP клиентов. Чтоб всякая фигня не ломилась.

Клиентсткий конфиг:

Код: Выделить всё

client
dev tun
remote 91.711.521.16

ca /usr/local/etc/openvpn/keys/ca.crt
cert /usr/local/etc/openvpn/keys/tvoetv.crt
key /usr/local/etc/openvpn/keys/tvoetv.key

tls-auth /usr/local/etc/openvpn/keys/static.key 1

cipher BF-CBC

comp-lzo

persist-key
persist-tun

user nobody
group nobody

log /var/log/openvpn/openvpn.log
status /var/log/openvpn/openvpn-status.log
Тут и коментировать нечего.
Для того, чтобы у клиентов автоматом прописалась маршрутизация и была доступна сеть за ними надо на сервер в пути указанном client-config-dir создать файл с именем клиента:

Код: Выделить всё

iroute 192.168.143.0 255.255.255.0
#это подсеть за клиентом. Если ее не указать, то даже прописав маршруты везде руками #ничего не заработает. В нутри openvpn своя маршрутизация и эта опция как раз и #разрешает прохождение пакетов, и указывает, за каким именно из клиентов находится #данная подсеть

push "route 192.168.10.0 255.255.255.0"
push "route 192.168.0.0 255.255.255.0"
#это маршруты которые пропишутся на этом клиенте.

Был еще косяк на клиентах, не хотел подниматься интерфейс tun0. Т.е. все вроде запускается, но интерфейса нет. Вылечилось однократным запуском клиента с конфигом:

Код: Выделить всё

dev tun
ifconfig 10.8.0.1 10.8.0.2
secret /usr/local/etc/openvpn/keys/static.key

user nobody
group nobody

log /var/log/openvpn/openvpn.log
status /var/log/openvpn/openvpn-status.log 
Интерфейс появляется. Поле этого прибил процесс openvpn и запустил его уже с клиентским конфигом. Все заработало.

Вообщем ничего особо сложного, но немного помучался. Надеюсь кому-нибудь полезно будет.