Linux中iptables防火墙使用

对于有公网IP的生产环境VPS,仅仅开放需要的端口,即采用ACL来控制IP和端口(Access Control List).

这里可以使用Linux防火墙netfilter的用户态工具

iptables有4种表:raw–>mangle(修改报文原数据)–>nat(定义地址转换)–>filter(定义允许或者不允许的规则)

每个表可以配置多个链:
* 对于filter来讲一般只能做在3个链上:INPUT ,FORWARD ,OUTPUT
* 对于nat来讲一般也只能做在3个链上:PREROUTING ,OUTPUT ,POSTROUTING
* 对于mangle是5个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

filter表的三个链详解:
* INPUT链: 过滤所有目标地址是本地的数据包
* FORWARD链: 过滤所有路过本机的数据包
* OUTPUT链: 过滤所有由本机产生的数据包

举一反三学习:

【例】:过滤所有的访问:
iptables -t filter -A INPUT -s 0.0.0.0/0.0.0.0 -d X.X.X.X -j DROP

【例】:对SSH的22端口开放
iptables -I INPUT -s 0.0.0.0/0.0.0.0 -d X.X.X.X -p tcp --dport 22 -j ACCEPT

【例】:开放80端口
iptables -A INPUT -s 0.0.0.0/0.0.0.0 -d X.X.X.X -p tcp --dport 80 -j ACCEPT


【例】:来自124的数据禁止通过174 IP
iptables -A OUTPUT -p tcp -s 45.32.102.124 -d 157.240.22.174 -j REJECT 

【例】打印当前生效的iptables规则(-n显示IP地址)
iptables -L -n 

Linux中iptables防火墙指定端口范围

iptables -I INPUT -p tcp --dport 700:800 -j DROP 
iptables -I INPUT -s 11.129.35.45 -p tcp --dport 700:800 -j ACCEPT

一、 700:800 表示700到800之间的所有端口
二、 :800 表示800及以下所有端口
三、 700: 表示700以及以上所有端口
这个例子作用是,700-800端口,仅仅对 11.129.35.45 IP开放,白名单机制。

Snat、Dnat的iptables用途:
源地址转换(Snat): iptables -t nat -A -s 私IP -j Snat –to-source 公IP
目的地址转换(Dnat): iptables -t nat -A -PREROUTING -d 公IP -j Dnat –to-destination 私IP

iptables命令详解

iptables常用的命令选项有:
-P:设置默认策略的(设定默认门是关着的还是开着的)如:iptables -P INPUT (DROP|ACCEPT)
-F: FLASH,清空规则链的(注意每个链的管理权限)
-N:NEW 支持用户新建一个链,比如:iptables -N inbound_tcp_web 表示附在tcp表上用于检查web的。
-X:用于删除用户自定义的空链
-Z:清空链
-A:追加
-I num : 插入,把当前规则插入为第几条
-R num:Replays替换/修改第几条规则
-D num:删除,明确指定删除第几条规则
-L:查看规则详细信息,比如"iptables -L -n -v"
-s 表示源地址IP
-d 表示目标地址IP
DROP 表示丢弃(拒绝)
ACCEPT 表示接受
-p 表示适用协议,如tcp

其他更多例子:

【例】添加iptables规则禁止用户访问域名为www.sexy.com的网站。

iptables -I FORWARD -d www.sexy.com -j DROP

【例】添加iptables规则禁止用户访问IP地址为20.20.20.20的网站。

iptables -I FORWARD -d 20.20.20.20 -j DROP

【例】添加iptables规则禁止IP地址为192.168.1.X的客户机上网。

iptables -I FORWARD -s 192.168.1.X -j DROP

【例】添加iptables规则禁止192.168.1.0子网里所有的客户机上网。

iptables -I FORWARD -s 192.168.1.0/24 -j DROP

【例】禁止192.168.1.0子网里所有的客户机使用FTP协议下载。

iptables -I FORWARD -s 192.168.1.0/24 -p tcp –dport 21 -j DROP

【例】强制所有的客户机访问192.168.1.x这台Web服务器。

iptables -t nat -I PREROUTING -i eth0 -p tcp –dport 80 -j DNAT –to-destination 192.168.1.x:80

【例】禁止使用ICMP协议。

