转载 | Linux管理员应该了解的20条IPTables防火墙规则用法

iptable是所有网站运维管理员都需要了解的一门技术。本文转载自sysgeek.cn

管理网络流量是系统管理员必需处理的最棘手工作之一,我们必需规定连接系统的用户满足防火墙的传入和传出要求,以最大限度保证系统免受攻击。

很多用户把 Linux 中的 IPTables 当成一个防火墙,从严格意见上来说 IPTables 只是能够帮助管理员定义各种规则并与 Linux Kernel 进行沟通的一个命令行工具。它只是帮助管理员配置网络流量的传入、传出规则列表,具体的实现其实是在 Linux 内核当中。

IPTables 包括一组内置和由用户定义规则的「链」,管理员可以在「链」上附加各种数据包处理规则。

FILTER 默认过滤表,用来对数据包进行过滤,具体的规则要求决定如何处理一个数据包。内建的链有:

  • INPUT:处理流入本地的数据包
  • FORWARD:处理通过系统路由的数据包
  • OUTPUT:处理本地流出的数据包

NAT 实现网络地址转换的表(IP、端口),nat 全称:network address translation 网络地址转换。内建的链有:

  • PREROUTING:处理即将接收的数据包
  • OUTPUT:处理本地产生的数据包
  • POSTROUTING:处理即将传出的数据包

MANGLE 主要用来修改数据包的服务类型,生存周期TTL,为数据包设置标记,实现流量整形、策略路由等实现QOS,共 5 条链:

  • PREROUTING:处理传入连接
  • OUTPUT:处理本地生成的数据包
  • INPUT:处理报文
  • POSTROUTING:处理即将传出数据包
  • FORWARD:处理通过本机转发的数据包

RAW表决定数据包是否被状态跟踪机制处理:

  • PREROUTING:处理传入连接
  • OUTPUT:处理本地生成的数据包

接下来我们将由简入难介绍 25 条 Linux 管理员最常会用到的 IPTables 规则。

1、启动、停止和重启IPTables

虽然 IPTables 并不是一项服务,但在 Linux 中还是可以像服务一样对其状态进行管理。

基于SystemD的系统

systemctl start iptables
systemctl stop iptables
systemctl restart iptables

基于SysVinit的系统

/etc/init.d/iptables start
/etc/init.d/iptables stop
/etc/init.d/iptables restart

2、查看IPtables防火墙策略

你可以使用如下命令来查看 IPtables 防火墙策略:

iptables -L -n -v 以上命令应该返回数据下图的输出:

IPtables

以上命令是查看默认的 FILTER 表,如果你只希望查看特定的表,可以在 -t 参数后跟上要单独查看的表名。例如只查看 NAT 表中的规则,可以使用如下命令:

iptables -t nat -L -v –n    

3、屏蔽某个IP地址

如果你发布有某个 IP 向服务器导入攻击或非正常流量,可以使用如下规则屏蔽其 IP 地址:

iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP 注意需要将上述的 XXX 改成要屏蔽的实际 IP 地址,其中的 -A 参数表示在 INPUT 链的最后追加本条规则。(IPTables 中的规则是从上到下匹配的,一旦匹配成功就不再继续往下匹配)

如果你只想屏蔽 TCP 流量,可以使用 -p 参数的指定协议,例如:

iptables -A INPUT -p tcp -s xxx.xxx.xxx.xxx -j DROP

4、解封某个IP地址

要解封对 IP 地址的屏蔽,可以使用如下命令进行删除:

iptables -D INPUT -s xxx.xxx.xxx.xxx -j DROP 其中 -D 参数表示从链中删除一条或多条规则。

5、使用IPtables关闭特定端口

很多时候,我们需要阻止某个特定端口的网络连接,可以使用 IPtables 关闭特定端口。

阻止特定的传出连接:

iptables -A OUTPUT -p tcp --dport xxx -j DROP 阻止特定的传入连接:

