1个苹果味的少年
type: channel
link: https://www.weiyixi.cn/
description: 来自一个非典型程序员
items: k8s集群本地安装体验
items: iptables防火墙
items: 关于 docker for windows 挂载mariadb 数据目录报错
items: docker-lnmp
items: 使用docker-compose搭建本地开发环境
items: 商品sku设置属性排列js处理
items: 爬取国外高校犯罪信息数据
items: PHP版的代码整洁之道
items: 命令行界面 (CLI)、终端 (Terminal)、Shell、TTY
items: 使用iptables设定特定端口连接数网速（万能方法）

k8s集群本地安装体验
type: item
date: 2020-03-15T14:49:00+08:00
description: 更多官方文档 https://kubernetes.io/zh/docs/tasks/administer-cluster/network-policy-provider/calico-network-policy/ https://www.kubernetes.org.cn/cronjob使用kubeadm 部署k8s集群ps: k8s 不能直接管理容器 最小单位为pod 需要借助docker前期准备1. 三台虚拟机 分别设置主机名 hostnamectl set-hostname master1 、worker1 、worker22. 网络修改 vi /etc/sysconfig/network-scripts/ifcfg-ens33 BOOTPROTO none/static IPADDR="192.168.199.128" 当前虚拟机ip PREFIX="24" GATWAY="192.168.199.2" 一般为当前网段的.2 DNS1="119.29.29.29" 重启网卡 systemctl restart network 3. 安全配置关闭firewalld selinux systemctl stop firewalld systemctl disable firewalld sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config 4. 时间同步 yum -y install ntpdate ntpdate time1.aliyun.com6. kubeadm安装需要关闭swap 分区 vim /etc/fstab free -m 查看 如果有swap分区 需要关闭7. 添加网桥过滤 cat /etc/sysctl.d/k8s.cof net.bridge.bridge-nf-call-ip6tables =1 net.bridge.bridge-nf-call-iptables =1 net.ipv4.ip_forward = 1 vm.swappiness = 0 modprobe br_netfilter sysctl -p /etc/sysctl.d/k8s.conf 8. 安装 ipvs yum -y install ipset ipvsadm cat > /etc/sysconfig/modules/ipvs.modules <<EOF #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 EOF 权限改为 755 chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod |grep -e ip_vs -e nf_conntrack_ipv4 9. 安装docker wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo yum -y install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 使用18.06 高版本配置可能需要修改 systemctl enable docker && systemctl start docker10. 修改资源配置vim /etc/docker/daemon.json { "exec-opts":["native.cgroupdriver=systemd"], "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"] } 11. 集群软件安装yum -y install --setopt=obsoletes=0 kubeadm-1.17.2-0 kubelet-1.17.2-0 kubectl-1.17.2-0 kubeadm 初始化集群 kubelet 接受api-server 指令 管理pod kubectl 集群命令管理工具 12. 修改配置 cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernet…