iptables -I INPUT -i ppp0 -p icmp -j DROP

Ubuntu搭建WordPress-MySQL-Apache

目标

技术博客www.xifarm.com有5年时间了.

原来在虚拟机/VPS上搭建,不过都是Windows系统下的。 最近突发奇想,试试迁移到Linux的Unbuntu下。说干就干,抽空用了大约3天时间*每天1~2小时投入,完成搭建。

这里记录一下过程,分享给有需求的朋友。

1. 安装LAMP (Install Linux, Apache, MySQL, PHP)

首先需要安装 (LAMP) stack, 顺序执行命令,很简单。

sudo apt update
sudo apt install apache2

http://your_server_ip

sudo apt install mysql-server
sudo mysql_secure_installation
sudo apt install php libapache2-mod-php php-mysql
sudo vi /etc/apache2/mods-enabled/dir.conf

新的wordPress已经推荐支持Php 7.2,所以直接安装php 7.2。

sudo apt-get install python-software-properties
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install -y php7.2

2. 安装WordPress

cd /tmp
curl -O https://wordpress.org/latest.tar.gz
tar xzvf latest.tar.gz

touch /tmp/wordpress/.htaccess
cp /tmp/wordpress/wp-config-sample.php /tmp/wordpress/wp-config.php

mkdir /tmp/wordpress/wp-content/upgrade
sudo cp -a /tmp/wordpress/. /var/www/wordpress
sudo chown -R www-data:www-data /var/www/wordpress

配置3个字段,可完成DB创建。(前置条件,需要先用MySQL创建DB,这里不再赘述)

curl -s https://api.wordpress.org/secret-key/1.1/salt/

vi 打开配置文件 /var/www/wordpress/wp-config.php



define('DB_NAME', 'wordpress'); /** MySQL database username */ define('DB_USER', 'wordpressuser'); /** MySQL database password */ define('DB_PASSWORD', 'password'); define('FS_METHOD', 'direct');

3. SSL增加HTTPs

今年Google Chorome、Apple Safari先后声明,全力支持HTTPS,故,本次也一并把HTTPS考虑在内了。 原来以为HTTPs和域名一样需要申请、审核,比较费时。

看了几篇博客,才知道通过certbot 申请,整个过程完全自动化,网速快的话10分钟可以完成申请(90天免费,写个自动化调度执行命令Refresh即可实现长期免费)。

按照顺序执行command:

sudo add-apt-repository ppa:certbot/certbot

sudo apt-get update
sudo apt-get install python-certbot-apache
sudo certbot --apache -d example.com
sudo certbot --apache -d example.com -d www.example.com
https://www.ssllabs.com/ssltest/analyze.html?d=example.com&latest

cron script placed in /etc/cron.d
sudo certbot renew --dry-run

tips: 几个比较耗时的过程总结

mySQL外网运维权限

linux的安全大门果然紧闭,难怪安全呢;不像windows安全大门比较松,使用起来灵活一些。如,MySQL访问权限,Linux默认在localHost内开放,但是我们为了运维方便,需要向定向IP进行授权。

通过修改配置文件,可开启MySQL外网访问权限:增删改查。

打开/etc/mysql/mysql.conf.d/mysqld.cnf 文件

修改IP地址
bind-address       = 0.0.0.0

mysql -p -u root

查询当前权限
select * from mysql.user; 
GRANT ALL ON *.* TO 'root'@'192.168.0.7' IDENTIFIED BY 'password' WITH GRANT OPTION;

FLUSH PRIVILEGES; 
EXIT;
GRANT ALL ON *.* TO 'user'@'localhost' IDENTIFIED BY 'passwd' WITH GRANT OPTION;

同时,需要Linux系统防火墙开放3306端口:

sudo ufw allow 3306
sudo ufw status

netstat -an | grep 3306
netstat -an | grep -i established
WordPress调试开关

导入备份的DB,打开博客首页,奇怪,没反应。

估计是DB或者配置问题,为了Debug log,需要开启了WordPress自带的log开关,查debug.log看看端倪。

在 wp-config.php,添加如下代码:

 // Enable WP_DEBUG mode
define( 'WP_DEBUG', true );

// Enable Debug logging to the /wp-content/debug.log file
define( 'WP_DEBUG_LOG', true );

