arch搭建openvpn服务端(二层路由和三层路由)
archlinux搭建openvpn服务端
配置网络
这里使用systemd-network
管理网络(尝试过NetworkManager
,失败了)
配置网络接口
已有的网口
设置进桥接
1 2 3 4 5 6 7
| /etc/systemd/network/20-wired.network ---------- [Match] Name=ens34
[Network] Bridge=br0
|
给openvpn的tap接口
1 2 3 4 5 6 7 8 9
| /etc/systemd/network/30-tap0.netdev ---------- [NetDev] Name=tap0 Kind=tap
[Tap] User=nobody Group=nobody
|
桥接接口
1 2 3 4 5
| /etc/systemd/network/35-br0.netdev ---------- [NetDev] Name=br0 Kind=bridge
|
配置网络
tap接口进桥接
1 2 3 4 5 6 7
| /etc/systemd/network/30-tap0.network ---------- [Match] Name=tap0
[Network] Bridge=br0
|
桥接接口设置网络连接
我这里设置ipv4设置成静态ip,网络指向旁路由192.168.1.50
,你可以根据自己的具体网络环境设置
ipv6设置成dhcpv6获取
1 2 3 4 5 6 7 8 9 10
| /etc/systemd/network/35-br0.network ---------- [Match] Name=br0
[Network] Address=192.168.1.3/24 Gateway=192.168.1.50 DNS=192.168.1.50 DHCP=ipv6
|
切换到新的网络配置
1
| sudo systemctl restart systemd-networkd.service
|
设置ddns
这里使用godns作为ddns的程序,你可以根据自己的喜好进行选择请先设置好archlinuxcn源来安装yay或者paru
安装godns
配置godns
我的域名在Cloudflare,所以我的配置大致如下你需要根据自己的实际情况来进行配置,请参考godns的项目readme
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| /home/ayaya/godns_config.json ---------- { "run_once": true, "provider": "Cloudflare", "login_token": "", "domains": [ { "domain_name": "", "sub_domains": [""] } ], "resolver": "192.168.1.50", "ipv6_urls": [ "http://api-ipv6.ip.sb", "http://api6.ipify.org", "http://ip1.dynupdate6.no-ip.com" ], "ip_type": "IPv6", "interval": 300, "notify": { "mail": { "enabled": true, "smtp_server": "", "smtp_username": "", "smtp_password": "", "smtp_port": 587, "send_from": "", "send_to": "" } } }
|
设置定时运行
我这里使用systemd-timer
运行用的服务
1 2 3 4 5 6
| /usr/lib/systemd/system/godns.service ---------- [Unit]
[Service] ExecStart=/bin/godns -c /home/ayaya/godns_config.json
|
定时触发服务的服务
1 2 3 4 5 6 7 8 9 10 11 12 13
| /usr/lib/systemd/system/godns.timer ---------- [Unit]
[Timer] OnBootSec=5m OnCalendar=*-*-* 1:00:00 OnUnitActiveSec=5m OnUnitInactiveSec=5m Unit=godns.service
[Install] WantedBy=multi-user.target
|
启动服务
1 2
| sudo systemctl enable --now godns.service sudo systemctl enable --now godns.timer
|
获取openvpn所需的的证书
安装easy-rsa
生成证书
参考Easy-RSA - ArchWiki (archlinux.org)
首先先创建一个文件夹,用于存放证书
1 2
| sudo mkdir /etc/openvpn/openvpn证书 cd /etc/openvpn/openvpn证书
|
生成ca证书
1 2
| sudo easyrsa init-pki sudo easyrsa build-ca nopass
|
生成服务器证书
这里设置服务器名称为arch,你可以自己选择其他名称
1
| sudo easyrsa build-server-full arch nopass
|
生成Diffie-Hellman (DH) 参数文件
生成客户端证书
这里我只生成一个,名称设置为surface,你可以根据自己的情况生成一个或多个证书
1
| sudo easyrsa build-client-full surface nopass
|
设置openvpn服务端
l2 vpn配置
设置ip分配
这里我选择使用静态分配地址
创建文件夹
1 2
| sudo mkdir /etc/openvpn/ccd-tap sudo touch /etc/openvpn/ccd-tap/surface
|
分配ip
1 2 3
| /etc/openvpn/ccd-tap/surface ---------- ifconfig-push 192.168.1.4 255.255.255.0
|
openvpn的配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| /etc/openvpn/server/archtap.conf ---------- port 10001 proto udp6 dev tap0 server-bridge
ca /etc/openvpn/openvpn证书/pki/ca.crt cert /etc/openvpn/openvpn证书/pki/issued/arch.crt key /etc/openvpn/openvpn证书/pki/private/arch.key dh /etc/openvpn/openvpn证书/pki/dh.pem
client-config-dir /etc/openvpn/ccd-tap
push "route 192.168.1.0 255.255.255.0 192.168.1.50" push "dhcp-option DNS 192.168.1.50"
topology subnet client-to-client
keepalive 10 120 comp-lzo user nobody group nobody persist-key persist-tun verb 3
|
启动openvpn服务
1
| sudo systemctl enable --now openvpn-server@archtun.service
|
l3 vpn
设置ip分配
这里我选择使用静态分配地址
创建文件夹
1 2
| sudo mkdir /etc/openvpn/ccd-tun sudo touch /etc/openvpn/ccd-tun/surface
|
分配ip,这里给openvpn的客户端分配了192.168.12.0
网段
1 2 3
| /etc/openvpn/ccd-tun/surface ---------- ifconfig-push 192.168.12.4 255.255.255.0
|
openvpn的配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| /etc/openvpn/server/archtun.conf ---------- port 10002 proto udp6 dev tun0
ca /etc/openvpn/openvpn证书/pki/ca.crt cert /etc/openvpn/openvpn证书/pki/issued/arch.crt key /etc/openvpn/openvpn证书/pki/private/arch.key dh /etc/openvpn/openvpn证书/pki/dh.pem
topology subnet client-to-client
push "redirect-gateway local def1" push "route 192.168.1.0 255.255.255.0" push "dhcp-option DNS 192.168.1.50"
client-config-dir /etc/openvpn/ccd-tun
server 192.168.12.0 255.255.255.0 ifconfig-pool-persist ipp.txt keepalive 10 120 comp-lzo user nobody group nobody persist-key persist-tun verb 3
|
其中push "redirect-gateway local def1"
这行配置是为了把客户端的全部网络代理到服务端,你可以根据自己的需要选择是否使用
设置防火墙以允许客户端访问同网段的其他设备sudo iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -o br0 -j MASQUERADE
启动openvpn服务
1
| sudo systemctl enable --now openvpn-server@archtun.service
|
编写openvpn客户端配置
l2 vpn
注意,只有linux和windows支持l2 vpn
windows客户端需要选择openvpn gui而不是openvpn connect
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| surface-tap.ovpn ---------- client remote <ddns绑定的域名> 10001 udp dev tap0 pull
nobind persist-key persist-tun verb 2 <ca>
#把/etc/openvpn/openvpn证书/pki/ca.crt的内容放这里
</ca> <cert>
#把/etc/openvpn/openvpn证书/pki/issued/surface.crt的内容放这里
</cert> <key>
#把/etc/openvpn/openvpn证书/pki/private/surface.key的内容放这里
</key> comp-lzo
|
l3 vpn
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| surface-tun.ovpn ---------- client remote <ddns绑定的域名> 10001 udp dev tun0 pull
nobind persist-key persist-tun verb 2 <ca>
#把/etc/openvpn/openvpn证书/pki/ca.crt的内容放这里
</ca> <cert>
#把/etc/openvpn/openvpn证书/pki/issued/surface.crt的内容放这里
</cert> <key>
#把/etc/openvpn/openvpn证书/pki/private/surface.key的内容放这里
</key> comp-lzo
|