iptables防火墙
type: item
date: 2019-09-12T13:50:31+08:00
description: 防火墙，其实说白了讲，就是用于实现Linux下访问控制的功能的，它分为硬件的或者软件的防火墙两种。无论是在哪个网络中，防火墙工作的地方一定是在网络的边缘。而我们的任务就是需要去定义到底防火墙如何工作，这就是防火墙的策略，规则，以达到让它对出入网络的IP、数据进行检测。目前市面上比较常见的有3、4层的防火墙，叫网络层的防火墙，还有7层的防火墙，其实是代理层的网关。对于TCP/IP的七层模型来讲，我们知道第三层是网络层，三层的防火墙会在这层对源地址和目标地址进行检测。但是对于七层的防火墙，不管你源端口或者目标端口，源地址或者目标地址是什么，都将对你所有的东西进行检查。所以，对于设计原理来讲，七层防火墙更加安全，但是这却带来了效率更低。所以市面上通常的防火墙方案，都是两者结合的。而又由于我们都需要从防火墙所控制的这个口来访问，所以防火墙的工作效率就成了用户能够访问数据多少的一个最重要的控制，配置的不好甚至有可能成为流量的瓶颈本次介绍iptables防火墙iptables防火墙说明及工作原理iptables防火墙包含四个表和五个链，分别为四个表分别为：Filter表（真正的防火墙功能）Nat表（负责数据包的改写）Mangle表（路由标记）raw表（禁止数据包的连接跟踪，用于提高性能）五个链分别为：INPUT(进入防火墙)OUTPUT(离开防火墙)FORWARD(流经防火墙)PREROUTING(数据包到达防火墙之前进行路由判断)POSTROUTING(数据包离开防火墙时进行的路由判断)3.表和链的包含情况说明Filter表包含: INPUT、OUTPUT、FORWARD;Nat表包含: OUTPUT、PREROUTING、POSTROUTING；Mangle表包含： INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING；Raw表包含: OUTPUT、PREROUTING；4.iptables防火墙的工作原理说明1、iptables防火墙是一层层过滤的，实际是按照配置规则的顺序从上到下，从前到后进行过滤的。2、如果匹配上规则，即明确表明是阻止还是通过，此时数据包就不在向下匹配新规则了。3、如果所有规则中没有明确表示是阻止还是通过这个数据包，也就是没有匹配上规则，向下进行匹配，直到匹配到默认规 则到明确阻止还是通过。4、防火墙的默认规则是对应链的所有规则执行完才会执行的。注：防火墙规则执行顺序默认是从前到后，（从上到下）依次执行，遇到匹配的规则就不在继续向下检查，只有遇到不匹配的规则才会继续向下进行匹配Iptables防火墙使用及规则配置iptables命令常用参数很多参数请通过man iptables或iptables --help来查看-n：以数字的方式显示ip，它会将ip直接显示出来，如果不加-n，则会将ip反向解析成主机名。-L（大写）列表 例：iptbles -nL 查看iptables规则--line-number显示规则的序号 iptables -nL --line-number （可以根据序号删除规则）-D 删除规则 （查到规则序号后、指定链、指定序号删掉） 例： iptables -D INPUT 1 （指顶删除INPUT链的第一条规则、默认是FILTER表、如果是其他的表需要-t指定表）-F（大写）清除所有规则，不会处理默认的规则-X（大写）删除用户自定义的链-Z（大写）清除链的计数器-A （大写）添加规则到指定链的结尾-I (大写) 添加规则到指定链的开头-P （大写）设置默认策略的（设定默认门是关着的还是开着的）-t 指定表（默认是filter表） 例：iptables -t filter -A INPUT -p tcp --dport 443 -j DROP #指定在filter表的input链的tcp协议443端口的请求丢弃-p 匹配指定协议 （all（所有） 、tcp、udp、icmp（ping等）、默认all）--dport 目的端口（对本地的端口做什么）--sport 源端口（从那个端口连接过来的）-j 处理的行为 {DROP(丢弃)、ACCEPT(接受)、REJECT(拒绝)、ACCEPT(接受)-s 指定源ip地址-d 目的地址-i 匹配进入的网卡接口eth0或者eth1进行控制-o 匹配出去的网卡借口配置一个生产中只开启443端口的防火墙规则说明：这里配置的防火墙规则只开启443端口（https），1.首先清除防火墙的默认规则iptables -Fiptables -Xiptables -Z2.允许自己的网段连接服务器iptables -A INPUT -p tcp -s 10.0.0.0/24 -j ACCEPT允许自己的回环接口进出：iptables -A IN…