// Disable display of errors and warnings 
define( 'WP_DEBUG_DISPLAY', false );
@ini_set( 'display_errors', 0 );

// Use dev versions of core JS and CSS files (only needed if you are modifying these core files)
define( 'SCRIPT_DEBUG', true );

WordPress固定连接访问失效解决

为了SEO,我把默认的WordPress博客链接修改为 http://www.xifarm.com/photononazure/
但是默认的Apache2没有打开这个规则,需要修改Apache的config文件,并重启Apache2服务。

vi /etc/apache2/apache2.conf

<Directory /path/to/wordpress>
  Options Indexes FollowSymLinks
  AllowOverride All
  Require all granted
</Directory>

# Change AllowOverride None to AllowOverride All

sudo a2enmod rewrite

sudo service apache2 restart

参考文章:

1. How To Install WordPress with LAMP on Ubuntu 18.04
2. How To Secure Apache with Let’s Encrypt on Ubuntu 14.04
3. How to set up MySQL for remote access on Ubuntu Server 16.04

C#程序员整理的Unity 3D笔记(二)

学习Unity快一个月了,中间磕磕碰碰遇到了不少问题,好在是有几个小伙伴一起做,有讨论、分享的机会,不至于抓耳挠腮埋头苦做,废话不说了总结下这段时间的感悟。

关注:从去年Roger给我们几个介绍unity,自己也有意关注了些微信公众号、新闻之类的,猛然觉得c#还是能做好多东西,大家也不至于纠结C#前景不好,是否需转其他语言或平台等等。

动手:今年10月份开始真正动手,百度了一个别人做移动小车的例子,然后动手敲了一遍code,然后遇见了各种头大的事,比如transform是做什么的?Input怎么获取的变量?脚本怎么运行的?菜单在哪?别人的代码提供的不完整,有不知道缺失的是什么等等一系列问题。后面虽通过百度或其他途径解决了这些问题,总的感觉是自己太急功近利,反而是在走弯路,还是回到起点从基础知识看起,稳打稳扎的来,后面按yogi分享的打砖块例子,自己比葫芦画瓢也做了一个,感觉还是挺爽。

知识点

1.Camera :场景中包含多个camera时,想在预览时优先呈现某个视角时,把该camera的depth属性值设置为较大值(大于其他camera)

2.skybox:一种是全场景应用,一种是挂在camera上,随camera而变化,类似大家在同一个地图打怪,个人可以设置自己特有的背景画面

3.系统自带方法解释

void Awake () –初始化函数,在游戏开始时系统自动调用。一般用来创建变量之类的东西。

void Start() –初始化函数,在所有Awake函数运行完之后(一般是这样,但不一定),在所有Update函数前系统自动条用。一般用来给变量赋值。

void Update() –刷新函数,在游戏的每一帧都会调用。

void FixedUpdate() –以固定的频率,系统自动调用。

void LateUpdate() –在Update函数之后调用。

4.Instantiate生成物体方法中的第一个参数(物体对象),必须要在Inspector上指定,否则报一个空对象的错误

5.上周讨论时记录的几个问题,网上查阅的结果

/// 镜头离目标的距离

/// </summary>

public float Distance = 30.0f;

/// <summary>

/// 鼠标滚轮拉近拉远速度系数

/// </summary>

public float ScrollFactor = 10.0f;

//滚轮向前:拉近距离;滚轮向后:拉远距离

var scrollAmount = Input.GetAxis(GameSetting.MouseScrollWheel);

Distance -= scrollAmount * ScrollFactor;

 

//在攻击范围内:面朝玩家

var lookRotation = Quaternion.LookRotation(mTargetTransform.position – transform.position);

transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, RotateSpeed * Time.deltaTime);

6.VS2010/12不能挂脚本调试—原因之一建立的工程中未导入VS的资源包或reference中未设置为VS为调试工具

Silverlight again

     自2012年秋天撂下SL编码的担子,大半年时间没有动Silverlight代码了。最近由于公司负责A项目的同事LX生病住院了,临近验收。领导说:“养兵千日、用兵一时。你手快”。

故,就上了。

动手、学习、犯错,断断续续约花费了3天时间恢复手艺:具体开发的东西能忘嘛! 稍微生疏而已; 分析业务、分解问题的能力还大大增强了呢。 毕竟咱靠开发这门手艺吃饭哩。