iptables -A INPUT -p tcp --dport xxx -j ACCEPT

6、使用Multiport控制多端口

使用 multiport 我们可以一次性在单条规则中写入多个端口,例如:

iptables -A INPUT  -p tcp -m multiport --dports 22,80,443 -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --sports 22,80,443 -j ACCEPT

7、在规则中使用 IP 地址范围

在 IPtables 中 IP 地址范围是可以直接使用 CIDR 进行表示的,例如:

iptables -A OUTPUT -p tcp -d 192.168.100.0/24 --dport 22 -j ACCEPT

8、配置端口转发

有时我们需要将 Linux 服务器的某个服务流量转发到另一端口,此时可以使用如下命令:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 25 -j REDIRECT --to-port 2525

上述命令会将所有到达 eth0 网卡 25 端口的流量重定向转发到 2525 端口。

9、屏蔽HTTP服务Flood攻击

有时会有用户在某个服务,例如 HTTP 80 上发起大量连接请求,此时我们可以启用如下规则:

iptables -A INPUT -p tcp --dport 80 -m limit --limit 100/minute --limit-burst 200 -j ACCEPT

上述命令会将连接限制到每分钟 100 个,上限设定为 200。

10、禁止PING

对 Linux 禁 PING 可以使用如下规则屏蔽 ICMP 传入连接:

iptables -A INPUT -p icmp -i eth0 -j DROP

11、允许访问回环网卡

环回访问(127.0.0.1)是比较重要的,建议大家都开放:

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

12、屏蔽指定MAC地址

使用如下规则可以屏蔽指定的 MAC 地址:

iptables -A INPUT -m mac --mac-source 00:00:00:00:00:00 -j DROP

13、限制并发连接数

如果你不希望来自特定端口的过多并发连接,可以使用如下规则:

iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT 以上规则限制每客户端不超过 3 个连接。

14、清空IPtables规则

要清空 IPtables 链可以使用如下命令:

iptables -F 要清空特定的表可以使用 -t 参数进行指定,例如:

iptables -t nat –F

15、保存IPtables规则

默认情况下,管理员对 IPtables 规则的操作会立即生效。但由于规则都是保存在内存当中的,所以重启系统会造成配置丢失,要永久保存 IPtables 规则可以使用 iptables-save 命令:

iptables-save > ~/iptables.rules 保存的名称大家可以自己改。

16、还原IPtables规则

有保存自然就对应有还原,大家可以使用 iptables-restore 命令还原已保存的规则:

iptables-restore < ~/iptables.rules

17、允许建立相关连接

随着网络流量的进出分离,要允许建立传入相关连接,可以使用如下规则:

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 允许建立传出相关连接的规则:

iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

18、丢弃无效数据包

很多网络攻击都会尝试用黑客自定义的非法数据包进行尝试,我们可以使用如下命令来丢弃无效数据包:

iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

19、IPtables屏蔽邮件发送规则

如果你的系统不会用于邮件发送,我们可以在规则中屏蔽 SMTP 传出端口:

iptables -A OUTPUT -p tcp --dports 25,465,587 -j REJECT

20、阻止连接到某块网卡

如果你的系统有多块网卡,我们可以限制 IP 范围访问某块网卡:

iptables -A INPUT -i eth0 -s xxx.xxx.xxx.xxx -j DROP

源地址可以是 IP 或 CIDR。


php 邮件验证

起因是昨天看到有人twitter上吐槽网站遇到注册机:

一般拿来说,对于初级的注册机,可以在页面上添加一些字段作为session验证。也可以做一个IP统计窗口,同一个IP注册时限不得低于10s,IP连续注册超过N个识别为恶意IP然后封禁。

还有一个简单的办法,就是做邮箱有效性判断。当然也可以将这几个办法结合起来。这里我贴一个github上的邮箱有效性判断的代码。来源已经不记得在哪了Orz

