笔记
1、例题
1、画iptables的三个模型图
2、只允许windows连接本机的iptables规则
iptables -t filter -A INPUT -p tcp -s 192.168.15.1 --dport 22 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
3、只允许192.168.15.0网段的IP连接本机,用两种方式实现。
iptables -t filter -A INPUT -p tcp -m iprange --src-range 192.168.15.1-192.168.15.254 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
iptables -t filter -A INPUT -p tcp -i eth0 --dport 22 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
4、要求本机流出的数据中包含“元旦快乐”
iptables -t filter -A OUTPUT -p tcp --dport 80 -m string --string "元旦快乐" --algo kmp -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 80 -j DROP
5、要求每天的九点到17点之间可以正常访问
iptables -t filetr -A INPUT -p tcp -m time --timestart 1:00 --timestop 9:00 -j ACCEPT
iptables -t filter -A INPUT -p tcp -j DROP
2、昨日问题
1、要求只允许windows通过ssh连接192.168.15.81,其他的拒绝
iptables -t filter -A INPUT -p TCP -s 192.168.15.1 -d 192.168.15.81 --dport 22 -j ACCEPT
iptables -t filter -A INPUT -p TCP --dport 22 -j DROP
3、今日内容
1、vpn
4、vpn的简介
VPN(全称:Virtual Private Network)虚拟专用网络,是依靠ISP和其他的NSP,在公共网络中建立专用的数据通信的网络技术,可以为企业之间或者个人与企业之间提供安全的数据传输隧道服务。在VPN中任意两点之间的链接并没有传统专网所需的端到端的物理链路,而是利用公共网络资源动态组成的,可以理解为通过私有的隧道技术在公共数据网络上模拟出来的和专网有同样功能的点到点的专线技术,所谓虚拟是指不需要去拉实际的长途物理线路,而是借用了公共Internet网络实现的。
5、VPN的作用
VPN的功能是帮助公司里的远程用户(出差,在家)、公司的分支机构、商业合作伙伴及供应商等公司和自己的公司内部网络之间建立可信的安全连接或者是局域网连接,确保数据的加密安全传输和业务访问,对于运维工程师来说,还可以连接不同的机房为局域网来处理相关事宜。
6、VPN的种类
### PPTP
点对点协议(PPTP)是由包括微软和3Com等公司组成的PPTP论坛开发的一种点对点隧道协议,基于拨号使用的PPP协议,使用PAP或CHAP之类的加密算法,或者使用Microsoft的点对点加密算法MPPE。其通过跨越基于TCP/IP的数据网络创建VPN实现了从远程客户端到专用企业服务器之间数据的安全传输。PPTP支持通过公共网络建立按需的、多协议的、虚拟专用网络。PPTP允许加密IP通讯,然后在跨域公司IP网络或公共IP网络发送的IP头中对其进行封装。典型的Linux平台的开源软件为PPTP。PPTP属于点对点应用,比较合适远程的企业用户拨号到企业进行办公等应用。
### L2TP
L2TP第2等隧道协议(L2TP)是IETF基于L2F(Cisco的第二层转发协议)开的的PPTP的后续版本。是一种工业标准Internet隧道协议,其可以为跨越面向数据包的媒体发送点到点的协议(PPP)框架提供封装。PPTP和L2TP都使用PPP协议对数据进行封装,然后添加附加爆头用于数据在互联网上传输。PPTP只能在两端点间建立单一隧道。L2TP支持在两端点间使用多隧道,用户可以针对不同的服务质量创建不同隧道。L2TP可以提供隧道验证,而PPTP则不支持隧道验证。但是当L2TP或PPTP与IPSEC共同使用时,可以由IPSEC提供隧道验证,不需要在第二层协议上验证隧道使用L2TP。PPTP要求互联网络为IP网络。L2TP只要求隧道媒介提供面向数据包的点对点的链接,L2TP可以在IP(使用UDP),祯中继续永久虚拟电路(PVCs),X.25虚拟电路(VCs)或ATM VCS网络上使用。
### IPSec
IP安全协议实际上是一套协议包而不是一个单独的协议。从1995年开始IPSec的研究以来,IETF IPSec工作组在它的主页上发布了几十个Internet草案文献和12个RFC文件。其中比较重要的有RFC2409IKE(互联网秘钥交换)、RFC2401 IPSec协议、RFC2402AH验证包头、RFC2406ESP加密数据等文件。
IPSec隧道模式隧道是封装、路由与解封的整个过程。隧道将原始数据包隐藏(或封装)在新的数据包内部。该新的数据包可能会有新的寻址与路由信息,从而使其能够通过网络传输。隧道与数据保密性结合使用时,在网络上窃听通讯的人将无法获取原始数据包数据(以及原始的源和目标)。封装的数据包到达目的地后,会删除封装,原始数据包头用于将数据包路由到最终目的地。
隧道本身是封装数据经过的逻辑数据路径,对原始的源和目的的端,隧道是不可见的,而只能看到网络路径中的点对点连接。将隧道和数据保密性结合使用时,可用于提供VPN。
封装的数据包在网络中的隧道内部传输。再次示例中,该网络是Internet。网关可以是外部Internet与专用网络之间的周边网关。周界网关可以是路由器、防火墙、代理服务器或其他安全网关。另外,在专用网络内部可以使用两个网关来保护网络中不信任的通讯。
当以隧道模式使用IPSEC时,其只为IP通讯提供封装。使用IPSec隧道模式主要是为了与其他不支持IPSec上的L2TP或PPTP VPN隧道技术的路由器、网关或终端系统之间的相互操作。
### SSL VPN
SSL协议提供了数据私密性、端点验证、信息完整性等特性。SSL协议由许多子协议组成,其中两个主要的子协议是握手协议和记录协议。握手协议允许服务器和客户端在应用协议传输第一个数据字节以前,彼此确认,协商一种加密算法和密码钥匙。在数据传输期间,记录协议利用握手协议生成的秘钥加密和解密后来交换的数据。
SSL独立应用,因此任何一个应用程序都可以享受它的安全性而不必理会执行细节。SSL置身于网络结构体系的传输层和应用层之间。此外,SSL本身就被几乎所有的WEB浏览器支持。这意味着客户端不需要为了支持SSL链接安装额外的软件。这两个特征就是SSL能应用于VPN的关键点。
典型的SSL VPN应用:Open VPN,这是一个比较好的开源软件。Open VPN允许参与建立VPN的单点使用预设的私钥,第三方证书,或者用户名/密码来进行身份验证。它大量使用了OpenSSL加密库,以及SSLv3/TLSv1协议。OpenVPN能在Linux、xBSD、MacOS 上运行。它并不是一个基于Web的VPN软件,也不能与IPSec及其他VPN软件包兼容。
7、介绍OpenVPN
官网:https://openvpn.net/
专用网:专用网就是在两个网络(例如,北京和广州)之间架设一条专用线路,但是它并不需要真正地去铺设光缆之类的物理线路。虽然没有亲自去铺设,但是需要向电信运营商申请租用专线,在这条专用的线路上只传输自己的信息,所以安全稳定,同时也费用高昂
在众多的VPN产品中,OpenVPN无疑是Linux下开源VPN的经典产品,他提供了良好的访问性能和友好的用户GUI。
Open VPN是一个用于创建虚拟专用网络加密通道的软件包,最早由James Yonan编写。一个实现VPN的开源软件,OpenVPN 是一个健壮的、高度灵活的 VPN 守护进程。它支持 SSL/TLS 安全、Ethernet bridging、经由代理的 TCP 或 UDP 隧道和 NAT。另外,它也支持动态 IP 地址以及DHCP,可伸缩性足以支持数百或数千用户的使用场景,同时可移植至大多数主流操作系统平台上。
8、部署OpenVPN
OpenVPN 分为客户端和服务端
1、服务端
# 安装openvpn和证书工具
[root@m01 ~]# yum -y install openvpn easy-rsa
# 生成服务器配置文件
[root@m01 ~]# cp /usr/share/doc/openvpn-2.4.11/sample/sample-config-files/server.conf /etc/openvpn/
# 准备证书签发相关文件
[root@m01 ~]# cp -r /usr/share/easy-rsa/ /etc/openvpn/easy-rsa-server
# 准备签发证书相关变量的配置文件
[root@m01 ~]# cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa-server/3/vars
# 初始化PKI生成PKI相关目录和文件
[root@m01 3]# cd /etc/openvpn/easy-rsa-server/3
# 初始化数据,在当前目录下生成pki目录及相关文件
[root@m01 3]# ./easyrsa init-pki
# 创建CA机构
[root@m01 3]# ./easyrsa build-ca nopass
# 验证CA证书
[root@m01 3]# openssl x509 -in pki/ca.crt -noout -text
# 创建服务端证书申请
[root@m01 3]# ./easyrsa gen-req server nopass
# 创建证书
[root@m01 3]# ./easyrsa sign server server
# 验证证书
[root@m01 3]#diff pki/certs_by_serial/A25E3EA5278F84C245261AAF83AF683E.pem pki/issued/server.crt
2、创建 Diffie-Hellman 密钥
方式一:
[root@m01 3]# ./easyrsa gen-dh
方式二:
[root@m01 3]# openssl dhparam -out /etc/openvpn/dh2048.pem 2048
9、客户端证书
[root@m01 3]# cp -r /usr/share/easy-rsa/ /etc/openvpn/easy-rsa-client
[root@m01 3]# cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa-client/3/vars
[root@m01 3]# cd /etc/openvpn/easy-rsa-client/3
# 初始化证书目录
[root@m01 3]# ./easyrsa init-pki
# 生成客户端证书
[root@m01 3]# ./easyrsa gen-req henry nopass
# 将客户端证书请求文件复制到CA的工作目录
[root@m01 3]# cd /etc/openvpn/easy-rsa-server/3
[root@m01 3]# ./easyrsa import-req /etc/openvpn/easy-rsa-client/3/pki/reqs/henry.req henry
# 签发客户端证书
[root@m01 3]# pwd
/etc/openvpn/easy-rsa-server/3
[root@m01 3]# ./easyrsa sign client henry
# 验证
[root@m01 3]# cat pki/index.txt
V 240401022739Z ADBFFB9F45E5CEF861E7F642BA6C447E unknown /CN=server
V 240401023724Z 47765AD8225E12A13FB1EEBAC769B999 unknown /CN=henry
[root@m01 3]# ll pki/certs_by_serial/
total 16
-rw------- 1 root root 4438 Dec 28 10:37 47765AD8225E12A13FB1EEBAC769B999.pem
-rw------- 1 root root 4552 Dec 28 10:27 ADBFFB9F45E5CEF861E7F642BA6C447E.pem
10、创建链接配置文件
1、修改openvpn配置文件
[root@m01 3]# vim /etc/openvpn/server.conf
port 1194
proto tcp
dev tun
ca /etc/openvpn/certs/ca.crt
cert /etc/openvpn/certs/server.crt
key /etc/openvpn/certs/server.key
dh /etc/openvpn/certs/dh.pem
server 10.8.0.0 255.255.255.0
push "route 172.16.1.0 255.255.255.0"
keepalive 10 120
cipher AES-256-CBC
compress lz4-v2
push "compress lz4-v2"
max-clients 2048
user openvpn
group openvpn
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 3
mute 20
# 创建日志文件目录
[root@m01 3]# mkdir -p /var/log/openvpn
# 创建权限
[root@m01 ~]# chown openvpn.openvpn /var/log/openvpn
# 创建存放证书目录
[root@m01 ~]# mkdir -p /etc/openvpn/certs
# 复制证书
[root@m01 ~]# cp /etc/openvpn/easy-rsa-server/3/pki/dh.pem /etc/openvpn/certs/
[root@m01 ~]# cp /etc/openvpn/easy-rsa-server/3/pki/ca.crt /etc/openvpn/certs/
[root@m01 ~]# cp /etc/openvpn/easy-rsa-server/3/pki/private/server.key /etc/openvpn/certs/
[root@m01 ~]# cp /etc/openvpn/easy-rsa-server/3/pki/issued/server.crt /etc/openvpn/certs/
[root@m01 ~]# ll /etc/openvpn/certs/
total 20
-rw------- 1 root root 1172 Dec 28 10:54 ca.crt
-rw------- 1 root root 424 Dec 28 10:54 dh.pem
-rw------- 1 root root 4552 Dec 28 10:54 server.crt
-rw------- 1 root root 1704 Dec 28 10:54 server.key
2、启动OpenVPN
# 开启系统内核网络转发功能
[root@m01 ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
[root@m01 ~]# sysctl -p
# 安装防火墙
[root@m01 ~]# yum install iptables-services -y
[root@m01 ~]# systemctl disable --now firewalld
[root@m01 ~]# systemctl start iptables
[root@m01 ~]# iptables -F
[root@m01 ~]# iptables -F -t nat
# 添加iptables规则
[root@m01 ~]# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE
# 永久保存Iptables规则
[root@m01 ~]# service iptables save
# 启动OpenVPN
[root@m01 ~]# systemctl enable --now openvpn@server
3、创建链接文件
[root@m01 ~]# mkdir -p /etc/openvpn/client/henry/
# 准备证书
[root@m01 henry]# cp /etc/openvpn/easy-rsa-server/3/pki/ca.crt /etc/openvpn/client/henry/
[root@m01 henry]# cp /etc/openvpn/easy-rsa-server/3/pki/issued/henry.crt /etc/openvpn/client/henry/
[root@m01 henry]# cp /etc/openvpn/easy-rsa-client/3/pki/private/henry.key /etc/openvpn/client/henry/
# 准备链接文件
[root@m01 ~]# vim /etc/openvpn/client/henry/client.ovpn
client
dev tun
proto tcp
remote 192.168.15.81 1194
resolv-retry infinite
nobind
ca ca.crt
cert henry.crt
key henry.key
remote-cert-tls server
cipher AES-256-CBC
verb 3
compress lz4-v2
附录:
#server.conf文件中以#或;开头的行都为注释
[root@instance-gvpb80ao ~]# grep -Ev "^#|^$" /etc/openvpn/server.conf
;local a.b.c.d #本机监听IP,默认为本机所有IP
port 1194 #端口
;proto tcp #协议,生产推荐使用TCP
proto udp #默认协议
;dev tap #创建一个以太网隧道,以太网使用tap,一个tap设备允许完整的以太网帧通过Openvpn隧道,可提供非ip协议的支持,比如IPX协议和AppleTalk协议,tap等同于一个以太网设备,它操作第二层数据包如以太网数据帧。
dev tun #创建一个路由IP隧道,生产推存使用tun.互联网使用tun,一个tun设备大多时候,被用于基于IP协议的通讯。tun模拟了网络层设备,操作第三层数据包比如IP数据封包。
;dev-node MyTap #TAP-Win32适配器。非windows不需要配置
ca ca.crt #ca证书文件
cert server.crt #服务器证书文件
key server.key #服务器私钥文件
dh dh2048.pem #dh参数文件
;topology subnet
server 10.8.0.0 255.255.255.0 #客户端连接后分配IP的地址池,服务器默认会占用第一个IP 10.8.0.1将做为客户端的网关
ifconfig-pool-persist ipp.txt #为客户端分配固定IP,不需要配置,建议注释
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100 #配置网桥模式,不需要配置,建议注释
;server-bridge
;push "route 192.168.10.0 255.255.255.0" #给客户端生成的到达服务器后面网段的静态路由,下一跳为openvpn服务器的10.8.0.1
;push "route 192.168.20.0 255.255.255.0" #推送路由信息到客户端,以允许客户端能够连接到服务器背后的其它私有子网
;client-config-dir ccd #为指定的客户端添加路由,此路由通常是客户端后面的内网网段而不是服务端的,也不需要设置
;route 192.168.40.128 255.255.255.248
;client-config-dir ccd
;route 10.9.0.0 255.255.255.252
;learn-address ./script #运行外部脚本,创建不同组的iptables规则,无需配置
;push "redirect-gateway def1 bypass-dhcp" #启用后,客户端所有流量都将通过VPN服务器,因此生产一般无需配置此项
;push "dhcp-option DNS 208.67.222.222" #推送DNS服务器,不需要配置
;push "dhcp-option DNS 208.67.220.220"
;client-to-client #允许不同的client直接通信,不安全,生产环境一般无需要配置
;duplicate-cn #多个用户共用一个证书,一般用于测试环境,生产环境都是一个用户一个证书,无需开启
keepalive 10 120 #设置服务端检测的间隔和超时时间,默认为每10秒ping一次,如果 120 秒没有回应则认为对方已经down
tls-auth ta.key 0 #访止DoS等攻击的安全增强配置,可以使用以下命令来生成:openvpn --
genkey --secret ta.key #服务器和每个客户端都需要拥有该密钥的一个拷贝。第二个参数在服务器端应该为’0’,在客户端应该为’1’
cipher AES-256-CBC #加密算法
;compress lz4-v2 #启用Openvpn2.4.X新版压缩算法
;push "compress lz4-v2" #推送客户端使用新版压缩算法,和下面的comp-lzo不要同时使用
;comp-lzo #旧户端兼容的压缩配置,需要客户端配置开启压缩,openvpn2.4.X等新版可以不用开启
;max-clients 100 #最大客户端数
;user nobody #运行openvpn服务的用户和组
;group nobody
persist-key #重启VPN服务时默认会重新读取key文件,开启此配置后保留使用第一次的key文件,生产环境无需开启
persist-tun #启用此配置后,当重启vpn服务时,一直保持tun或者tap设备是up的,否则会先down然后再up,生产环境无需开启
status openvpn-status.log #openVPN状态记录文件,每分钟会记录一次
;log openvpn.log #第一种日志记录方式,并指定日志路径,log会在openvpn启动的时候清空日志文件,不建议使用
;log-append openvpn.log #第二种日志记录方式,并指定日志路径,重启openvpn后在之前的日志后面追加新的日志,生产环境建议使用
verb 3 #设置日志级别,0-9,级别越高记录的内容越详细,0 表示静默运行,只记录致命错误,4 表示合理的常规用法,5 和 6 可以帮助调试连接错误。9 表示极度冗余,输出非常详细的日志信息
;mute 20 #相同类别的信息只有前20条会输出到日志文件中
explicit-exit-notify 1 #通知客户端,在服务端重启后自动重新连接,仅能用于udp模式,tcp模式不需要配置即可实现断开重新连接,且开启此项后tcp配置后将导致openvpn服务无法启动,所以tcp时必须不能开启此项