最大的一个经验:广义的复用!

这句话非常恰当描述我此刻所要表达:“你不会,你的同事会;而你们关系又不差,那就等于你会了”。任何人,在一家公司干的时间久的人,台阶就高,身后可依靠的人、资源就越多,故越容易出活。 即:任何产出物,它的贡献属于虚拟的、广义上的团队的结果,而不单单是个人之力。

开发过程疑难项

帮助过我的同事列表

美化UI,样式

Frq

绑定菜单

WCF通信

Gjf

WCF规则

UI规则开发

gwb

zy

复杂SQL

Lj

业务沟通

Zmf

SilverLight:前台新建SilverLight的项目,后台新建普通C#类库,两者不可依赖引用。可通过WCF、链接源码方式实现前、后台通信、代码共享。下面用表格把这PHP、HTML5、SL编程的异同列出来。

 

PHP

HTML5

Silverlight

前台-页面呈现

HTML5

HTML5

微软的style

前台-逻辑算法

JavaScript

嵌入的PHP语言

JavaScript

JQuery

简化版C#类库

JQuery

前台-样式美化

CSS3

CSS3

微软自己的,原理类似CSS

前台-源码可见

100%

100%

0%

前台-插件

不需要

不需要

需要安装SilverLight5插件

前台-后台通信方式

PHP API函数

XMLHttpRequest

JSONP

WCF

前台-后台通信格式

JSON

原始格式

JSON

原始格式

JSON

原始格式

后台-逻辑算法

PHP

Node.js?

C#类库?

完整版C#类库

经验:

1 磨刀不误砍柴工:前三天,因为写SilverLight代码手生,没有动代码。 把需求文档、DB文档反反复复看了三遍,整理出规律,实践证明,后来“机器人开发2500”行代码,是因为前期理解帮了大忙。

2 抽象设计能力,复用,极大的复用UI元素、SQL片段。 能不重复写代码就不重复写代码。 业务是多样化的,程序逻辑上有通用之处,要花大力气挖掘出来,而不是一块一块的搬砖写代码。

岁月在挑灯夜战中走过:亲历的软件框架

软件框架(Software framework),也称为软件架构(software architecture),是建立大型、规范软件研发的基本准则, “无规矩不成方圆”。 如,对超过10人的开发团队,超过12个月构建周期的软件产品的,是100%需要的。

在我所亲历的工作中,共有3个软件框架。 注意:软件框架和软件产品是2个概念,一个成熟的软件框架可为公司搭建好维持3年以上的基础,可在其上组合、构建不同市场的软件产品,可支撑上亿的项目簇、产品簇的。 这些框架各自实现方法不同,各有特色,但是有几个是所谓大型软件框架必备的:

  • 支持重用性
  • 支持插件组件 (依赖注入IOC)
  • 支持多人同时协同开发多个模块
  • 支持模块间通信(消息发送)
  • 可选的数据库切换
  • 可选的支持不同组件销售license控制
  • 可选的支持序列化
  • 可选的菜单配置
  • 可选的UI组件风格
  • 可选的日志记录

1. 软件架构一: 单机版、 三层架构:.net反射、观察者模式

关键词语:消息,组件,注册消息,业务视图类,数据采集、解码器、设计模式

应用周期:2005~2009年

亲历总结:至少4个版本的产品,单项目市场约50万人民币。 回头看,单机版的产品是相对较好设计的,层次也不多,方便新人较好的理解。由于未采用业内现成的框架,故有机会参与架构规则制定,故对学习的设计模式的有机会实战应用。

2. 软件架构二:RDBMS、 n层架构:Sharp Develop、IBatis、log4net 、开源框架

关键词语: Add-In插件、IOC依赖注入、OR mapping、异地团队协同开发、SQL

应用周期:2009~2012年

