首页
友情链接
统计
关于我
更多
留言板
Search
1
多目标优化问题及两种常用解法
598 阅读
2
SNN & NoC仿真器收集
164 阅读
3
Windows常见问题记录
121 阅读
4
Leetcode刷题 - KMP算法
110 阅读
5
SNN映射论文阅读-SentryOS
95 阅读
未分类
论文笔记
linux
go学习
verilog
systemc
算法学习
latex
C++
Redis
登录
Search
标签搜索
redis
Lisheng Xie
累计撰写
31
篇文章
累计收到
6
条评论
首页
栏目
未分类
论文笔记
linux
go学习
verilog
systemc
算法学习
latex
C++
Redis
页面
友情链接
统计
关于我
留言板
搜索到
5
篇与
的结果
2024-05-11
Nginx禁止使用IP直接访问服务器上相应端口
起因我的服务器中部署了一个typecho博客和两个使用docker容器的服务,其中docker容器使用端口映射,将容器中的端口映射到宿主机上的端口实现访问。一次偶然机会发现服务器上的服务可以通过IP+端口的方式直接访问,如果有未备案的域名解析到我们服务器的IP,可能会导致云服务器厂商关停我们的服务造成一些问题。因此,我们需要禁止通过IP+端口直接访问服务。Nginx 配置这里的三个服务通过nginx进行转发,对不同server_name的请求会直接转发到对应的服务进程。因此,这里有限考虑使用nginx配置来禁止IP+端口的访问。服务器上主要开放了两个端口,80和443,分别用于HTTP和HTTPS请求,在实际进行相应配置时二者也有所不同。80 端口对于80端口,我们在nginx.conf中添加如下配置。具体原理在于,当根据listen无法得到最佳匹配时,nginx会使用请求中的Host值匹配server_name,匹配顺序可以参考这篇博客。IP+端口进行请求时匹配到下面的server配置,直接返回403错误信息。server { listen 80 default_server; server_name _; return 403; }443端口由于使用了HTTPS协议,因此还需要禁止通过IP+443端口的访问方式。具体参考了下面的博客:https://www.huixiangdou.cn/archives/nginx-jin-zhi-80-443-duan-kou具体来说,Nginx 上对于 SSL 服务器在不配置证书的时候会出现协议错误,哪怕端口上配置了其他网站也会报错。因此,我们需要随便生成一个证书进行配置,生成 SSL 证书可以使用这个网站https://myssl.com/create_test_cert.html。在nginx.conf中添加如下配置:server { listen 80 default; listen 443 default_server; #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则 #error_page 404/404.html; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/private.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; error_page 497 https://$host$request_uri; #SSL-END server_name _; return 403; }配置完成后重载 Nginx 配置。$ nginx -t $ nginx -s reloadDocker容器问题Docker容器通过端口映射实现服务的对外可用性,这里是通过-p host_port:container_port实现容器上的端口到宿主机上端口的映射。具体来说,以容器的80端口映射到宿主机的8080端口为例,docker容器运行时使用了-p 8080:80,Nginx中监听了80端口,并在对应域名访问时将请求转发到服务器的8080端口。location / { proxy_pass http://host_ip:8080; }但是,在根据上面的配置禁止了直接使用IP+80/443端口访问的方式后,发现host_ip:8080仍然能够访问到docker容器中的服务。查询相关资料修改了iptables路由表和sfw防火墙规则后,仍然无法解决问题。防火墙上没有打开端口,但仍然可以访问。最后通过查找资料发现是docker自身的原因,下面是docker官方的介绍:If you don't specify an IP address (i.e., -p 80:80 instead of -p 127.0.0.1:80:80) when publishing a container's ports, Docker publishes the port on all interfaces (address 0.0.0.0) by default. These ports are externally accessible. This also applies if you configured UFW to block this specific port, as Docker manages its own iptables rules. Read more大致意思是说docker容器中设置端口映射时如果没有指定宿主机IP,那么默认映射到0.0.0.0,即所有IP都可以访问。并且由于Docker镜像自行管理其路由表规则,设置宿主机防火墙也不起作用。知道原因后,我们只需要修稿docker容器的端口映射即可,对于正在运行的docker容器,修改方式参考如下博客,修改对应容器的/var/lib/docker/containers/{container_id}/hostconfig.json中的PostBindings->HostIp,HostIp设置为127.0.0.1即可。https://blog.csdn.net/km_bandits/article/details/135724252参考资料Nginx配置禁止IP访问80和443端口Nginx禁止未绑定域名或IP访问80和443端口实践小结docker端口映射后,外部可以直接通过宿主机未开启的端口访问到服务的问题?docker修改已运行容器的映射端口
2024年05月11日
18 阅读
0 评论
1 点赞
2023-04-16
Makefile使用学习
参考教程原文:https://makefiletutorial.com/ 中文翻译:https://makefiletutorial.vercel.appMakefile常用内容本文主要基于以上教程记录一些平时阅读Makefile可能会用到的信息。Makefile基础使用首先,Makefile用于帮助决定一个大型程序的哪些部分需要重新编译,如果有任何文件的依赖项发生改变,那么该文件将会重新编译。Makefile通常由一组规则组成,规则通常如下所示:target: prerequisites command command command target是文件名,以空格分隔,通常每个规则只有一个。 command通常是用于制作目标的一系列步骤,需要以制表符Tab而不是空格开头。 prerequisites也是文件名,称为依赖项,以空格分隔,在运行针对目标的命令之前,这些文件需要存在。 下面是一个Makefile的实例:blah: blah.o gcc blah.o -o blah # Runs third blah.o: blah.c gcc -c blah.c -o blah.o # Runs second # Typically blah.c would already exist, but I want to limit any additional required files blah.c: echo "int main() { return 0; }" > blah.c # Runs first 使用make时默认会执行第一个目标blah,或者可以指定目标进行生成make blah。上面的Makefile在执行make指令后按照一系列步骤进行调用: - make选择目标blah,因为第一个目标是默认目标 - blah需要blah.o,所以搜索blah.o目标 - blah.o需要blah.c,所以搜索blah.c目标 - blah.c没有依赖关系,所以echo命令运行 - 然后运行该gcc -c命令,因为所有blah.o依赖项都已完成 - gcc运行top命令,因为所有的blah依赖都跑完了 - 就是这样:blah是一个编译好的c程序Makefile使用文件系统时间戳来判断上次编译以来的先决条件是否发生了变化。例如,如果运行上面的Makefile后删除blah.c,那么三个目标都会被重新执行;如果只是编辑blah.c,那么只有前两个目标会被重新执行;如果只是通过touch blah.o更新blah.o的时间戳,那么只有第一个目标会被重新执行;如果不做任何更改,那么所有目标都不会被执行。需要注意的是,时间戳并不总是有效,例如,您可以修改一个文件,然后将该文件的修改时间戳更改为旧的时间戳。如果你这样做了,make会错误地猜测文件没有改变,因此可以被忽略。全部目标和多个目标如果有多个目标并希望所有目标都被执行,那么可以使用一个all目标,如下所示all: one two three one: touch one two: touch two three: touch three clean: rm -f one two three 当规则有多个目标时,将为每个目标都运行命令,如下所示,其中$@是包含目标名称的自动变量all: f1.o f2.o f1.o f2.o: echo $@ # Equivalent to: # f1.o: # echo f1.o # f2.o: # echo f2.o 自动变量和通配符*通配符在Makefile中*和%是通配符,但它们的含义完全不同。*在文件系统中搜索匹配的文件名。*使用时最好包装在wildcard函数中,如下所示:# Print out file information about every .c file print: $(wildcard *.c) ls -la $? *不可以直接用在变量定义中,当*没有匹配到文件时如果没有使用wildcard函数包装,会直接保持原样。thing_wrong := *.o # Don't do this! '*' will not get expanded thing_right := $(wildcard *.o) all: one two three four # Fails, because $(thing_wrong) is the string "*.o" one: $(thing_wrong) # Stays as *.o if there are no files that match this pattern :( two: *.o # Works as you would expect! In this case, it does nothing. three: $(thing_right) # Same as rule three four: $(wildcard *.o) %通配符%通配符通常在多种情况下使用: - 在"匹配"模式下,它匹配一个或多个字符,这种匹配称为stem。 - 在"替换"模式下,它使用匹配到的stem并在字符串中进行替换。 - %最常用于规则定义和某些特定函数中规则隐式规则 编译C程序:基于n.c生成n.o,使用命令$(CC) -c $(CPPFLAGS) $(CFLAGS) $^ -o $@。 编译C++程序,基于n.cc或n.cpp生成n.o,使用命令$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $^ -o $@。 链接单个目标文件:基于n.o生成n,使用命令$(CC) $(LDFLAGS) $^ $(LOADLIBES) $(LDLIBS) -o $@。 使用到的变量为 CC:编译C程序的程序;默认cc CXX:编译C++程序的程序;默认g++ CFLAGS: 给 C 编译器的额外标志 CXXFLAGS: 提供给 C++ 编译器的额外标志 CPPFLAGS: 提供给 C 预处理器的额外标志 LDFLAGS: 在编译器应该调用链接器时提供给编译器的额外标志 基于隐式规则可以编译C/C++程序而不用显式地告诉make怎么做。 TO DO后续有时间会添加关于更多规则以及变量与函数,还有命令的相关内容。
2023年04月16日
46 阅读
0 评论
0 点赞
2023-03-20
常用资源汇总
pythonpip国内镜像# 清华镜像源 https://pypi.tuna.tsinghua.edu.cn/simple # 豆瓣镜像源 http://pypi.douban.com/simple/ # 阿里云镜像源 http://mirrors.aliyun.com/pypi/simple/ # 中国科学技术大学镜像源 http://pypi.mirrors.ustc.edu.cn/simple/ 使用方法为pip install package_name -i 镜像源Ubuntu更换镜像源如果Ubuntu原始速度还可以的话建议不要换源,常用的有阿里云镜像、清华镜像和搜狐镜像,这里是我使用的镜像,北京外国语大学镜像。deb https://mirrors.bfsu.edu.cn/ubuntu/ focal main restricted universe multiverse # deb-src https://mirrors.bfsu.edu.cn/ubuntu/ focal main restricted universe multiverse deb https://mirrors.bfsu.edu.cn/ubuntu/ focal-updates main restricted universe multiverse # deb-src https://mirrors.bfsu.edu.cn/ubuntu/ focal-updates main restricted universe multiverse deb https://mirrors.bfsu.edu.cn/ubuntu/ focal-backports main restricted universe multiverse # deb-src https://mirrors.bfsu.edu.cn/ubuntu/ focal-backports main restricted universe multiverse deb https://mirrors.bfsu.edu.cn/ubuntu/ focal-security main restricted universe multiverse # deb-src https://mirrors.bfsu.edu.cn/ubuntu/ focal-security main restricted universe multiverse # 预发布软件源,不建议启用 # deb https://mirrors.bfsu.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse # deb-src https://mirrors.bfsu.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse Ubuntu换源的具体操作为cd /etc/apt # 将原来的源文件复制一份做备份 sudo cp sources.list sources.list.cpk sudo vim sources.list # 删除全部内容换成上面的镜像网址(具体操作为Esc->:%d->Enter->i进入插入模式->粘贴内容->Esc->:wq) # 保存退出后更新 sudo apt-get update sudo apt-get upgrade WSL2如何可视化窗口借助VcXsvr工具,具体使用方法可以参考网上的教程,如https://zhuanlan.zhihu.com/p/128507562。
2023年03月20日
28 阅读
0 评论
0 点赞
2023-01-18
Linux常用命令记录
Vimvim删除文件中的所有内容: ESC确保退出编辑模式,按下":"切换到命令模式然后输入%d并执行 vim删除单行内容:将光标移动到需要删除的行,ESC确保退出编辑模式,按两次d键。 vim删除多行内容:将光标移动到需要删除的第一行,ESC确保退出编辑模式。在dd命令前面加上要删除的行数。例如,如果要删除第4行以下的3行,请先移动至第四行,再按下3dd。 vim撤销&恢复:u是撤销刚才做的动作,ctrl+r 是恢复刚才撤销的动作。文件操作参考博客https://www.cnblogs.com/liaojie970/p/6746230.html文件复制命令格式:cp [-adfilprsu] 源文件(source) 目标文件(destination) cp [option] source1 source2 source3 ... directory 参数说明:-a:是指archive的意思,也说是指复制所有的目录 -d:若源文件为连接文件(link file),则复制连接文件属性而非文件本身 -f:强制(force),若有重复或其它疑问时,不会询问用户,而强制复制 -i:若目标文件(destination)已存在,在覆盖时会先询问是否真的操作 -l:建立硬连接(hard link)的连接文件,而非复制文件本身 -p:与文件的属性一起复制,而非使用默认属性 -r:递归复制,用于目录的复制操作 -s:复制成符号连接文件(symbolic link),即“快捷方式”文件 -u:若目标文件比源文件旧,更新目标文件 如将/test1目录下的file1复制到/test3目录,并将文件名改为file2,可输入以下命令:cp /test1/file1 /test3/file2 文件移动命令格式:mv [-fiv] source destination 参数说明:-f:force,强制直接移动而不询问 -i:若目标文件(destination)已经存在,就会询问是否覆盖 -u:若目标文件已经存在,且源文件比较新,才会更新 如将/test1目录下的file1移动到/test3 目录,并将文件名改为file2,可输入以下命令:mv /test1/file1 /test3/file2 文件删除命令格式:rm [fir] 文件或目录 参数说明:-f:强制删除 -i:交互模式,在删除前询问用户是否操作 -r:递归删除,常用在目录的删除 如删除/test目录下的file1文件,可以输入以下命令:rm -i /test/file1 Windows 常用命令PowerShell创建新文件夹和新文件mkdir 文件夹名称 new-item 文件名称.文件格式 -type file
2023年01月18日
18 阅读
2 评论
0 点赞
2023-01-16
云服务器软件安装
Docker安装(Ubuntu 20.04):参考知乎博客 1. 更新软件包索引,并且安装必要的依赖软件sudo apt update sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common 使用下面的 curl 导入源仓库的 GPG key: curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - 将 Docker APT 软件源添加到你的系统: sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" 安装Docker a. 安装最新版本的Docker sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io b. 安装指定版本的docker # 列出所有可用的docker版本 sudo apt update apt list -a docker-ce # 安装docker sudo apt install docker-ce=<VERSION> docker-ce-cli=<VERSION> containerd.io docker-compose 安装 参考链接:https://blog.csdn.net/qq_35995514/article/details/125468792 验证安装成功 sudo systemctl status docker docker container run hello-world Golang安装:参考腾讯云博客 1. 下载程序包 浏览Go官方下载页面,下载程序包并解压到/usr/local目录下。 2. 添加环境变量 将Go目录添加到$PATH环境变量下,可以添加到/etc/profile或者$HOME/.profile下,export PATH=$PATH:/usr/local/go/bin # 后续Go环境使用 export GOPATH=/home/ubuntu/go export GOBIN=$GOPATH/bin export GOPROXY=https://goproxy.io,direct 前者代表系统范围内安装,后者为当前用户安装,保存文件并激活source /etc/profile 验证安装 验证Go版本 go version
2023年01月16日
24 阅读
0 评论
0 点赞