关于 docker for windows 挂载mariadb 数据目录报错
type: item
date: 2019-06-23T11:49:00+08:00
description: 发现问题据说mariadb和mysql 90% 相似度,本地使用docker 起了个容器 挂载数据到本地的时候居然报错了[ERROR] InnoDB: The Auto-extending innodb_system data file './ibdata1' is of a different size 0 pages than specified in the .cnf file: initial 768 pages, max 0 (relevant if non-zero) pages!查询问题和 mysql 一样的配置为什么会报错的,一脸懵逼??? ./ibdata1 查询了各大资源后发现可能是 Docker for windows 的共享文件系统或MariaDB本身中的bug!!!解决问题最后经过苦苦测试 终于找到了一个可行的解决方案 下面解释一下关键配置ibdata1是InnoDB的共有表空间，默认情况下会把表空间存放在一个文件ibdata1中innodb_flush_method 则确定日志及数据文件如何write、flushinnodb_flush_method可以取如下值：fdatasync, O_DSYNC, O_DIRECT 实验选项littlesync和nosyncinnodb_use_native_aio 该选项仅适用于Linux系统，默认情况下处于启用状态。在其他类Unix系统上,InnoDB仅使用同步I/O. - 从历史上看,InnoDB仅在Windows系统上使用异步I/O. 在Linux上使用异步I/O子系统需要libaio库Binary Log 简称 Binlog 即 二进制日志文件，这个文件记录了mysql所有的 DML 操作。通过 Binlog 日志我们可以做数据恢复，做主主复制和主从复制等等。下面是的我的 docker-compose.yml 和 配置dockerFileFROM mariadb:latest LABEL maintainer="Mahmoud Zalt <mahmoud@zalt.me>" COPY my.cnf /etc/mysql/conf.d/my.cnf CMD ["mysqld"] EXPOSE 3306docker-compose.yml mariadb: build: ./mariadb volumes: - ./mariadb/data:/var/lib/mysql ports: - "3306:3306" environment: - MYSQL_DATABASE=default - MYSQL_USER=default - MYSQL_PASSWORD=default - MYSQL_ROOT_PASSWORD=root networks: - backend command: mysqld --innodb-flush-method=littlesync --innodb-use-native-aio=OFF --log_bin=ONmariadb 配置[mysqld] innodb_flush_method=littlesync innodb_use_native_aio=OFF log_bin=ON

docker-lnmp
type: item
date: 2019-04-18T17:04:00+08:00
description: 安装包 （win10并开启虚拟化）https://download.docker.com/win/stable/Docker%20for%20Windows%20Installer.exegit 仓库git@github.com:weiyixi/docker_study.git目录说明nginx 站点配置在 ./docker-lnmp/nginx/site (修改后重启nginx容器生效)php-fpm 容器中/var/www/目录挂载本地docker-lnmp的上层目录（.env中 APPLICATION=../）需要加扩展在对应得dockerfile 中修改1.修改配置env-example 复制为 .env //window需要修改 DOCKER_SYNC_STRATEGY=unison //php版本修改默认7.2 PHP_VERSION=722.基本操作首先到docker-lnmp目录下 1.构建 docker-compose build nginx php-fpm redis mysql 2.开启 docker-compose up -d nginx redis mysql 3.关闭 docker-compose down 4.查看运行中容器 docker ps 5.进入容器中 docker exec -it 对应的CONTAINER_ID bash 3.扩展1.已经定义了一批扩展可在 .env中开启 true开启 false 关闭 2.未定义的需要修改dockerfile安装 3.修改后需要重新build 开启才会生效