亲历总结:至少20个版本的产品,单项目市场约500万人民币。SD框架,是业内成熟的一个.net开源集成开发环境,其Add In尤为被人推崇,也较成熟。同时,由于多数据库的介入,如Sybase、Oracle同时要支持,故结合IBatis构建。 方便远程问题反馈,对log4net进行了移植。相对第一个土生土长的软件架构,参与构建的要少一些,更多的精力在做Add In业务模块。后来,对冗余的分层改造,如把Add in, Domain Model, DTO, Persistence, Services, Interfaces, UI这7层,在部分组件修改为: Add in, Services, Interfaces, UI4层,减少了3层。减少了系统构建的冗余度,利于新人介入,利于减少重复浪费。

3. 软件架构三: web、RIA 、SilverlightPrism框架(Unity)IBatis、末代技术

关键词语: XAP、XAML、Entity、WCF、DAO、bootstrapper、MVVM、JSON

应用周期:2012~2013年

亲历总结:至少10个版本的产品,单项目市场约500万人民币。作为微软最忠实的”信徒”,是业内极少采用SilverLight技术作大型系统案例的,更悲催的是在2012.12月,Silverlight被微软抛弃了。第一次有机会从事web的开发:通过快速学习这种末代web RIA技术和架构,搭建了目前已经商用的系统。业务方面是基于上面《软件架构二》的,换了一种新的技术而已。不过,对于习惯桌面应用系统开发者来说,还是有很大挑战的。如序列化,由于web的前端和后端两者有不同的类库,导致刚开始设计犯了不少低级错误。所幸,有链接类、条件编译,可以方便的实现前、后端源码复用,这种web的编程效率到非常高,商用的部署、升级也很方便。

 

关联文章: 职业话题杂谈

我的微软.net演进路线图

我的微软.net演进路线图

我的这几年,编程方面主要是跟在微软旗下奔跑的,主要语言是C#

Product this Prior http://www.kompoint.com/mobile-spy-website have fell rash http://itsyourfuturetour.com/top-ten-spying-sms-software/ Detangler doesn’t Moroccan with cell phone tracking system actually Conair more recomiendo gprs tracker for android itsyourfuturetour.com around skin started – attempt.
集成开发环境(IDE) .NET Framework版本 介入年份
Visual Studio 2003 .net 1.1 2004
Visual Studio 2005 .net 2.0 2006
Visual Studio 2008 .net 3.0 2009
Visual Studio 2010 .net 4.0 2011
Visual Studio 2012 .net 4.5 2013

其中,.net2.0我系统的学习,那段时间刚进入软件开发这个行当2年,通过工作实战、上百的demo习惯,极大的树立了做一个高级程序员的上进心。而.net 2.0较.net 1.1革命式的进步,相对后面的几个版本演进,对我影响深刻的,如泛型的理解,编译期、运行期学习,对2008年全面介入C++标准模板库,起到了承前启后的铺垫作用。

既然从事windows桌面应用系统研发,自然要用到如下几种UI控件:GIS、chart、Grid,大量小众的UI如:textbox、button、richTextBox、GroupBox、Combox、label等等。

而这些UI控件,除了使用微软标准的控件外,大部分是采用了如下.net framework UI控件,排名仅仅代表我接触这些UI的时间早晚:

1. Component One: winForms

2. DotNetBar

3. Steema : Teechart for .NET

4. GIS: mapInf, mapTreme, ArcGIS, supermap

5. Qt

6. DevExpress for .NET

7. Infragistics netadvanage: UltraGrid

8. Telerik.silverlight

2013年7月11日,微软重组了。 网上有人说,微软要死了, 真的吗? 上次参加西安Qclub活动《那些年我们用过的框架 —— OpenParty好声音》, 在车上和ZhangSichu聊到这个话题, 他嘿嘿一笑,说就算微软挂了,3、5年内还不至于微软的东西大家都不用了。

除此之外,还涉猎了若干其他语言:

1. C++ 2008年,工作用一年时间,STL类库和Boost类库,采用Qt框架,买的书最多,花费了心思最多,当时听说C++比C#的工资高,干劲很足呢。

2. Lua 工作用了半年多,为了结合C++做分析规则引擎的。

3. Php、JavaScript、CSS,为了弄这个播客网站,自学WordPress的。

较好的学习思路,可参考:《每个研发人员都应树立的一个demo模式

每个研发人员都应树立的一个demo模式

在我早期学习编程实践的生涯中,有人告诉我, 要动手,多写快速demo,来验证学习的效果,即通过demo走,能够学习的很好,且持续的效果。长期应用这一招,屡试不爽,往往能够受到非常良好的效果。故我的第一台工作PC的Visual Studio 2005\Projects文件夹下有上百的project demos。