function emailValidate($email)
{
    $isValid = true;
    $atIndex = strrpos($email, "@");
    if (is_bool($atIndex) && !$atIndex) {
        $isValid = false;
    } else {
        $domain = substr($email, $atIndex + 1);
        $local = substr($email, 0, $atIndex);
        $localLen = strlen($local);
        $domainLen = strlen($domain);
        if ($localLen < 1 || $localLen > 64) {
            // local part length exceeded
            info('local part length exceeded:' . $localLen);
            $isValid = false;
        } else if ($domainLen < 1 || $domainLen > 255) {
            // domain part length exceeded
            info('domain part length exceeded:' . $domainLen);
            $isValid = false;
        } else if ($local[0] == '.' || $local[$localLen - 1] == '.') {
            // local part starts or ends with '.'
            info('local part starts or ends with .:' . $localLen);
            $isValid = false;
        } else if (preg_match('/\\.\\./', $local)) {
            // local part has two consecutive dots
            info('local part has two consecutive dots:' . $local);
            $isValid = false;
        } else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain)) {
            // character not valid in domain part
            info('character not valid in domain part:' . $domain);
            $isValid = false;
        } else if (preg_match('/\\.\\./', $domain)) {
            // domain part has two consecutive dots
            info('domain part has two consecutive dots:' . $domain);
            $isValid = false;
        } else if (!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/', str_replace("\\\\", "", $local))) {
            // character not valid in local part unless
            // local part is quoted
            if (!preg_match('/^"(\\\\"|[^"])+"$/', str_replace("\\\\", "", $local))) {
                info('character not valid in local part: ' . $local);
                $isValid = false;
            }
        }
        if ($isValid && !(checkdnsrr($domain, "MX") || checkdnsrr($domain, "A"))) {
            // domain not found in DNS
            $isValid = false;
        }
    }
    return $isValid;
}

令人厌烦的支付宝改版

在面向普通用户的app,阿里已经被吐槽和很多次,每次改版都把app界面改的面目全非。

吐槽一下面向开发者也是如此。

我原本是寻找签约“批量付款到账户”的入口。原本的界面应该是这样的:

在产品商店里就可以找得到了。然而现在的界面是这样的:

应该是图上的那个地方签约吧,满怀期待地进去之后,顿时傻了。。。。

又各种乱找一番,还是找不到。。。。。

最后还是放弃了,直接谷歌吧

总之签约完成就ok了。

下面是一些开发过程中的问题,记录一下。

ILLEGAL_PARTNER_EXTERFACE 错误

没有权限访问该服务

有以下的几种原因: 1、没有签约这个接口的合同。 2、签约了相应的接口合同,但没有生效。 3、签约了相应的接口合同,但由于违规违法等原因被审核部门强制关闭。

出现这种情况最常见的原因是: 接口用错。如,签约的是担保交易的接口合同,商户网站上使用的却是双功能-担保/即时;签约的是担保交易的接口合同,商户网站上使用的却是即时到帐。

批量付款申请提交失败,付款账号不存在

提交的请求的账号参数有问题。

解决方案:

确认在渠道参数中填写的信息,与当前支付宝账号中的信息完全一致,特别是邮箱、账户名称等,需要完全一致才可以。

申请提交失败,证书有误,无法复核批次记录

支付宝批量付款需要安装数字证书,未安装数字证书导致的。

解决方案:

安装 “支付宝数字证书”


一些云服务器推荐

作为软件工程师,尤其是后端开发工程师,多多少少都有接触过云服务器。也有很多刚入门的小鲜肉们好奇应该怎么入门选择云服务器。这一篇我推荐一些接触过的云服务器。

另外关于云服务器和虚拟主机、vps的区别,这里我不做过多区分。想进一步了解的可以百度一下。

强烈推荐: linode

vps中的高富帅,在美国、德英国、新加坡、日本共有9处机房位置,非常稳定。换过下文好多家,最终还是用了 linode。 使用上面的链接注册,你可以获得20刀的优惠券。

国外