使用docker-compose搭建本地开发环境
type: item
date: 2019-03-01T20:59:00+08:00
description: 适用于对docker有一定了解的朋友，小白请先仔细阅读官方文档！作为应用程序，我们通常需要依赖于多种外部服务，比如数据库、缓存服务等等。Docker-compose就是在Docker容器的基础上，提供了统一的容器编排语言，可以让你更轻松的利用Docker构建你的应用环境。docker-compose.yml文件语法语法image 使用的镜像 build 指定Dockerfile构建 command 启动执行命令 links 链接其他容器 ports 端口映射 expose 暴露端口 volumes 挂载路径 volumes_from 从容器挂载 environment 环境变量编写dockerfile(自定义镜像)编写docker-compose.yml(可以不依赖Dockerfile 使用官方镜像)常用命令构建容器 docker-compose up -d 查看容器 docker-compose ps 进入容器 docker exec -it 容器名 /bin/bash 关闭所有 docker-compose downphp-fpm Dockerfile 示例 可以自定义扩展FROM php:7.1-fpm-alpine # apk RUN apk --update add \ autoconf \ build-base \ linux-headers \ libaio-dev \ zlib-dev \ curl \ git \ subversion \ freetype-dev \ libjpeg-turbo-dev \ libmcrypt-dev \ libpng-dev \ libtool \ libbz2 \ bzip2 \ bzip2-dev \ libstdc++ \ libxslt-dev \ openldap-dev \ imagemagick-dev \ make \ unzip \ wget \ libmemcached-dev # PHP Core Extensions RUN docker-php-ext-install \ bcmath \ pdo_mysql \ mysqli \ pcntl \ && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install gd # PECL Extensions RUN pecl install redis-4.2.0 \ && pecl install mongodb-1.5.3 \ && pecl install memcached-3.1.3 \ && pecl install swoole-4.3.1 \ && docker-php-ext-enable redis mongodb memcached swoole # Delete RUN apk del build-base \ linux-headers \ libaio-dev \ && rm -rf /var/cache/apk/* \ && mkdir /data \ && chmod -R 777 /data VOLUME /var/www WORKDIR /var/www EXPOSE 9000 CMD ["php-fpm"]docker-compose.yml示例version: "3.0" services: nginx: image: nginx:alpine ports: - 80:80 - 443:443 volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf - ./nginx/conf.d:/etc/nginx/conf.d - ../:/var/www php-fpm: build: ./php-fpm ports: - 9000:9000 volumes: - ./php-fpm/php.ini:/usr/local/etc/php/php.ini - ./php-fpm/www.conf:/usr/local/etc/php-fpm.d/www.conf - ../:/var/www mysql: image: mysql:5.7 ports: - 3306:3306 volumes: - ./mysql/data:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=123456 redis: image: redis:5.0-alpine ports: - 6379:6379 volumes:…

商品sku设置属性排列js处理
type: item
date: 2019-01-17T18:48:00+08:00