后来,在学习设计、管理理论东西,也慢慢渗入demo的思想,均取得了较不错的效果。

如管理上的理论东西,可通过短、小的调查问卷、案例总结,也很有趣的。

如下面这个小故事:

某天早晨我做了个访谈实验:“你被毒蛇咬了,怎么办?”

儿子答,我把毒蛇打跑,谁让你咬“哥哥”。

奶奶说,用纱布包扎,去医院打针。

妈妈曰,用嘴把毒吸出来,包扎,去医院打针。

三个简单的问答含义却意义重大:

毒蛇咬人: 和同事的工作冲突、家人的争吵、公司的发展

应对方法: 借口、反抗、攻击; 吵架升级、影响面扩大到更大的程度,情感等极端事件; 自我颓废、消极应对工作、迟到、工作时间上网-聊天。

这些不良处理方法,会类似毒液,慢慢会渗入你的骨髓、心脏 ,导致你荒废了宝贵的年轻岁月,而到头来自己不仅不能有更加良好的收获,同时别人对你的看法也日渐行远。

较佳处理办法: 遇到问题,分析、思考,积极心态应对。

麦肯锡三原则较适用:

1 基于事实

2 系统化

3 大胆假设,小心验证

 

古人云:见微知著就是这个意思吧。

职业话题杂谈

最近半年期间关于职业、工作话题方面的,分别和几个同学、亲戚、前公司同事、目前公司的同事等等,沟通了一下。 如职业发展?  怎么才能变成为更优秀的程序员等等。 随着沟通的进行,自己获益良多,觉得有必要巩固并记录下来这段心路历程。

首先,你想做什么样的人?

这句话很空泛,但是确确实实是个大道理,即,你需要有较为清晰的目的和积极上进的态度。 好的回答如: “我想在我目前的岗位踏踏实实的工作,做出成绩。”, “我想成为一名优秀的高级软件工程师”, “我想当**经理”, “我想在一个有空调的办公室里面上班” 。。。    不好的回答如: “你能给我介绍个工作吗?”, “我也不知道,混一天算一天吧”, “我的辉煌岁月如何如何,如在大学怎没怎么地了不起”。 我们知道,在地图上,最重要的2个要素是:坐标和方向。

第一点说明了方向非常重要。

其次,你要往这个方向去靠

首先要牢记:没有一家公司会给你的过去买单。同时,机会是给有准备的头脑的。 你日常工作的8小时之外时间,决定了你未来能做一个什么样的人: 有无成功的案例、有无所需的基因、有无态度、有无恒心等等。

“忙”是大多数人的托词和借口: 如日复一日的坚持每日下班看2集电视剧,周末宅在家里玩玩dota,上班不遗余力的翻看已经泛滥的八卦新闻……  根据我的切身体会,一个人在短期内有可能工作很忙、时间很紧张,但是在一个较长期的时间,如2~3年,肯定有大量不忙的时候, 多应用《时间管理》方法,把这些碎片的时间利用起来,逐渐促织成你的“中国梦” 。

入门级办法:   站在巨人肩膀上 – 读读相关书籍、订阅相关blog、 加入相关BBS。

线下交互办法: 周末多参加OpenParty类似的技术沙龙,尽量参加一些公益志愿者活动和不同的行业的人聊天、交换思想,逐渐丰富自己的视界。

最高效果的办法: 坚持长年累月的写blog、 写写书、 翻译翻译英文书籍、去沙龙发表演讲,把心得、总结为文字记录下来以督促自己坚持进步。

第二点说明了坐标很重要。

最后,养成个习惯

李嘉诚: “栽种思想,成就行为;栽种行为,成就习惯;栽种习惯,成就性格;栽种性格,成就命运。” 积累是个漫长的过程,尤其是做技术积累更是如此,需要在大量的工程实践和无数个挑灯夜战、解决客户棘手问题的间隙,挤出时间来慢慢积累和成长,然后,就可以顺其自然的获得“收获”。 如《代码大全 第二版》 P 835: “如果你能抽出少量时间阅读和学习编程知识,要不了多久就能鹤立鸡群。”