osnosn

  博客园 :: 首页 :: 博问 :: 闪存 :: :: 联系 :: 订阅 订阅 :: 管理 ::

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页面配置。

  • 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可用,就用。
  • 设置input规则
  • 防火墙-> 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

设置防火墙,允许openConnect客户端访问Lan/wan。

(客户端连接后,客户机的访问限制。)

  • ocserv 没有加入 firewall ZONE 的设置。所以只能手动添加转发规则。
  • 检查 sysctl net.ipv4.ip_forward 应该显示 = 1
    op中 ip_forward 默认就是 1。
  • 设置forward规则
    防火墙-> Traffic Rules
    • 添加
      协议: Any
      Source zone: Any zone(forward)
      Source address: ocserv 的IP段,比如 192.168.100.0/24
      Destination zone: WAN
      Destination address: 留空
      Action: accept
      Restrict to address family: IPv4 only (按需)
  • op默认有一条规则,对于已经建立的连接,返回的数据包是允许的。
    会自动匹配,返回到目标地址192.168.100.0/24的转发。
    所以,不需要专门配置,返回数据包的规则。

重新生成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,
    • 支持多种认证方式。
      ## 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认证
      
      deb11 默认是 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 打开内核转发。
  • 检查防火墙规则,允许转发,
    # 如果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
    
    至此,oc客户端(192.168.100.x)发出的数据包,就能转发出去。但因为对方没有对应的路由规则,返回包,回不来 (表现为网络不通)。
  • 配置 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防火墙规则

  • 使用 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。
    所以只能用,
    iptables -I FORWARD -s 192.168.100.0/24 -j ACCEPT
    iptables -I FORWARD -d 192.168.100.0/24 -j ACCEPT
    
    另建nft chain,总是无效,
    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 规则,

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  #重启
    

参考

----end----


转载注明来源: 本文链接 https://www.cnblogs.com/osnosn/p/16923645.html
来自 osnosn的博客 https://www.cnblogs.com/osnosn/ .


posted on 2022-11-24 22:41  osnosn  阅读(1215)  评论(0编辑  收藏  举报