openwrt-22.03_debian_centos_ocserv
转载注明来源: 本文链接 来自osnosn的博客,写于 2022-11-23.
前言
- 客户端:AnyConnect,由思科推出的客户端,目前已有支持Windows、Android、iOS、OS X、Ubuntu、WebOS等操作系统的版本;
- 也是基于SSL的加密连接。唯一的优点就是,openConnect的苹果客户端,叫 AnyConnect,国内市场就能免费装。
openwrt-21.02
- 网上有很多文章,自行搜索。
openwrt-22.03
防火墙使用的是fw4,即nftables。
安装配置
2022-11记录
安装 OpenConnect Server。
opkg update
opkg install ocserv luci-app-ocserv
服务器证书,安装后就自动生成了。
去web页面配置。
- (2022-11测)
- Server Settings -> Gerneal Settings
- Enable server: 勾上,启用服务
- User Authentication: plain
- Port: 默认 4443, (按需修改)
- Max clients: 8, (按需修改)
- Max same clients: 2, (按需修改)
- Dead peer detection time: 默认 180secs
- Predictable IPs: 默认勾上。
- Enable compression: 勾上,启用压缩
- Enable UDP: 默认勾上。
- AnyConnect client compatibility: 默认勾上。
- Enable proxy arp: 不勾。(如果勾上,IP段的配置需要深厚的知识)
- VPN IPv4-Network-Address: 192.168.100.1 设置IPv4, 建议和 lan不一样网段。
- VPN IPv4-Netmask: 255.255.255.0
- VPN IPv6-Network-Address: 留空
- DNS servers: 设置DNS server的IP。(推送给client用的)
- Routing table: 添加路由规则。(推送给client用的)
- netmask,建议写数字。比如 "255.255.255.0" 写为 24 。这样不容易出错。
- 如果想让客户端全局使用这个连接,只设置一个 0/0的缺省路由,IP:0, netmask:0,不要写 "0.0.0.0"
- Server Settings -> Edit Template,修改欢迎词。
banner = "Welcome to MyHost"
- User Settings
- 添加用户 (用户名,密码)
设置防火墙,允许wan口访问ocserv端口。
(让客户端可以连接ocserv服务。)
- 主用TCP,如果UDP可用,就用。
- 如果openwrt, 有LAN, 有WAN。设置input规则,(2022-11测)
- 防火墙-> Traffic Rules
- 添加
协议: TCP+UDP Source zone: WAN Source address: 留空 Source Port: 留空 Destination zone: Device (input) Destination address: 留空 Destination Port: 4443 (按需,多个端口空格隔开) Action: accept Restrict to address family: IPv4 only 或者 IPv4 and IPv6
- 添加
- 如果openwrt只有LAN, 无WAN (2024-09测)
因为LAN对于端口访问无限制,所以不用创建 Traffic Rules
设置防火墙,允许openConnect客户端访问Lan/wan。
(客户端连接后,客户机的访问限制。)
- ocserv 没有加入 firewall ZONE 的设置。所以只能手动添加转发规则。
- 检查
sysctl net.ipv4.ip_forward
应该显示 = 1
op中 ip_forward 默认就是 1。 所以不用管。 - 设置forward规则,(2022-11测)
防火墙-> Traffic Rules- 添加
协议: Any Source zone: Any zone(forward) Source address: ocserv 的IP段,比如 192.168.100.0/24 Destination zone: WAN 或 Any 选Any,一条规则涵盖所有出口。或者添加多条规则,分别(按需)设置为WAN,LAN,wg0, Destination address: 留空 Action: accept Restrict to address family: IPv4 only (按需)
- 添加
- op默认有一条规则,对于已经建立的连接,返回的数据包是允许的。
会自动匹配,返回到目标地址192.168.100.0/24的转发。
所以,不需要专门配置,返回数据包的规则。 - 如果op有WAN口,则已经有Masquerade规则。无需额外添加。(2022-11测)
- 如果op无WAN,有LAN,则需要手工添加IP伪装规则。(2024-09测)
防火墙-> NAT Rules- 添加
Name: 自己取名 Restrict address family: Automatic(默认)/ipv4/ipv6,选自动,或按需 Protocol: Any(默认) 或 按需 Outbound zone: LAN 如果还有其他出口需要IP伪装,则添加多条NAT规则,设定对应的Outbound zone Source address: ocserv 的IP段,比如 192.168.100.0/24 Destination address: Any Action: MASQUERADE (IP伪装) 其他选项卡的内容,全部用默认,不修改。
- 添加
重新生成ocserv 的证书
- 仅用于 Openwrt-22.03
- 如果删除
rm /etc/ocserv/*.pem
, 然后/etc/init.d/ocserv restart
,
所有证书,会重新生成一遍。不过, 除了有效时间变了,其他内容都没改变。 - 在目录
/etc/ocserv/pki/
有两个文件,修改一下。自定义证书内容(按需)。
比如加一行organization = "xx"
- 执行以下四行命令。重新生成证书,RSA证书,覆盖原来的。
=># certtool --bits 2048 --generate-privkey --outfile /etc/ocserv/ca-key.pem =># certtool --template /etc/ocserv/pki/ca.tmpl --generate-self-signed --load-privkey /etc/ocserv/ca-key.pem --outfile /etc/ocserv/ca.pem =># certtool --bits 2048 --generate-privkey --outfile /etc/ocserv/server-key.pem =># certtool --template /etc/ocserv/pki/server.tmpl --generate-certificate --load-privkey /etc/ocserv/server-key.pem --load-ca-certificate /etc/ocserv/ca.pem --load-ca-privkey /etc/ocserv/ca-key.pem --outfile /etc/ocserv/server-cert.pem
- 然后重启服务
/etc/init.d/ocserv restart
尝试用nginx反代到ocserv(失败)
- 认证部分,用到几个路径
/
,/auth
,/+CSCOT+/
,/CSCOSSLC/
,
可以成功反代。直到输入完 账号,密码。然后说证书不对。 - 把nginx的server证书,copy一份给 ocserv共用。
证书就对了,继续之后,握手连接失败。
发现进入了专用协议。没法反向代理了。 - 放弃。
Debian
2023-10记录
安装配置
- 使用的系统为,
debian-11 (bullseye).
debian-12 (bookworm). - 安装
apt install ocserv
- 卸载
apt purge ocserv; apt autoremove; 然后删除 /etc/ocserv/ 目录
- 卸载
- 装好,ocserv 默认就已经启动。deb-11
ocserv 默认启动,但启动失败,因为没配置证书。deb-12
配置文件在/etc/ocserv/ocserv.conf
- 默认设置
- 使用端口 tcp/443 和 udp/443,
- 支持多种认证方式。
deb11 默认是## auth directives. Available options: certificate, plain, pam, radius, gssapi. #auth = "pam" #用pam认证 #auth = "pam[gid-min=1000]" #使用系统用户 #auth = "plain[passwd=./sample.passwd,otp=./sample.otp]" #使用密码文件+ 一次性密码 auth = "plain[passwd=./sample.passwd]" #使用密码文件,用ocpasswd命令创建密码文件 #auth = "certificate" #使用证书认证 #auth = "radius[config=/etc/radiusclient/radiusclient.conf,groupconfig=true]" #使用radius认证
auth = "pam[gid-min=1000]"
deb12 默认是auth = "plain[passwd=/etc/ocserv/passwd]"
- IP, DNS, 路由。
默认ipv4-network = 192.168.1.0
默认dns = 192.168.1.1
默认route = 192.168.0.0/16
-
修改配置文件 /etc/ocserv/ocserv.conf
tcp-port = 443 #工作端口,默认443,按需更改 udp-port = 443 auth = "plain[passwd=/etc/ocserv/passwd.ocs]" #使用密码文件 #以下三行证书配置,是deb11 默认设置。 #以下三行证书配置,deb12, 默认 没有配置,所以启动失败。 server-cert = /etc/ssl/certs/ssl-cert-snakeoil.pem server-key = /etc/ssl/private/ssl-cert-snakeoil.key ca-cert = /etc/ssl/certs/ca-certificates.crt ipv4-network = 192.168.100.0 #分配给客户端的IP段 ipv4-netmask = 255.255.255.0 dns = 192.168.1.1 #推送给客户端的dns route = default #客户端设置默认网关,所有流量走这个连接 no-route = 192.168.2.0/24 #按需,客户端,这个网段的流量不走这个连接 banner = "Welcome MyHost" #按需。不写这行,认证后没有提示直接OK。
- 然后,创建密码文件,创建用户和密码,
ocpasswd -c /etc/ocserv/passwd.ocs usename
- 可以自己创建/申请 ca 和 server 证书,替换默认证书。
自己创建证书可以用 certtool命令,来自apt install gnutls-bin
包。
见上文 OpenWRT 的配置中,重新生成证书,RSA证书。
或见下文 CentOS8 的配置中,自己创建证书(自签名),ECC证书。 - 最后重启 ocserv 生效。
service ocserv restart
- 检查
net.ipv4.ip_forward = 1
打开内核转发。 - 检查防火墙规则,允许转发,
至此,oc客户端(192.168.100.x)发出的数据包,就能转发出去。但因为对方没有对应的路由规则,返回包,回不来 (表现为网络不通)。# 如果FORWARD 规则链的 policy accept, 有没有这两条规则都不影响转发。 # 如果FORWARD 规则链的 policy drop, 就必须添加这两条规则。 #使用 iptables iptables -I FORWARD -s 192.168.100.0/24 -j ACCEPT iptables -I FORWARD -d 192.168.100.0/24 -j ACCEPT #使用 nft (policy accept, 有没有这两条规则都不影响转发) #在chain xx{ type filter hook forward priority filter; policy drop(或accept); } 中,加入, ip daddr 192.168.100.0/24 counter accept ip saddr 192.168.100.0/24 counter accept #或者,用openwrt那样的两条规则,替换上面两条, ct state established,related accept ip saddr 192.168.100.0/24 counter accept
- 配置 IP伪装(MASQUERADE)。
如果,出口网卡是固定IP,用 SNAT规则,性能更好。
假设,你的出口网卡设备为 "eth0",使用 eth0 上的IP 做伪装。
即,配置NAT(网络地址转换)规则,把从192.168.100.x发出的数据包,转换为,以eth0的IP发出。#使用 iptables iptables -t nat -I POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE #使用 nft #在chain xx{ type nat hook postrouting priority srcnat; policy accept; }中,加入, oifname "eth0" ip saddr 192.168.100.0/24 counter masquerade
- 配置完成。oc客户端连上后,就可以从 eth0 向外访问了。
nft防火墙规则
- 特殊情况下(有docker)的FORWARD规则
- 使用 nft rule,如果有2个相同的 hook,policy分别是 accept和drop。
写入 policy accept 中的 accept rule,就不起作用了。必须要写入到 policy drop的 chain中。 - nft rule,如果多个相同的hook,policy 都是 accept,写入的 drop rule,好像也会有问题。
- 我测试的时候,debian上装了docker,docker生成了一堆规则(iptables)。
其中docker的 FORWARD chain 的 policy 是drop。
所以只能用,
另建nft chain,总是无效,iptables -I FORWARD -s 192.168.100.0/24 -j ACCEPT iptables -I FORWARD -d 192.168.100.0/24 -j ACCEPT
chain forward { #这里的规则总是匹配不到 type filter hook forward priority -5; ip daddr 192.168.100.0/24 counter accept ip saddr 192.168.100.0/24 counter accept }
- 这两条iptables 的 forward 规则,
- 使用 iptables.service 在开机时导入。(未测试)
- 使用 /etc/rc.local 写入。(未测试)
- 考虑在docker启动后,再插入。
参考【使用systemd将iptables规则在docker启动后自动导入】
pve的LXC container
- ocserv 需要使用 tun 设备。
- LXC 中的 debian,实际使用的是 pve的内核,无法加载kmod (tun.ko),所以没有 /dev/net/tun 设备。
LXC中,虽然能配置 ocserv,能运行。但客户端登陆时,因找不到 tun设备而连接失败。 - 放弃。
CentOS8
2023-10记录
安装配置
- 安装
yum install ocserv
- 卸载
yum remove ocserv; yum autoremove; 然后删除 /etc/ocserv/ 目录
- 卸载
- 装好,ocserv 默认没启动。也没激活。
配置文件在/etc/ocserv/ocserv.conf
- 修改
ocserv.conf
配置文件,tcp-port = 443 #工作端口,默认443 udp-port = 443 server-cert = /etc/pki/ocserv/public/server.crt server-key = /etc/pki/ocserv/private/server.key ca-cert = /etc/pki/ocserv/cacerts/ca.crt auth = "plain[passwd=/etc/ocserv/passwd.ocs]" #默认 auth ="pam" ipv4-network = 192.168.100.0/24 #默认没配置,分配给客户端的IP段 dns = 192.168.1.1 #默认没配置,推送给客户端的dns route = default #默认没配置,推送给客户端的route no-route = 192.168.2.0/24 #按需,推送给客户端的排除route banner = "Welcome MyHost" #按需
- 然后,创建密码文件,创建用户和密码,
ocpasswd -c /etc/ocserv/passwd.ocs usename
service ocserv start
直接启动。第一次启动,会自动执行 ocserv-genkey 生成所需的证书。- 如果对证书不满意,自己创建证书(自签名),ECC证书,用 certtool命令,来自
yum install gnutls-bin
包。cd /etc/pki/ocserv/ cat <<EOF > ca.tmpl #ca证书模板,按需修改前两行 cn = "Your CA name" organization = "Your fancy name" serial = 1 expiration_days = 3650 ca signing_key cert_signing_key crl_signing_key EOF certtool --generate-privkey --key-type ecdsa --bits 256 --outfile ca-key.pem #生成ca密钥 certtool --generate-self-signed --load-privkey ca-key.pem --template ca.tmpl --outfile ca-cert.pem #自签名ca证书 cat <<EOF > server.tmpl #服务证书模板,按需修改前两行 cn = "Your hostname or IP" organization = "Your fancy name" expiration_days = 3650 signing_key encryption_key tls_www_server EOF certtool --generate-privkey --key-type ecdsa --bits 256 --outfile server-key.pem #生成server密钥 certtool --generate-certificate --load-privkey server-key.pem --load-ca-certificate ca-cert.pem --load-ca-privkey ca-key.pem --template server.tmpl --outfile server-cert.pem #server证书 mv ca-key.pem private/ca.key #移到正确位置。如果没有,ocserv会自己重新生成 mv ca-cert.pem cacerts/ca.crt mv server-key.pem private/server.key #移到正确位置。如果没有,ocserv会自己重新生成 mv server-cert.pem public/server.crt
- 防火墙,开放ocserv端口。
firewall-cmd --zone=public --add-port=443/tcp firewall-cmd --zone=public --add-port=443/udp firewall-cmd --zone=public --add-port=443/tcp --permanent firewall-cmd --zone=public --add-port=443/udp --permanent
- 检查
net.ipv4.ip_forward = 1
打开内核转发。 - 检查防火墙规则,允许转发,
通常是允许的。可以不用配置。#可能用这个命令# firewall-cmd --zone <Zone Name> --add-forward #没测试
- 配置 IP伪装(MASQUERADE)。
firewall-cmd --list-all-zones #查看所有的zone,确定出口网卡在哪个zone firewall-cmd --zone public --add-masquerade #通常在public zone firewall-cmd --zone public --add-masquerade --permanent #系统重启也有效
- 激活服务,启动服务。
systemctl enable ocserv #激活 systemctl restart ocserv #重启
参考
- 【openconnect/ocserv】
- 【openconnect/recipes】
- 【ocserv-configuration-basic】
- 【Debian下搭建Ocserv(openconnect server),并启用证书验证】
- 【在Debian 10 Buster上设置OpenConnect VPN服务器(ocserv)】
- 【Debian下安装配置Ocserv搭建Cisco Anyconnect的开源服务端】
----end----
转载注明来源: 本文链接 https://www.cnblogs.com/osnosn/p/16923645.html
来自 osnosn的博客 https://www.cnblogs.com/osnosn/ .