国外云主机的好处在于不需要备案即可搭建网站。国内的云主机也可以用,未备案的情况下往往是把80端口封禁起来的,比如 aws 和 阿里云。

  1. 阿里云国际版 三网体验好。贵。真心贵。新用户有优惠券20刀。 只能用国外信用卡或者 paypal 绑定,需要有国外手机号。不接受国内信用卡。

  2. Digital Oceanvps服务商,新贵,刚出来的时候还蛮良心的,现在不太给力了,延迟有点高。

  3. heroku 严格来说这个并不是云服务器,而是一个与 GAE 类似的 PaaS 服务。服务器并不在你的手上,你可以上传 php 代码然后让他自动运行。注册后绑定信用卡,每个月就可以在最小费用内使用1000小时,相当于免费。(注意不要超限,很贵的

  4. 亚马逊AWS 免费体验一年。还是蛮良心的,不过也是慢。当时不小心超额了扣了我3美元,和客服抱怨之后客服给我返还了5美元。也是蛮好的。国内访问速度慢+1。国内机房需要备案。

  5. 微软Azure 注册送200刀,期限30天,同样需要信用卡验证,不授权不会自动扣款。直接说结论,不好用。

  6. Vultr 又一个vps服务商,没用过,经常听到。

  7. 樱花vps 日本线路王牌。注册很麻烦,还需要日本住址,又全是日文,看看而已就没深入研究了。据说 ping 值常年在 80ms 左右,算是很好的了。

  8. 搬瓦工 便宜,没用过,经常听到。

国内

国内云主机的访问速度快,但是如果对外访问的话,域名需要备案。

  1. 阿里云 国内性价比比较高的服务器了。从域名备案到建站,一条龙服务,要什么有什么。出的事故,不多不少吧。挖电缆什么的断网这种事情都能遇上。

  2. 青云 国内高富帅云服务器厂商,CEO 都是海归派。技术还是可以信赖的。除了贵。稳定性不错。今年17年北京机房出了一起事故,其它好像没什么问题了。

  3. 腾讯云 前段时间的腾讯云1分钱竞标的新闻还是蛮有效果的。我没有用过,感觉还是贵。

  4. Ucloud 最近故障和负面消息不少。没用过。


谷歌人机验证 reCAPTCHA 的解决办法

首先声明这个不是破解谷歌 reCAPTCHA 的意思Orz

当前世界范围的IPv4地址紧张,运营商给自家用户常常分配同一个IP上网(这句可以无视666)。在这种情况下访问谷歌搜索,容易被谷歌 reCaptcha 误伤识别成疑似机器人。这篇文章讨论如何避免这种情况。

接下来是正文

以前进行谷歌搜索的时候,都是很正常的。最近服务器发生了一些变动,在地址栏直接输入关键字搜索,就跳出了人机验证的界面,如下图

第一次遇到只要点击窗口就没有问题了,心里还感叹了下谷歌能把人机验证这事做的这么好,不错。然而这个窗口还是会不断调出来扰人= =

次数多了之后 Google 还会弹出一个窗口,要求输入传统的验证码或者跳出阿猫阿狗汽车的图片让你选择。

关于谷歌人机验证的详细新闻,可以看雷锋网的这篇文章——《与恼人的验证码说拜拜,Google用一次点击区分人与机器》。我猜测这是多人公用同一个谷歌搜索的站点引起的问题。Google reCaptcha 功能会在收集大量信息,包括IP地址和cookies,然后通过收集这些数据对比用户是否和过去在互联网上的行为一致,来判定这个用户究竟是不是机器人。

在好基友的帮助下我找到了一个折中解决的办法。简单说来就是新建一个搜索引擎,指定想要的搜索地址就好(最好避开与你共用一条线路的用户访问的谷歌搜索的站点——主站.com,香港.hk和日本.co.jp这一类)。下面是具体的步骤:

1 访问 <google.com/ncr>,随便搜索一个关键字。(ncr=no country redirect不做国家跳转) 2 修改浏览器默认搜索引擎。下面以 Chrome 为例:

打开设置

管理搜索引擎

自定义搜索引擎,并且设为默认搜索引擎

将自定义搜索的地址改成各种天花乱坠的谷歌 + /search?q=%s ,比如

亚洲:

蒙古 google.mn蒙古语
韩国 google.co.kr 韩语
日本 google.co.jp 日语
越南 google.com.vn 越南语
老挝 google.la 老挝语
柬埔寨 google.com.kh 高棉语
泰国 google.co.th 泰语
马来西亚 google.com.my 马来语
新加坡 google.com.sg 马来语
文莱达鲁萨兰国 google.com.bn 马来语
菲律宾 google.com.ph 菲律宾语
印度尼西亚 google.co.id 印尼语
东帝汶 google.tp 葡萄牙语
哈萨克斯坦 google.kz 哈萨克语
吉尔吉斯斯坦 google.kg 吉尔吉斯语
塔吉克斯坦 google.com.tj 塔吉克语
乌兹别克斯坦 google.co.uz 乌兹别克语
土库曼斯坦 google.tm 土库曼语
阿富汗 google.com.af 波斯语
巴基斯坦 google.com.pk 乌尔都语
尼泊尔 google.com.np 尼泊尔语
印度 google.co.in 英语
孟加拉国 google.com.bd 英语
斯里兰卡 google.lk 僧伽罗语
马尔代夫 google.mv 马尔代夫语
科威特 google.com.kw 阿拉伯语
沙特阿拉伯 google.com.sa 阿拉伯语
巴林 google.com.bh 阿拉伯语
阿联酋 google.ae 阿拉伯语
阿曼 google.com.om 阿拉伯语
约旦 google.jo 阿拉伯语
以色列 google.co.il 阿拉伯语
黎巴嫩 google.com.lb 阿拉伯语
土耳其 google.com.tr 土耳其语
阿塞拜疆 google.az 阿塞拜疆语
亚美尼亚 google.am 亚美尼亚语英语
莱索托 google.co.ls 莱索托语

欧洲: 欧洲:

冰岛 google.is英语
丹麦 google.dk 丹麦语
挪威 google.no 挪威语
瑞典 google.se 瑞典语
芬兰 google.fi 芬兰语
爱沙尼亚 google.ee 爱沙尼亚语
拉脱维亚 google.lv 拉脱维亚语
立陶宛 google.lt 立陶宛语
爱尔兰 google.ie 爱尔兰语
英国 google.co.uk 英语
根西 google.gg
泽西 google.je
马恩 google.im
法国 google.fr 法语
荷兰 google.nl 荷兰语
比利时 google.be 荷兰语
卢森堡 google.lu 德语
德国 google.de 德语
奥地利 google.at 德语
瑞士 google.ch 德语
列支敦士登 google.li 德语
葡萄牙 google.pt 葡萄牙语
西班牙 google.es 西班牙语
直布罗陀 google.com.gi 西班牙语
安道尔 google.ad 法语
意大利 google.it 意大利语
马耳他 google.com.mt 马耳他语
圣马力诺 google.sm 意大利语
希腊 google.gr 希腊语
俄罗斯 google.ru 俄语
白俄罗斯 google.com.by 白俄罗斯语
乌克兰 google.com.ua 乌克兰语
波兰 google.pl 波兰语
捷克 google.cz 捷克语
斯洛伐克 google.sk 斯洛伐克语
匈牙利 google.hu 匈牙利语
斯洛文尼亚 google.si 斯洛文尼亚语
克罗地亚 google.hr 克罗地亚语
波黑 google.ba 塞尔维亚语
黑山 google.me 黑山语
塞尔维亚 google.rs 塞尔维亚语
马其顿 google.mk 马其顿语
保加利亚 google.bg 保加利亚语
罗马尼亚 google.ro 罗马尼亚语
摩尔多瓦 google.md 摩尔多瓦语

非洲: 非洲:

埃及 google.com.eg 阿拉伯语
利比亚 google.com.ly 阿拉伯语
阿尔及利亚 google.dz 阿拉伯语
摩洛哥 google.co.ma 阿拉伯语
塞内加尔 google.sn 法语
冈比亚 google.gm 英语
马里 google.ml 法语
布基纳法索 google.bf 法语
塞拉利昂 google.com.sl 英语
科特迪瓦 google.ci 法语
加纳 google.com.gh 英语
多哥 google.tg 法语
贝宁 google.bj 法语
尼日尔 google.ne 法语
尼日利亚 google.com.ng 英语
圣赫勒拿 google.sh 英语
喀麦隆 google.cm 法语
乍得 google.td 阿拉伯语
中非 google.cf 法语
加蓬 google.ga 法语
刚果(布) google.cg 法语
刚果(金) google.cd 法语
安哥拉 google.it.ao 葡萄牙语
埃塞俄比亚 google.com.et 安哈拉语
吉布提 google.dj 阿拉伯语
肯尼亚 google.co.ke 英语
乌干达 google.co.ug 英语
坦桑尼亚 google.co.tz 英语
卢旺达 google.rw 卢旺达语
布隆迪 google.bi 布隆迪语
马拉维 google.mw 契瓦语
莫桑比克 google.co.mz 葡萄牙语
马达加斯加 google.mg 马尔加什语
塞舌尔 google.sc 英语
毛里求斯 google.mu 英语
赞比亚 google.co.zm 英语
津巴布韦 google.co.zw 英语
博茨瓦纳 google.co.bw 茨瓦纳语
纳米比亚 google.com.na 南非荷兰语
南非 google.co.za

大洋洲:

澳大利亚 google.com.au 英语
诺福克岛 google.com.nf 英语
新西兰 google.co.nz 英语
所罗门群岛 google.com.sb Pidgin
斐济 google.com.fj 印地语
密克罗尼西亚 google.fm 英语
基里巴斯 google.ki 吉尔伯特语
瑙鲁 google.nr 瑙鲁语
托克劳 google.tk 英语
萨摩亚 google.ws 英语
东萨摩亚 google.as 萨摩亚语
汤加 google.to 英语
纽埃 google.nu 纽埃语
库克群岛 google.co.ck 毛利语 法语
多米尼加 google.com.do 西班牙语
特立尼达和多巴哥google.tt
哥伦比亚 google.com.co 西班牙语
厄瓜多尔 google.com.ec 西班牙语
委内瑞拉 google.co.ve 西班牙语
圭亚那 google.gy 英语
秘鲁 google.com.pe 西班牙语
玻利维亚 google.com.bo 西班牙语
巴拉圭 google.com.py 西班牙语
巴西 google.com.br 葡萄牙语
乌拉圭 google.com.uy 西班牙语
阿根廷 google.com.ar 西班牙语
智利 google.cl 西班牙语

美洲:

格陵兰 google.gl 格陵兰语
美国 google.com 英语
墨西哥 google.com.mx 西班牙语
危地马拉 google.com.gt 西班牙语
伯利兹 google.com.bz 英语
萨尔瓦多 google.com.sv 西班牙语
洪都拉斯 google.hn 西班牙语
尼加拉瓜 google.com.ni 西班牙语
哥斯达黎加 google.co.cr 西班牙语
巴拿马 google.com.pa 西班牙语
巴哈马 google.bs 英语
古巴 google.com.cu 西班牙语
牙买加 google.com.jm 英语
海地 google.ht

Safari

特别的,针对于 Mac 用户以及 Safari 蛋疼的尿性——没办法自定义搜索引擎,可以通过插件『Clean Links for Google』达到不再重定向、直达.com的作用。

当然,要使得这个插件生效,你同样需要先访问 <google.com/ncr> 。再接下来地址栏搜索,就会直达 .com 网站啦。

参考资料