爬取国外高校犯罪信息数据
type: item
date: 2019-01-09T18:23:00+08:00
description: <?php /** * 爬取 国外高校犯罪信息数据 * Class SchoolSpider */ class SchoolSpider { private $schoolName; //学校名检查api private $schoolApi = 'https://ope.ed.gov/campussafety/api/institution/names?filter='; //校区 private $schoolSerachApi = 'https://ope.ed.gov/campussafety/api/institution/search'; //数据 校区 private $dataApi = 'https://ope.ed.gov/campussafety/api/campus/'; //整个学校 private $totalApi = 'https://ope.ed.gov/campussafety/api/institution/'; //校区 private $campisesData; //详情数据 private $dataDetail; //详情数据 public $error; public $result=[]; public function __construct() { //请求时间不限 set_time_limit(0); } public function spiderData($schoolName) { $this->schoolName = $schoolName; $this->result['school_name'] = $this->schoolName; if (!$this->checkName() || !$this->getCampises()) { return ['code' => -1, 'msg' => $this->error]; } //总的数据 $this->formatData($this->campisesData); //各个分校区数据 $this->formatData($this->campisesData[0]['Campuses'],1); return ['code' => 0, 'msg' => $this->error,'data'=>$this->result]; } /** * @name 数据解析 * @param $campisesData 数据 * @param $isCampise 是否是分校区数据 */ private function formatData($campisesData,$isCampise=false){ foreach ($campisesData as $campise) { if($isCampise){ //校区名 $res = $this->getDetailCampuse($campise['UnitID']); }else{ $res = $this->getDetail($campise['UnitID']); } if(!$res||isset($this->result[$campise['UnitID']])){ continue; } $dataDetail = $this->dataDetail; //校名 $this->result[$campise['UnitID']]['campuse'] = $campise['Name']; foreach ($dataDetail as $k => $data) { if ($k == 0) continue; $this->result[$campise['UnitID']]['data'][] = empty($data) ? [] : array_column($data['Cells'], 'Html'); } } } /** * 检查学校名 * @return array */ private function checkName() { $school = json_decode($this->httpRequest($this->schoolApi . urlencode($this->schoolName)), true); if (!isset($school[0]['Code']) || !$school[0]['Code']) { $this->error = '检查学校名 error'; return false; } return true; } /** * 获取校区 * @return array */ private function getCampises() { $schoolSerachData …

PHP版的代码整洁之道
type: item
date: 2019-01-03T20:44:00+08:00
description: Clean Code PHP目录介绍变量使用见字知意的变量名同一个实体要用相同的变量名使用便于搜索的名称 (part 1)使用便于搜索的名称 (part 2)使用自解释型变量避免深层嵌套，尽早返回 (part 1)避免深层嵌套，尽早返回 (part 2)少用无意义的变量名不要添加不必要上下文合理使用参数默认值，没必要在方法里再做默认值检测表达式使用恒等式函数函数参数（最好少于2个）函数应该只做一件事函数名应该是有意义的动词（或表明具体做了什么事）函数里应当只有一层抽象abstraction不要用flag作为函数的参数避免副作用不要写全局函数不要使用单例模式封装条件语句避免用反义条件判断避免条件判断避免类型检查 (part 1)避免类型检查 (part 2)移除僵尸代码对象和数据结构 Objects and Data Structures使用 getters 和 setters Use object encapsulation对象属性多使用private/protected限定类组合优于继承避免连贯接口推荐使用 final 类类的SOLID原则 SOLIDS: 职责单一原则 Single Responsibility Principle (SRP)O: 开闭原则 Open/Closed Principle (OCP)L: 里氏替换原则 Liskov Substitution Principle (LSP)I: 接口隔离原则 Interface Segregation Principle (ISP)D: 依赖反转原则 Dependency Inversion Principle (DIP)别写重复代码 (DRY)翻译介绍本文参考自 Robert C. Martin的Clean Code 书中的软件工程师的原则,适用于PHP。 这不是风格指南。 这是一个关于开发可读、可复用并且可重构的PHP软件指南。并不是这里所有的原则都得遵循，甚至很少的能被普遍接受。 这些虽然只是指导，但是都是Clean Code作者多年总结出来的。本文受到 clean-code-javascript 的启发虽然很多开发者还在使用PHP5，但是本文中的大部分示例的运行环境需要PHP 7.1+。翻译说明翻译完成度100%，最后更新时间2017-12-25。本文由 php-cpm 基于 yangweijie版本 的clean-code-php翻译并同步大量原文内容。原文更新频率较高，我的翻译方法是直接用文本比较工具逐行对比。优先保证文字内容是最新的，再逐步提升翻译质量。阅读过程中如果遇到各种链接失效、内容老旧、术语使用错误和其他翻译错误等问题，欢迎大家积极提交PR。变量使用见字知意的变量名坏:$ymdstr = $moment->format('y-m-d');好:$currentDate = $moment->format('y-m-d');⬆ 返回顶部同一个实体要用相同的变量名坏:getUserInfo(); getUserData(); getUserRecord(); getUserProfile();好:getUser();⬆ 返回顶部使用便于搜索的名称 (part 1)写代码是用来读的。所以写出可读性高、便于搜索的代码至关重要。命名变量时如果没有有意义、不好理解，那就是在伤害读者。请让你的代码便于搜索。坏:// What the heck is 448 for? $result = $serializer->serialize($data, 448);好:$json = $serializer->serialize($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);使用便于搜索的名称 (part 2)坏:// What the heck is 4 for? if ($user->access & 4) { // ... }好:class User { const ACCESS_READ = 1; const ACCESS_CREATE = 2; const ACCESS_UPDATE = 4; const ACCESS_DELETE = 8; } if ($user->access & User::ACCESS_UPDATE) { // do edit ... }⬆ 返回顶部使用自解释型变量坏:$address = 'One Infinite Loop, Cupertino 95014'; $cityZipCodeRegex = '/^[^,]+,\s*(.+?)\s*(\d{5})$/'; preg_match($cityZipCodeRegex, $…

命令行界面 (CLI)、终端 (Terminal)、Shell、TTY
type: item
date: 2018-09-11T18:39:02+08:00
description: 1.命令行界面命令行界面（英语：Command-lineInterface，缩写：CLI）是在图形用户界面得到普及之前使用最为广泛的用户界面，它通常不支持鼠标，用户通过键盘输入指令，计算机接收到指令后，予以执行。2.终端在大型机 (Mainframe) 和小型机 (Minicomputer)的时代里，计算机曾经非常昂贵且巨大，不像现在这样人手一台。这些笨重的计算机通常被安置在单独的房间内，而操作计算机的人们坐在另外的房间里，通过某些设备与计算机进行交互。这种设备就叫做 终端 (Terminal)，也叫终端机。2.1控制台(console)历史上，终端是链接到计算机的一种带输入输出功能的外设。但是有一种终端于总不同，它和计算机是一体的，是计算机的一部分。这个特殊的终端就是 控制台（console）。2.2终端模拟器 (Terminal Emulator)随着计算机的进化，我们已经见不到专门的终端硬件了，取而代之的则是键盘与显示器。但是没有了终端，我们要怎么与那些传统的、不兼容图形接口的命令行程序（比如说 GNU 工具集里的大部分命令）交互呢？这些程序并不能直接读取我们的键盘输入，也没办法把计算结果显示在我们的显示器上……（图形界面的原理我这里就不多说了，它们编程的时候图形接口还在娘胎里呢！）这时候我们就需要一个程序来模拟传统终端的行为，即 终端模拟器 (Terminal Emulator)。严格来讲，Terminal Emulator 的译名应该是「终端仿真器」。对于那些命令行 (CLI) 程序，终端模拟器会「假装」成一个传统终端设备；而对于现代的图形接口，终端模拟器会「假装」成一个 GUI 程序。一个终端模拟器的标准工作流程是这样的：捕获你的键盘输入；将输入发送给命令行程序（程序会认为这是从一个真正的终端设备输入的）；拿到命令行程序的输出结果（STDOUT 以及 STDERR）；调用图形接口（比如 X11），将输出结果渲染至显示器。终端模拟器有很多，这里就举几个经典的例子：GNU/Linux：gnome-terminal、Konsole； macOS：Terminal.app、iTerm2； Windows：Win32 控制台、ConEmu 等。在专门的终端硬件已经基本上仅存于计算机博物馆的现代，人们通常图省事儿，直接称呼终端模拟器为「终端」。2.3.TTY简单说，tty就是终端的总称。最早的 Unix 终端是 ASR-33 电传打字机。而电传打字机 (Teletype / Teletypewriter) 的英文缩写就是 tty，即 tty 这个名称的来源。由于 Unix 被设计为一个多用户操作系统，所以人们会在计算机上连接多个终端（在当时，这些终端全都是电传打字机）。Unix 系统为了支持这些电传打字机，就设计了名为 tty 的子系统（没错，因为当时的终端全都是 tty，所以这个系统也被命名为了 tty，就是这么简单粗暴），将具体的硬件设备抽象为操作系统内部位于 /dev/tty* 的设备文件。3. Shell —— 提供用户界面的程序大家都知道，操作系统有一个叫做 内核 (Kernel) 的东西，它管理着整台计算机的硬件，是现代操作系统中最基本的部分。但是，内核处于系统的底层，是不能让普通用户随意操作的，不然一个不小心系统就崩溃啦！但我们总还是要让用户操作系统的，怎么办呢？这就需要一个专门的程序，它接受用户输入的命令，然后帮我们与内核沟通，最后让内核完成我们的任务。这个提供用户界面的程序被叫做 Shell (壳层)。其实 Shell 只是提供了一个用户操作系统的入口，我们一般是通过 Shell 去调用其他各种各样的应用程序，最后来达成我们的目的。比如说我们想要知道一个文件的内容，我们会在 Shell 中输入命令 cat foo.txt，然后 Shell 会帮我们运行 cat 这个程序，cat 再去调用内核提供的 open 等系统调用来获取文件的内容。虽然并不是 Shell 直接去与内核交互，但广义上可以认为是 Shell 提供了与内核交互的用户界面。Shell 通常可以分为两种： 命令行 Shell 与 图形 Shell。顾名思义，前者提供一个命令行界面 (CLI)，后者提供一个图形用户界面 (GUI)。Windows 下的 explorer.exe 就是一个典型的图形 Shell（没错，它确实是，因为它接受来自你的指令，并且会帮你与内核交互完成你的指令）。常见或历史上知名的命令行 Shell 有： 适用于 Unix 及类 Unix 系统： sh (Bourne shell)，最经典的 Unix shell； bash (Bourne-Again shell)，目前绝大多数 Linux 发行版的默认 shell； zsh …

使用iptables设定特定端口连接数网速（万能方法）
type: item
date: 2018-09-06T10:21:35+08:00
description: 使用iptables设定特定端口连接数（万能方法）限制端口连接数量首先输入命令service iptables stop关闭iptables（注意：iptables可能会有问题，貌似在旧版本中不被认为是一个服务，而是防火墙，这个问题我还没有解决，如果你解决了请告诉我一声，谢谢）限制端口并发数很简单，IPTABLES就能搞定了，假设你要限制端口8388的IP最大连接数为5，两句话命令：iptables -I INPUT -p tcp --dport 8388 -m connlimit --connlimit-above 5 -j DROP iptables -I OUTPUT -p tcp --dport 8388 -m connlimit --connlimit-above 5 -j DROP我再举个例子，比如你想限制从1024-10240的端口iptables -I INPUT -p tcp --dport 1024:10240 -m connlimit --connlimit-above 5 -j DROP iptables -I OUTPUT -p tcp --dport 1024:10240 -m connlimit --connlimit-above 5 -j DROP保存IPTABLES规则即可（service iptables save），其他端口以此类推。输入命令service iptables start启动最后用命令查看是否生效iptables -L -n -v限制端口速度首先输入命令service iptables stop关闭iptables限制端口并发数很简单，IPTABLES就能搞定了，假设你要限制端口5037的最大连接速度为60个包每秒，两句话命令：iptables -A INPUT -p tcp --sport 5037 -m limit --limit 60/s -j ACCEPT iptables -A INPUT -p tcp --sport 5037 -j DROP也就是限制每秒接受60个包，一般来说每个包大小为64—1518字节(Byte)。限制指定ip的访问速度原理：每秒对特定端口进行速度控制，比如每秒超过10个的数据包直接DROP，从而限制特定端口的速度iptables -A FORWARD -m limit -d 208.8.14.53 --limit 700/s --limit-burst 100 -j ACCEPT iptables -A FORWARD -d 208.8.14.53 -j DROP最后说一下如何解决防火墙重启后失败的问题iptables-save >/etc/sysconfig/iptables echo 'iptables-restore /etc/sysconfig/iptables' >> /etc/rc.local chmod +x /etc/rc.d/rc.local对于ssr客户端限制设备连接数打开你的配置文件，假设你在 /root 文件夹中安装的ShadowsocksR服务端，那么就是：vi /root/shadowsocksr/user-config.json找到协议参数（参数为空 "" 时，默认限制 64个设备数）"protocol_param": "",在协议参数中设置你要限制 每个端口最大设备连接数（建议最少2个），比如 限制最大 5个设备同时链接，那么改为："protocol_param": "5",注意：协议参数仅在服务端 协议设置(protocol)为 非原版(origin)协议并不兼容原版(_compatible) 时才有效！限制端口速度还是上文的那个地方，第一个是单线程限制，另外一个是总限制"speed_limit_per_con": 0, "speed_limit_per_user": 0,当你使用这个端口 下载某个文件时，单线程下载限速 100KB/S ，多线程下载(比如5个线程)就是 500KB/S 了，Youtube是单线程。