存档

‘运维安全技术’ 分类的存档

centOS7 下利用iptables配置IP地址白名单

2017年1月3日 评论已被关闭

centOS7 下利用iptables配置IP地址白名单
http://blog.chinaunix.net/uid-13344516-id-4573922.html
编辑iptables配置文件,将文件内容更改为如下,则具备了ip地址白名单功能
#vim /etc/sysconfig/iptables

点击(此处)折叠或打开
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-N whitelist
-A whitelist -s 1.2.3.0/24 -j ACCEPT
-A whitelist -s 4.5.6.7 -j ACCEPT
-A INPUT -m state –state RELATED,ESTABLISHED -j whitelist
-A INPUT -m state –state NEW -m tcp -p tcp –dport 22 -j whitelist
-A INPUT -m state –state NEW -m tcp -p tcp –dport 8080 -j whitelist
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -j REJECT –reject-with icmp-host-prohibited
-A FORWARD -j REJECT –reject-with icmp-host-prohibited
COMMIT
6~8 行是添加白名单列表,可以是ip段或者单个ip地址
10~12行 注意的是“-j whitelist”而不是“-j ACCEPT”,前者将该端口访问权限限制在白名单内,后者为不限制
13行 任何ip地址都能ping通该主机,因为“-j ACCEPT”没有做相应限制

配置完毕后,运行命令重启防火墙使规则生效
#systemctl restart iptables.service

利用CentOS系统IPtables防火墙添加网站IP白名单

2017年1月3日 评论已被关闭

利用CentOS系统IPtables防火墙添加网站IP白名单

http://www.cnblogs.com/wuling129/p/4996487.html

参考博文:

利用CentOS系统IPtables防火墙添加360网站卫士节点IP白名单

centos6.5添加白名单如下:

在防火墙 配置文件中加入白名单 ip

-A INPUT -s 183.136.133.0/24 -j ACCEPT

批量添加 参考博文 如上!

查看iptables规则是否生效

[root@ithov ~]# iptables -nL

正确设置php-fpm子进程用户,提高网站安全性防挂马

2016年12月11日 评论已被关闭

正确设置php-fpm子进程用户,提高网站安全性防挂马

http://www.lowxp.com/g/article/detail/281

根据生产环境不断反馈,发现不断有 PHP网站被挂木马,绝大部分原因是因为权限设置不合理造成。因为服务器软件,或是 php 程序中存在漏洞都是难免的,在这种情况下,如果能正确设置 Linux 网站目录权限, php 进程权限,那么网站的安全性实际上是可以得到保障的。

那么,造成网站被挂木马的原因是什么?

ftp 连接信息被破解,对这个原因,可行的办法就是使用非常复杂的FTP 用户名(不要使用常用的用户名),如果是固定作业,可考虑使用 iptables 防火墙限制来源 IP 。但是一些情景下,可能需要使用 VPN 以便远程维护。 即网站维护者需要使用 FTP 修改网站文件时,必须先登录到 IDC 机房的 VPN 服务器上,再进行后续的操作。

网站服务器软件/ 配置 /php 程序存在漏洞,被利用,在讨论这个问题前,先说明文件及进程权限的几个概念:

FTP用户对网站目录具有最大修改权限,那么网站的文件所有者一定属于 FTP,  这是毋庸置疑的 , 否则如何修改文件呢?

php-fpm进程, Nginx 进程对网站文件至少需要有读取权限,例如,以下命令即可查看这两个进程所使用的账号:

php-fpm-security1

php-fpm-security2

通过上图,我们可以发现,nginx 和 php-fpm 子进程账号是 nobody 。

我们再查看网站文件目录的权限:

php-fpm-security3

发现网站文件所有者是www 账号,那说明:

  • nginx和 php 对网站只有读取权限,无写入权限
  • 如果php 程序需要对网站某些文件有写入权限,需要手工将文件或目录权限修改为 777
  • 因为php-fpm 子进程是以 nobody 运行,那么 php-fpm 生成的新文件所有者也是 nobody, 这时 ftp 用户将无法修改这些文件,解铃还需系铃人,当 php 生成文件后,需要调用 chmod(“/somedir/somefile”, 0777) 将文件权限修改为 777 ,以便 FTP 用户也可以修改这个文件。
  • 经常有开发人员找我请求重设php 生成的文件的权限。
  • 如果php-fpm 子进程以网站文件所有者用户运行,那意味着 php-fpm 进程对整个网站目录具有可写权限,噩梦也就由此开始。

但是我们发现,有不少系统管理员为了省事,违背了Linux 最小化权限的原则,设置 php-fpm 进程以网站文件所有者账号运行,当然这样可能会方便 php 开发人员( php-fpm 进程对整个网站目录具有可写权限),但是这样一来, Linux 体系的文件系统权限原则将被打破,所有的安全措施将形同虚设。可以想象的是,万一 php 程序中有漏洞,攻击者上传木马,便可以修改网站的所有文件,网站首页被黑,也就不足为怪了。

退一步,如果我们设置了较严格的权限,就算php 程序中存在漏洞,那么攻击者也只能篡改权限为 777 的目录,其它的文件是无法被改写的,网站不就就得更安全了吗?

核心总结:php-fpm 子进程所使用的用户,不能是网站文件所有者。 凡是违背这个原则,则不符合最小权限原则。

经过我参阅网上关于nginx, php-fpm 配置的文章教程和市面上的一些书籍,发现有不少人受这些文章的误导,直接让 php-fpm 子进程以网站所有者账号运行,例如张宴的《实战 nginx 取代 apache 的高性能 Web 服务器》一书的 52 页中,存在以下设置:

www
www

官方提供的配置文件中,php-fpm 子进程使用 nobody 用户,这完全是合理的,无须修改。

那么nginx 的子进程用户,如何设置合理?我的建议是也使用 nobody (对错误日志写入等无影响),设置方法如下:

nginx.conf文件第一行设置为 user nobody; , 再执行 nginx -s reload 即可。

php-fpm子进程用户设置方法:

编辑文件php-fpm.conf (一般位于 /usr/local/php/etc/php-fpm.conf 视安装参数为准),找到 user 、group 两个参数的定义,将其设置为nobody( 默认已经是 nobody) ,再重启 php-fpm 进程即可。

网站可写目录的特殊注意

这里的可写,是相对php-fpm 子进程而言。一个网站最容易出安全问题的即是可写目录,如果可写目录权限能控制严格,安全系数也将大大提高。
我们认为,一个网站可写目录主要分为以下几种:

  1. php 数据缓存目录,如 discuz 的 forumdata 目录,就存放了大量数据缓存文件。此类目录一般会禁止用户直接访问,但是 discuz 在这个目录下又存放了不少 js, css 文件,我们并不能简单地拒绝用户访问这个目录。显然,这个目录下的所有文件,不能直接交给 php 解析,我们后面会给出解决方案。
  2. 附件上传目录。显然此类目录需要开启访问,但不能交由php 引擎解析(即这个目录下的所有文件均视为普通静态文件)。
  3. 静态文件生成目录,这类目录下的文件全部应视为静态文件。
  4. 日志目录, 一般都会拒绝用户直接访问之。

也就是说对网站开发人员而言,需要对可写目录实现动静分离,不同性能的文件,应该区别对待之,这样也就方便系统管理员,设置合理的nginx 规则,以提高安全性。

简单地去掉php 文件的执行权限,并不能阻止 php-fpm 进程解析之。

接下来,根据以上总结,系统管理员如何配置nginx 的目录规则,才更安全呢?

数据缓存目录 /cache/,这个目录的特点是需要777 权限,无须提供给用户访问,那么可以按以下参考配置 nginx

location ~ “^/cache” {
return 403;
}

location ~ “.php$” {
fastcgi_pass 127.0.0.0:9000;
………………..
}

这时,任何用户将无法访问/cache/ 目录内容。

附件上传目录 attachments

此目录的特点是需要开放访问权限,但所有文件不能由php 引擎解析(包括后缀名改为 gif 的木马文件)

location ~ “^/attachments” {
}

location ~ “.php$” {
fastcgi_pass 127.0.0.0:9000;
………………..
}

注意,上面对attachments 目录的 location 定义中是没有任何语句的。 nginx 对正则表达式的 location 匹配优先级最高,任何一个用正则表达式定义的 location, 只要匹配一次,将不会再匹配其它正则表达式定义的 location 。

现在,请在attachments 目录下建立一个 php 脚本文件,再通过浏览器访问安,我们发现浏览器提示下载,这说明 nginx 把 attachments 目录下的文件当成静态文件处理,并没有交给 php fastcgi 处理。这样即使可写目录被植入木马,但因为其无法被执行,网站也就更安全了。

显然,重要的php 配置文件,请勿放在此类目录下。

静态文件生成目录 public

这些目录一般都是php 生成的静态页的保存目录,显然与附件目录有类似之处,按附件目录的权限设置即可。可以预见的是,如果我们设置了较严格的权限,即使网站php 程序存在漏洞,木马脚本也只能被写入到权限为 777 的目录中去,如果配合上述严格的目录权限控制,木马也无法被触发运行,整个系统的安全性显然会有显著的提高。

但是网站可写目录的作用及权限,只有开发人员最为清楚。这方面需要php 开发人员和系统管理员积极沟通。我们使用的方式是:项目上线前,开发人员根据以文档形式提供网站可写目录的作用及权限,由系统管理员针对不同目录进行权限设置。任何一方修改了网站目录权限,但未体现到文档中,我们认为是违反工作流程的

阿里提示Discuz memcache+ssrf GETSHELL漏洞的解决方法

2016年12月8日 评论已被关闭

阿里提示Discuz memcache+ssrf GETSHELL漏洞的解决方法

http://www.feichang56.com/discuz/

很多朋友肯定都收到阿里云提示discuz memcache+ssrf GETSHELL漏洞的相关说明,但购买阿里云云盾安骑士最少需要支付100块钱,下面我就给大家分享下如何来解决Discuz memcache+ssrf GETSHELL漏洞的问题。

漏洞分析:

discuz存在SSRF漏洞,在配置了memcache的情况下,攻击者可以利用ssrf通过memcache中转,向磁盘上写入WEBSHELL恶意代码,从而造成数据库泄漏。

解决方法一:

下载利用云盾安骑士修复之后的function_core.php文件覆盖原文件即可。

文件路劲:/source/function/function_core.php

修复之后的文件下载:点击下载

也可以在1090行之后加入如下代码:

if(!empty($_G[‘setting’][‘output’][‘preg’][‘search’]) && (empty($_G[‘setting’][‘rewriteguest’]) || empty($_G[‘uid’]))) {
if(empty($_G[‘setting’][‘domain’][‘app’][‘default’])) {
$_G[‘setting’][‘output’][‘preg’][‘search’] = str_replace(‘\{CURHOST\}’, preg_quote($_G[‘siteurl’], ‘/’), $_G[‘setting’][‘output’][‘preg’][‘search’]);
$_G[‘setting’][‘output’][‘preg’][‘replace’] = str_replace(‘{CURHOST}’, $_G[‘siteurl’], $_G[‘setting’][‘output’][‘preg’][‘replace’]);
}

if (preg_match(“(/|#|\+|%).*(/|#|\+|%)e”, $_G[‘setting’][‘output’][‘preg’][‘search’]) !== FALSE) { die(“request error”); } $content = preg_replace($_G[‘setting’][‘output’][‘preg’][‘search’], $_G[‘setting’][‘output’][‘preg’][‘replace’], $content);
}

解决方法二:停止使用或卸载memcache

Windows下的Memcache卸载方法:

memcached -d stop

memcached -d remove

sc delete “Memcached Server”

linux memcached 卸载方法

1、首先查找你的memcached所在目录,可用如下命令查找名为memcached的文件夹
find / -name memcached
2、结束memcached进程
killall memcached
3、删除memcached目录及文件
rm -rf /www/wdlinux/memcached
rm -rf /www/wdlinux/init.d/memcached
4、关闭memcached开机启动
chkconfig memcached off
5、把memcached移出开机启动
chkconfig –del memcached

分类: Web安全防护 标签:

discuz教程:阿里提示Discuz memcache+ssrf GETSHELL漏洞的解决方法

2016年12月8日 评论已被关闭

discuz教程:阿里提示Discuz memcache+ssrf GETSHELL漏洞的解决方法
http://www.moke8.com/article-14352-1.html
很多同学肯定都收到阿里云提示discuz memcache+ssrf GETSHELL漏洞的相关说明,但购买阿里云云盾安骑士最少需要支付100块钱,下面我就在魔客吧给大家分享下如何来解决Discuz memcache+ssrf GETSHELL漏洞的问题。

该漏洞描述:discuz存在SSRF漏洞,在配置了memcache的情况下,攻击者可以利用ssrf通过memcache中转,向磁盘上写入WEBSHELL恶意代码,从而造成数据库泄漏

解决方法一:

利用云盾安骑士修复/source/function/function_core.php,用下面文件覆盖即可。
function_core.zip

 

也可以在1090行之后加入如下代码:

if(!empty($_G[‘setting’][‘output’][‘preg’][‘search’]) && (empty($_G[‘setting’][‘rewriteguest’]) || empty($_G[‘uid’]))) {
if(empty($_G[‘setting’][‘domain’][‘app’][‘default’])) {
$_G[‘setting’][‘output’][‘preg’][‘search’] = str_replace(‘\{CURHOST\}’, preg_quote($_G[‘siteurl’], ‘/’), $_G[‘setting’][‘output’][‘preg’][‘search’]);
$_G[‘setting’][‘output’][‘preg’][‘replace’] = str_replace(‘{CURHOST}’, $_G[‘siteurl’], $_G[‘setting’][‘output’][‘preg’][‘replace’]);
}

if (preg_match(“(/|#|\+|%).*(/|#|\+|%)e”, $_G[‘setting’][‘output’][‘preg’][‘search’]) !== FALSE) { die(“request error”); } $content = preg_replace($_G[‘setting’][‘output’][‘preg’][‘search’], $_G[‘setting’][‘output’][‘preg’][‘replace’], $content);
}

以下是魔客吧提供的云盾安骑士修复后的function_core.php文件,该文件在1089行加入了一段代码,具体见下载包

使用方法,下载文件解压后,上传覆盖/source/function/function_core.php,后台更新缓存即可。

解决方法二: 停止使用或卸载memcache

Windows下的Memcache卸载方法:

memcached -d stop

memcached -d remove

sc delete “Memcached Server”

linux memcached 卸载方法

1、首先查找你的memcached所在目录,可用如下命令查找名为memcached的文件夹
find / -name memcached
2、结束memcached进程
killall memcached
3、删除memcached目录及文件
rm -rf /www/wdlinux/memcached
rm -rf /www/wdlinux/init.d/memcached
4、关闭memcached开机启动
chkconfig memcached off
5、把memcached移出开机启动
chkconfig –del memcached

分类: Web安全防护 标签:

linux防火墙禁IP命令

2016年11月27日 评论已被关闭

linux防火墙禁IP命令
http://www.2cto.com/os/201304/205116.html
linux防火墙禁IP命令

linux下实用iptables封ip段的一些常见命令:

封单个IP的命令是:
iptables -I INPUT -s 211.1.0.0 -j DROP

封IP段的命令是:
iptables -I INPUT -s 211.1.0.0/16 -j DROP
iptables -I INPUT -s 211.2.0.0/16 -j DROP
iptables -I INPUT -s 211.3.0.0/16 -j DROP

封整个段的命令是:
iptables -I INPUT -s 211.0.0.0/8 -j DROP

封几个段的命令是:
iptables -I INPUT -s 61.37.80.0/24 -j DROP
iptables -I INPUT -s 61.37.81.0/24 -j DROP

想在服务器启动自运行的话有三个方法:
1、把它加到/etc/rc.local中
2、iptables-save >;/etc/sysconfig/iptables可以把你当前的iptables规则放到/etc/sysconfig/iptables中,系统启动iptables时自动执行。
3、service iptables save 也可以把你当前的iptables规则放/etc/sysconfig/iptables中,系统启动iptables时自动执行。
后两种更好此,一般iptables服务会在network服务之前启来,更安全。

解封的话:
iptables -D INPUT -s IP地址 -j REJECT
iptables -F 全清掉了

python,go,redis,mongodb,.net,C#,F#,服务器架构

分类: Linux防火墙iptables 标签:

YAD – Centos 7 IPtables IPset and Fail2ban

2016年11月17日 评论已被关闭

YAD – Centos 7 IPtables IPset and Fail2ban

 http://namsep.blogspot.hk/2015/12/yad-centos-7-iptables-ipset-and-fail2ban.html
Yet Another Draft

Securing Centos 7 with IPtables, IPset and Fail2ban.

Purpose
This is written for simple setup’s such as cloud servers. It makes detected actions by fail2ban be put to IPtables in an IPset list. Though fail2ban can do this by it self, the IPset list is not permanent and fail2ban needs to rescan the logs upon restart. This setup also allows other tools / scripts to add IP’s to the IPsets to be blocked permanently.

Why IPtables?
Running a firewall on servers is in my opinion way easier with IPtables then it is with firewallD. It’s not using zones and other complexity that you would like for a laptop or other mobile device but don’t want with a basic (web) server.

Why IPset?
IPset is way faster then adding many IP’s to the IPtables, it also keeps things readable.

The issue with IPset is (was) that settings are not saved, upon restarting your server the IPtables would fail because it references a matchlist that no longer exists, resulting in having no running firewall.

However, there is some code written by the Centos guys that solves this issue and hopefully will become mainstream.

https://bugzilla.redhat.com/show_bug.cgi?id=1136257#c16

In this post i will apply these configurations for IPv4 and IPv6 together. Even when you don’t use IPv6 it is still good to do because if your ISP enables IPv6 you might not notice and have not the same protection as with IPv4.

Replacing the default FirewallD firewall with IPtables
yum -y install iptables-services
systemctl stop firewalld
systemctl disable firewalld
systemctl start iptables
systemctl start ip6tables
systemctl enable iptables
systemctl enable ip6tables

Creating IPset as an service
vim /etc/systemd/system/ipset.service
paste contents of: http://pkgs.fedoraproject.org/cgit/ipset.git/tree/ipset.service

Creating the code the service runs on
mkdir /usr/libexec/ipset/
vim /usr/libexec/ipset/ipset.start-stop
past contents of: http://pkgs.fedoraproject.org/cgit/ipset.git/tree/ipset.start-stop
chmod +x /usr/libexec/ipset/ipset.start-stop

Creating the config / save file for IPset
systemctl enable ipset.service
mkdir /etc/ipset
touch /etc/ipset/ipset

Changing IPtables to save the config upon stopping and restarting.
vim /etc/syconfig/iptables-config
IPTABLES_SAVE_ON_STOP=”yes”
IPTABLES_SAVE_ON_RESTART=”yes”

Note:
Changing these IPtables values require you to make changes to the running firewall instead of editing the iptables file and restarting because upon stopping these changes are overwritten with the running config. You can stop the firewall and make changes to the file and then start it again. The syntax is slightly different.

Creating the IPsets
Create IPset’s to block IPv4 and IPv6 offenders, these sets must have unique names. The temporary blocks (1 hour , 3600 seconds) are for fail2ban to put an offender on that list. If the IP repeats eg 2 times then fail2ban can move it over to the indefinite list.

ipset create Block-Indefinite-4 hash:ip hashsize 4096
ipset create Block-Temporary-4 hash:ip hashsize 4096 timeout 3600

ipset create Block-Indefinite-6 hash:net hashsize 4096 family inet6
ipset create Block-Temporary-6 hash:net hashsize 4096 family inet6 timeout 3600

The IPv6 list hashes on NET instead of IP as with IPv6 you would like to block an subnet (/64). This is because the client can easily generate a new privacy address and thus try again. Creating a new subnet is for an average a lot more work, but for spammers this would not be such an issue. They should be banned on eg /48. No solutions for that at this moment.

Link IPset lists to IPtables
iptables -I INPUT 1 -p tcp -m set –match-set Block-Indefinite-4 src -m tcp -j DROP
iptables -I INPUT 2 -p tcp -m set –match-set Block-Temporary-4 src -m tcp -j DROP
ip6tables -I INPUT 1 -p tcp -m set –match-set Block-Indefinite-6 src -m tcp -j DROP
ip6tables -I INPUT 2 -p tcp -m set –match-set Block-Temporary-6 src -m tcp -j DROP

Putting these rules at position 1 and 2 is to make sure that when an attacker is detected and put to the blocklist it will be effective immediately instead of the next time due to “related or established session”.

As mentioned in the title, this is a draft post. But for now any IP added to the IPset is permanently stored.

Fail2ban

> Yet to be looked at.

* Use the -exist option to prevent messages on IP’s that are already in the list.
*

centos6.5 iptables实现端口转发

2016年11月12日 评论已被关闭

centos6.5 iptables实现端口转发

http://www.cnblogs.com/apexchu/p/4255551.html

将本地接口IP 61.144.a.b 的3389端口 转发到 116.6.c.d的3389      (主要访问到61.144.a.b的3389端口,就会跳转到116.6.c.d的3389)

【步骤】
1、 首先应该做的是/etc/sysctl.conf配置文件的 net.ipv4.ip_forward = 1 默认是0    这样允许iptalbes FORWARD。
2、 service iptables stop  关闭防火墙
3、 重新配置规则

iptables -t nat -A PREROUTING –dst 61.144.a.b -p tcp –dport 3389 -j DNAT –to-destination 116.
6.c.d:3389

iptables -t nat -A POSTROUTING –dst 116.6.c.d -p tcp –dport 3389 -j SNAT –to-source 61.144.a.b

service iptables save

将当前规则保存到 /etc/sysconfig/iptables
若你对这个文件很熟悉直接修改这里的内容也等于命令行方式输入规则。
5、 启动iptables 服务, service iptables start

可以写进脚本,设备启动自动运行;

# vi /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don’t
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local

sh /root/myshipin.log
———————————————————————
vi myshipin.log
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don’t
# want to do the full Sys V style init stuff.

iptables -F -t nat
iptables -t nat -A PREROUTING –dst 61.144.a.b -p tcp –dport 3389 -j DNAT –to-destination 116.6.c.d:3389
iptables -t nat -A POSTROUTING –dst 116.6.a.b -p tcp –dport 3389 -j SNAT –to-source 61.144.c.d
~
—————————————————————-
TCP

iptables -t nat -A PREROUTING –dst 61.144.a.b -p tcp –dport 9304 -j DNAT –to-destination 10.94.a.b:9304
iptables -t nat -A POSTROUTING –dst 10.94.a.b -p tcp –dport 9304 -j SNAT –to-source 61.144.a.b

UDP
iptables -t nat -A PREROUTING –dst 61.144.a.b -p udp –dport 9305 -j DNAT –to-destination 10.94.a.b:9305
iptables -t nat -A POSTROUTING –dst 10.94.a.b -p udp –dport 9305 -j SNAT –to-source 61.144.a.b

另:

iptables配置文件的位置:/etc/sysconfig/iptables 外网地址发变化在配置文件里修改就可以了。

centos6.5 iptables实现端口转发

2016年11月10日 评论已被关闭

centos6.5 iptables实现端口转发
http://www.cnblogs.com/apexchu/p/4255551.html
将本地接口IP 61.144.a.b 的3389端口 转发到 116.6.c.d的3389 (主要访问到61.144.a.b的3389端口,就会跳转到116.6.c.d的3389)

【步骤】
1、 首先应该做的是/etc/sysctl.conf配置文件的 net.ipv4.ip_forward = 1 默认是0 这样允许iptalbes FORWARD。
2、 service iptables stop 关闭防火墙
3、 重新配置规则

iptables -t nat -A PREROUTING –dst 61.144.a.b -p tcp –dport 3389 -j DNAT –to-destination 116.
6.c.d:3389

iptables -t nat -A POSTROUTING –dst 116.6.c.d -p tcp –dport 3389 -j SNAT –to-source 61.144.a.b

service iptables save

将当前规则保存到 /etc/sysconfig/iptables
若你对这个文件很熟悉直接修改这里的内容也等于命令行方式输入规则。
5、 启动iptables 服务, service iptables start
可以写进脚本,设备启动自动运行;
# vi /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don’t
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local

sh /root/myshipin.log
———————————————————————
vi myshipin.log
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don’t
# want to do the full Sys V style init stuff.

iptables -F -t nat
iptables -t nat -A PREROUTING –dst 61.144.a.b -p tcp –dport 3389 -j DNAT –to-destination 116.6.c.d:3389
iptables -t nat -A POSTROUTING –dst 116.6.a.b -p tcp –dport 3389 -j SNAT –to-source 61.144.c.d
~
—————————————————————-
TCP

iptables -t nat -A PREROUTING –dst 61.144.a.b -p tcp –dport 9304 -j DNAT –to-destination 10.94.a.b:9304
iptables -t nat -A POSTROUTING –dst 10.94.a.b -p tcp –dport 9304 -j SNAT –to-source 61.144.a.b

UDP
iptables -t nat -A PREROUTING –dst 61.144.a.b -p udp –dport 9305 -j DNAT –to-destination 10.94.a.b:9305
iptables -t nat -A POSTROUTING –dst 10.94.a.b -p udp –dport 9305 -j SNAT –to-source 61.144.a.b

另:

iptables配置文件的位置:/etc/sysconfig/iptables 外网地址发变化在配置文件里修改就可以了。

linux使用iptables实现端口转发

2016年11月10日 评论已被关闭

linux使用iptables实现端口转发
http://blog.sina.com.cn/s/blog_695d0b300101bdcg.html
例,将1.1.1.1的81端口的访问转发到2.2.2.2的80端口
iptables -t nat -A PREROUTING -d 1.1.1.1 -p tcp –dport 81 -j DNAT –to-destination 2.2.2.2:80
iptables -t nat -A POSTROUTING -s 0.0.0.0/0 -p tcp –dport 80 -j SNAT –to-source 1.1.1.1

以上命令在CentOS 6.2下测试通过

CentOS下配置防火墙 配置nat转发服务

2016年11月9日 评论已被关闭

CentOS下配置防火墙 配置nat转发服务
http://www.cnblogs.com/apexchu/p/4274416.html
CentOS下配置iptables防火墙

linux NAT(iptables)配置

CentOS下配置iptables

1,vim /etc/sysconfig/network 这里可以更改主机名称。

NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=BGI-TJ.localdomain
GATEWAY=192.168.11.1(超算网关)

2.vim /etc/sysconfig/network-scripts/ifcfg-eth0 第一块网卡。

Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet
DEVICE=eth0
BOOTPROTO=static
HWADDR=A4:BA:DB:43:XX:XX
IPADDR=192.168.11.2(公网地址)
NETMASK=255.255.255.0
ONBOOT=yes

GATEWAY=192.168.11.1 (可不设前面已经设置)

3.vim /etc/sysconfig/network-scripts/ifcfg-eth1 网卡2,就是内网

# Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet
DEVICE=eth1
BOOTPROTO=static
HWADDR=A4:BA:DB:43:XX:XX
IPADDR=192.168.136.1(内网地址)
NETMASK=255.255.255.0
ONBOOT=yes

4.vim /etc/sysctl.conf 这里是重点 配置路由转发,路由开启等都要用到。

# Controls IP packet forwarding
net.ipv4.ip_forward = 0

修改为

# Controls IP packet forwarding
net.ipv4.ip_forward = 1 允许内置路由

5.sysctl -p 更新

6.service network restart 从启网卡

7, 如果找不到 另一块网卡 可以改 加载。

http://www.cngr.cn/article/63/390/2006/2006071812486.shtml

/etc/network/interfaces 两块网卡 的内容 可以编辑

auto eth0
iface eth0 inet static
address 192.168.18.2
netmask 255.255.255.0
network 192.168.18.0
gateway 192.168.18.1

auto eth1
iface eth1 inet static
address 172.17.94.93
netmask 255.255.255.0
broadcast 172.17.94.255
gateway 172.17.94.254

默认是第一块网卡,可以设置两块同时开启

8.iptables -F

9.iptables -t nat -A POSTROUTING -s 192.168.136.0/24 -o eth0 -j SNAT –to 192.168.11.2 转发 到11网段。

10./etc/rc.d/init.d/iptables save 或者 service iptables save

11.service iptables restart

12.如果发现DNS无法解析,请输入下列命令 防火墙的问题 不用想。先都通过在根据配置更改。

iptables -P FORWARD ACCEPT

iptables -P OUTPUT ACCEPT

iptables -P INPUT ACCEPT

/etc/rc.d/init.d/iptables save

service iptables restart

iptables -A INPUT -i lo -j ACCEPT

iptables -A FORWARD -p tcp –dport 80 -j ACCEPT

iptables -A FORWARD -p tcp –dport 22 -j ACCEPT

iptables -A FORWARD -p tcp –dport 53 -j ACCEPT

iptables -A FORWARD -p udp –dport 53 -j ACCEPT

iptables -A FORWARD -p tcp –dport 25 -j ACCEPT

iptables -A FORWARD -p tcp –dport 110 -j ACCEPT

iptables -A FORWARD -p udp –dport 110 -j ACCEPT

iptables -A FORWARD -p tcp –dport 143 -j ACCEPT

iptables -A FORWARD -p udp –dport 143 -j ACCEPT

iptables -A FORWARD -p tcp –dport 993 -j ACCEPT

iptables -A FORWARD -p udp –dport 993 -j ACCEPT

iptables -A FORWARD -p tcp –dport 995 -j ACCEPT

iptables -A FORWARD -p udp –dport 995 -j ACCEPT

service iptables save

service iptables restart

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -i lo -j ACCEPT

iptables -A FORWARD -p tcp -j ACCEPT

iptables -A FORWARD -p udp -j ACCEPT

iptables -A FORWARD -p tcp –dport 1:65534 -j ACCEPT

service iptables save

service iptables restart

sysctl -p
service network restart
iptables -F
iptables -t nat -A POSTROUTING -s 192.168.*.*/24 -o eth0 -j SNAT –to ip地址。
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P INPUT ACCEPT
service iptables save
service iptables restart

iptables -A INPUT -i lo -j ACCEPT
iptables -A FORWARD -p tcp –dport 1:65534 -j ACCEPT
iptables -A FORWARD -p udp –dport 1:65534 -j ACCEPT
service iptables save
service iptables restart

默认为:

iptables -P INPUT DROP

iptables -P FORWARD DROP

iptables -P OUTPUT ACCEPT

会影响许多功能的使用。

就是ip 跳板,从一个ip 调到你想给大家使用的机器(屏蔽你不想直接用的口)端口镜像

iptables -t nat -A PREROUTING -d x.x.x.x(公网IP) -p tcp –dport 2200(端口号) -j DNAT –to 192.168.3.202:22(内网ip:内网IP端口)NAT默认路由
ip route add 192.168.6.0/24 via 192.168.11.2

或者 加一条网关 默认给你 想跳的ip 网段ip route add -net 192.168.6.0/24 gw 192.168.11.1

dev eth0 (那个网卡必须能与你想跳的网络通) 比如 192.168.11.0/24 与 192.168.6.0/24 互通。
说了这么多大家 新手很糊涂是吧呵呵。下面我们来实践一下吧 。

1. 准备工作
1.1 CentOS Final安装完毕,将不需要的服务停止

1.2 修改主机名:
1.2.1 /etc/sysconfig/network
1.2.2 /etc/hosts

1.3 网卡设置
1.3.1 单个IP /etc/sysconfig/network-scripts/ifcfg-eth0
1.3.2 IP段
#cd /etc/sysconfig/network-scripts/
#cp -a ifcfg-eth0 ifcfg-eth0-range0
#vi ifcfg-eth0-range0
DEVICE=eth0-range0
IPADDR_START=192.168.136.2 #设置地址段的起始IP
IPADDR_END=192.168.136.100 #设置地址段的结束IP
GATEWAY=192.168.136.1
NETMASK=255.255.255.0
CLONENUM_START=”20” #设置虚拟接口(CLONE–克隆)的起始“编号”在本例中,将从20开始,21,22,23……
NO_ALIASROUTING=yes #该选项可以设置在主配置文件中(ifcfg-eth0)
#虚拟接口可以继承主配置文件中的设置,其作用是避免虚拟接口在从新定义路由信息,导致路由访问缓慢的问题。
1.2.3 命令方式
ip addr add 192.168.136.0/24 dev $OUTGOING

1.4 路由设置
1.4.1
#vi /etc/sysconfig/static-routes
eth0(设备名) net(网络地址) 192.168.0.0 (子网)netmask 255.255.255.0 (网关地址)gw 192.168.0.1
a. /usr/sysconfig/network-scripts/route-eth0
10.0.2.0/24 via 192.168.0.144
10.0.3.0/24 via 192.168.0.144
10.0.4.0/24 via 192.168.0.144
1.4.2 给系统主路由表配置网关,这个网关是电信的网关
ip route add 0/0 via 22.22.22.1
1.4.3 添加路由规则,让所有通向网通的数据查询标示为11的路由表,增加一个网通提供的默认网关。
ip route add 0/0 via 11.11.11.1 table 11
ip rule add to 60.0.0.0/13 table 11
ip rule add to 60.8.0.0/15 table 11
ip rule add to 60.10.0.0/16 table 11
要注意的是,在配置网卡的时候,先不要配置网关,不要使用老的ifconfig命令来配置网关,而要使用iproute2来配置网关,否则会造成冲突,或者 使用 ip route replace 命令来替换

ip route add 命令。

1.5 转发设置
/etc/sysctl.conf
# Controls IP packet forwarding
net.ipv4.ip_forward = 1
net.ipv4.netfilter.ip_conntrack_max = 1048576
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300

1.6 resolv.conf
nameserver 10.0.0.1

2. iptables配置
2.1 iptables初始化
iptables -t nat -F
iptables -F
iptables -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -N NEWCONN
2.2 NAT转换
2.2.1 首先将从两个WAN口出去的数据包进行IP伪装masquerade,主要是不让对面知道你来自于哪里。
/sbin/iptables -t nat -A postrouting -o eth1 -j masquerade
/sbin/iptables -t nat -A postrouting -o eth2 -j masquerade
2.1.2 SNAT 转换网络。
iptables -t nat -A POSTROUTING -s 内部IP地址/子网 -o $OUTGOING -j SNAT –to $IPPOOL
2.1.3 一个网段的电信网通自动切换
iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -d $电信ip -j SNAT –to 222.168.1.3
***
***
***
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT –to 218.62.3.3
2.1.4 访问222.222.5.0/15和222.240.0.0/13走电信,其他默认网通
# echo “200 DIANXIN” >> /etc/iproute2/rt_table(这个是添加到文件,执行一次即可)
# ip route replace default via 222.168.1.2 table DIANXIN
# ip rule add fwmark 1 table DIANXIN(这个注意顺序,用ip rule可以查看)
# iptables -t nat -F
# iptables -t mangle -F
# iptables -t mangle -A PREROUTING -i eth0 -s 192.168.0.0/24 -d 222.222.5.0/15 -j MARK –set-mark 1
# iptables -t mangle -A PREROUTING -i eth0 -s 192.168.0.0/24 -d 222.240.0.0/13 -j MARK –set-mark 1
# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 222.222.5.0/15 -j SNAT –to $DIANXIN
# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 222.240.0.0/13 -j SNAT –to $DIANXIN
# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT –to $接网通线路网卡的地址
# ip route flush cache

2.1.6 添加相似路由
if [ “$ALLOW_ACCESS_CLIENT” != “” ] ; then
for LAN in ${ALLOW_ACCESS_CLIENT}; do
{
iptables -A FORWARD -p tcp -m multiport -s ${LAN} -o $ETH_WAN –dport $PORT -j ACCEPT
iptables -A FORWARD -p udp -m multiport -s ${LAN} -o $ETH_WAN –dport $PORT -j ACCEPT
iptables -A FORWARD -p tcp -m multiport -i $ETH_WAN –sport $PORT -j ACCEPT
iptables -A FORWARD -p udp -m multiport -i $ETH_WAN –sport $PORT -j ACCEPT
}
done
fi

2.3 保存
iptables-save -c >/etc/sysconfig/iptables

1.5 转发设置
/etc/sysctl.conf
# Controls IP packet forwarding
net.ipv4.ip_forward = 1
net.ipv4.netfilter.ip_conntrack_max = 1048576
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300

2. iptables配置
2.1 iptables初始化
iptables -t nat -F
iptables -F
iptables -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -N NEWCONN
2.2 NAT转换
2.2.1 首先将从两个WAN口出去的数据包进行IP伪装masquerade
/sbin/iptables -t nat -A postrouting -o eth1 -j masquerade
/sbin/iptables -t nat -A postrouting -o eth2 -j masquerade
2.1.2 SNAT
iptables -t nat -A POSTROUTING -s 内部IP地址/子网 -o $OUTGOING -j SNAT

–to $IPPOOL
2.1.3 一个网段的电信网通自动切换
iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -d $电信ip -j SNAT

–to 222.168.1.3
***
***
***
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT –to

218.62.3.3
2.1.4 访问222.222.5.0/15和222.240.0.0/13走电信,其他默认网通
# echo “200 DIANXIN” >> /etc/iproute2/rt_table(这个是添加到文件,执

行一次即可)
# ip route replace default via 222.168.1.2 table DIANXIN
# ip rule add fwmark 1 table DIANXIN(这个注意顺序,用ip rule可以查

看)
# iptables -t nat -F
# iptables -t mangle -F
# iptables -t mangle -A PREROUTING -i eth0 -s 192.168.0.0/24 -d

222.222.5.0/15 -j MARK –set-mark 1
# iptables -t mangle -A PREROUTING -i eth0 -s 192.168.0.0/24 -d

222.240.0.0/13 -j MARK –set-mark 1
# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d

222.222.5.0/15 -j SNAT –to $DIANXIN
# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d

222.240.0.0/13 -j SNAT –to $DIANXIN
# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT –to $接

网通线路网卡的地址

2.3 保存
iptables-save -c >/etc/sysconfig/iptables

#——+——+——+——+——+——+——+——+——+——+——+——+——+——

在CentOS下配置iptables防火墙,是非常必要的。来我们学习如何配置!

我的博客中有提到防火墙绝提配置哦。

在Linux中设置防火墙,以CentOS为例,打开iptables的配置文件:

vi /etc/sysconfig/iptables

通过/etc/init.d/iptables status命令查询是否有打开80端口,如果没有可通过两种方式处理:

1.修改vi /etc/sysconfig/iptables命令添加使防火墙开放80端口

-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT

2.关闭/开启/重启防火墙

/etc/init.d/iptables stop

#start 开启

#restart 重启

3.永久性关闭防火墙

chkconfig –level 35 iptables off

/etc/init.d/iptables stop

iptables -P INPUT DROP

4.打开主动模式21端口

iptables -A INPUT -p tcp –dport 21 -j ACCEPT

5.打开被动模式49152~65534之间的端口

iptables -A INPUT -p tcp –dport 49152:65534 -j ACCEPT

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -m state –state ESTABLISHED -j ACCEPT

注意:

一定要给自己留好后路,留VNC一个管理端口和SSh的管理端口

需要注意的是,你必须根据自己服务器的情况来修改这个文件。

全部修改完之后重启iptables:

service iptables restart

你可以验证一下是否规则都已经生效:

iptables -L

分类: Linux防火墙iptables 标签:

NAT 跟默认网关的问题(dual NAT)

2016年11月9日 评论已被关闭

NAT 跟默认网关的问题(dual NAT)

http://www.aikaiyuan.com/9153.html

由于要做数据同步,需要对我们内网的机器做 1 对 1 IP nat map,这样可以通过访问一台 nat 路由设备 map 到我们内网的机器。

先说常规性的做法。
一般情况下,这台 nat 设备会充当内网的 gateway,这样在这台 nat 上做一个 dnat 就可以顺利解决了。比如我 GW 的地址是 192.168.1.24,我想通过一对一的方式 map 到后面的 192.168.1.33 这台开放了 28017 TCP 的机器:
# iptables -t nat -A PREROUTING -d 192.168.1.24 -j DNAT –to-destination 192.168.1.33

像上面这样就可以了,但是如果 192.168.1.24 这台机器本身就开放了 28017 端口则会比较悲剧,因此,另外一种做法是选一个不存在的 IP,比如 192.168.1.200,这样可以任意的建立 socket 而不用担心其 TCP 端口被占用:
# iptables -t nat -A PREROUTING -d 192.168.1.200 -j DNAT –to-destination 192.168.1.33

当然,上面这两种方式都不是很规范,比较好的还是指定 IP 以及 port,像下面这样:
# iptables -t nat -A PREROUTING -p tcp -m tcp -d 192.168.1.24 –dport 10000 -j DNAT   –to-destination 192.168.1.33:28017
上面的情况比较简单,现在来看看下面这种情况,也就是非常规性的做法,专业术语叫 “dual NAT”。
环境跟上面的不大一样,最终要访问的机器的 default gateway 并非指向了 nat 设备,也就是他们二者没有任何关系。具体的环境可以看superuser上的这个案例,在这种情况下,仅仅做一个 dnat 是不够的,还需要再做一次 snat 这样才能在回包的时候走正确的路由。
以他为例,在 client 把包发给 PC1 后,首先经过下面这条规则:
# iptables -t nat -A PREROUTING -p tcp -m tcp -d 1.0.0.1 –dport 80 -j DNAT  –to-destination 172.16.0.3:80

于是该包的 src(假设为 192.168.1.1:22222) 不变,dst 由 1.0.0.1:80 变成了 172.16.0.3:80,紧接着,经过 POSTROUTING:
# iptables -t nat -A POSTROUTING -p tcp -m tcp -d 172.16.0.3 –dport 80 -j SNAT –to-source 172.16.0.1:22222

于是该包的 src 由 192.168.1.1:22222 变成了 172.16.0.1:22222,这样修改后的包变成了 src 172.16.0.1:22222,dst 172.16.0.3:80,通过这种方式,成功的绕过了 PC3 default gateway 的问题。
如果仅仅包含 PREROUTING 这条 rule,那么包就变成了 src 192.168.1.1:2222,dst 172.16.0.3:80,虽然包能抵达 PC3,但是在返回的时候,PC1 发现原来的 (192.168.1.1:2222 <-> 1.0.0.1:80) 变成了 (192.168.1.1:2222 <-> 172.16.0.3:80),就直接发 R(Unskilled Attackers Pester Real Security Folks)标志了。可以看看我下面这个模拟的抓包结果:
16:06:36.694253 IP 192.168.1.1:2222 > 172.16.0.3.80: Flags [SEW], seq 868362120, win 5840, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
16:06:36.694279 IP 172.16.0.3.80 > 192.168.1.1:2222: Flags [S.E], seq 1535533077, ack 868362121, win 5840, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
16:06:36.694591 IP 192.168.1.1:2222 > 172.16.0.3.80: Flags [R], seq 868362121, win 0, length 0

所以,记住,如果是这种非网关的形式,务必要 PREROUTING 跟 POSTROUTING 同时做。

理解了上面的问题,再说下我们线上的问题。当时脑子昏了随便找了台开启了 ip_forward 的服务器充当这台 NAT 设备,并且我只开启了 PREROUTING,结果可想而是,没法建立 TCP 链接,搞清楚了问题之后就找了台网关的机器,同时配备了内外网,从外界的客户端通过这个公网 IP 访问内部的机器就很简单了。同样的还是分两种情况,如果要访问的内部机器的 GW 指向这台 nat 设备,很简单,直接 PREROUING,如果没有指向,那么记得再添加一个 POSTROUTING:
# iptables -t nat -A PREROUTING -d nat_public_ip -j DNAT –to-destination  dst_server_ip
# iptables -t nat -A POSTROUTING -d dst_server_ip -j SNAT –to-source nat_private_ip

ref:

用iptables 实现本地端口转发

2016年11月9日 评论已被关闭

用iptables 实现本地端口转发

http://phoenix007.iteye.com/blog/712583

场景
假如你在用 resin 调试一个 Web 程序,需要频繁地重启 resin。这个 Web 程序需要开在 80 端口上,而 Linux 限制 1024 以下的端口必须有 root 权限才能开启。但是你又不愿意在调程序的时候总是开着一个 root 终端。在这种情况下,你可以把 resin 开在默认的 8080 端口上,然后使用 iptables 来实现和真的把服务开在 80 端口上一样的效果。
方法
将与 80 端口的 TCP 连接转接到本地的 8080 端口上。使用 DNAT (Destination Network Address Translation) 技术可以满足这一要求。因为 iptables 在处理本地连接和远程连接的方法不同,所以需要分开处理。下面假设本机的 IP 是 192.168.4.177。
远程连接
远程连接指的是由另外一台机器连接到这台机器上。这种连接的数据包在 iptables 会首先经过 PREROUTING 链,所以只需在 PREROUTING 链中作 DNAT。
# iptables -t nat -A PREROUTING -p tcp -i eth0 -d 192.168.4.177 –dport 80 -j DNAT –to 192.168.4.177:8080
本地连接
本地连接指的是在本机上,用 127.0.0.1 或者本机 IP 来访问本机的端口。本地连接的数据包不会通过网卡,而是由内核处理后直接发给本地进程。这种数据包在 iptables 中只经过 OUTPUT 链,而不会经过 PREROUTING 链。所以需要在 OUTPUT 链中进行 DNAT。除了对 127.0.0.1 之外,对本机 IP (即 192.168.4.177) 的访问也属于本地连接。
# iptables -t nat -A OUTPUT -p tcp -d 127.0.0.1 –dport 80 -j DNAT –to 127.0.0.1:8080
# iptables -t nat -A OUTPUT -p tcp -d 192.168.4.177 –dport 80 -j DNAT –to 127.0.0.1:8080
注意事项
你也许需要通过以下命令打开 IP 转发:
# echo 1 > /proc/sys/net/ipv4/ip_forward
在进行试验时,如果要重新设置 iptables,需要首先清空 nat 表:
# iptables -F -t nat

iptables规则配置 增加、删除和修改命令

2016年11月9日 评论已被关闭

iptables规则配置 增加、删除和修改命令
http://www.111cn.net/sys/linux/53012.htm
iptables是linux中一个很实用的功能就像windows系统中的防火墙一样,但是iptables强大到可以不需要硬件防火墙了,下面我来介绍iptables防火墙配置与一些规则的查看,增加,修改,删除命令。

介绍
iptables 是与最新的 3.5 版本 Linux 内核集成的 IP 信息包过滤系统。如果 Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器, 则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。

Iptables命令的管理控制选项
-A(append) 在指定链的末尾添加一条新的规则
-I (insert)在指定链中插入一条新规则,为指明插入位置
-D(delete)删除制定链里的某条规则
-R (replace)修改、替换指定链的某条规则,按序号或内容确定要替换的规则
-L (list)列出指定链中所有规则进行查看
-F (flush)清空指定链中的所有规则
-N 新建一条用户自己定义的规则链
-X(delete-chain)删除指定表中用户自己定义的规则链
-P 设置指定链的默认策略
-V 查看iptables命令工具的版本(–version)信息
-v 查看规则列表时显示详细(–verbose)的信息
-h 查看命令帮助信息(–help)
-n 使用数字形式(–number)显示输出结果,如显示主机的ip地址而不是主机名
–line-number 查看规则列表时,同时显示规则在链中的顺序号
Iptables命令的匹配条件选项
Ip地址:
来源地址:—s (source)。
目标地址:—d (destination)。
端口(port):
来源端口:——sport。
目标端口:——dport。
协议:—p。
个服务的端口和协议:

这里只列出比较常用的参数,详细的请查看man iptables
1、查看
iptables -nvL –line-number
-L 查看当前表的所有规则,默认查看的是filter表,如果要查看NAT表,可以加上-t NAT参数
-n 不对ip地址进行反查,加上这个参数显示速度会快很多
-v 输出详细信息,包含通过该规则的数据包数量,总字节数及相应的网络接口
–line-number 显示规则的序列号,这个参数在删除或修改规则时会用到

(1)查看本机关于IPTABLES的设置情况
[root@tp ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain RH-Firewall-1-INPUT (0 references)
target prot opt source destination
ACCEPT all — 0.0.0.0/0 0.0.0.0/0
ACCEPT icmp — 0.0.0.0/0 0.0.0.0/0 icmp type 255
ACCEPT esp — 0.0.0.0/0 0.0.0.0/0
ACCEPT ah — 0.0.0.0/0 0.0.0.0/0
ACCEPT udp — 0.0.0.0/0 224.0.0.251 udp dpt:5353
ACCEPT udp — 0.0.0.0/0 0.0.0.0/0 udp dpt:631
ACCEPT all — 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT tcp — 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
ACCEPT tcp — 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
ACCEPT tcp — 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:25
REJECT all — 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
可以看出我在安装linux时,选择了有防火墙,并且开放了22,80,25端口.
如果你在安装linux时没有选择启动防火墙,是这样的
[root@tp ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
什么规则都没有.
2、添加
添加规则有两个参数:-A和-I。其中-A是添加到规则的末尾;-I可以插入到指定位置,没有指定位置的话默认插入到规则的首部。
当前规则:
[root@test ~]# iptables -nL –line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP all — 192.168.1.1 0.0.0.0/0
2 DROP all — 192.168.1.2 0.0.0.0/0
3 DROP all — 192.168.1.4 0.0.0.0/0
添加一条规则到尾部:
[root@test ~]# iptables -A INPUT -s 192.168.1.5 -j DROP再插入一条规则到第三行,将行数直接写到规则链的后面:
[root@test ~]# iptables -I INPUT 3 -s 192.168.1.3 -j DROP查看:
[root@test ~]# iptables -nL –line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP all — 192.168.1.1 0.0.0.0/0
2 DROP all — 192.168.1.2 0.0.0.0/0
3 DROP all — 192.168.1.3 0.0.0.0/0
4 DROP all — 192.168.1.4 0.0.0.0/0
5 DROP all — 192.168.1.5 0.0.0.0/0
可以看到192.168.1.3插入到第三行,而原来的第三行192.168.1.4变成了第四行。

首先添加INPUT链,INPUT链的默认规则是DROP,所以我们就写需要ACCETP(通过)的链
为了能采用远程SSH登陆,我们要开启22端口.
[root@tp ~]# iptables -A INPUT -p tcp –dport 22 -j ACCEPT
[root@tp ~]# iptables -A OUTPUT -p tcp –sport 22 -j ACCEPT (注:这个规则,如果你把OUTPUT 设置成DROP的就要写上这一部,好多人都是望了写这一部规则导致,始终无法SSH.在远程一下,是不是好了.
其他的端口也一样,如果开启了web服务器,OUTPUT设置成DROP的话,同样也要添加一条链:
[root@tp ~]# iptables -A OUTPUT -p tcp –sport 80 -j ACCEPT ,其他同理.)
如果做了WEB服务器,开启80端口.
[root@tp ~]# iptables -A INPUT -p tcp –dport 80 -j ACCEPT
如果做了邮件服务器,开启25,110端口.
[root@tp ~]# iptables -A INPUT -p tcp –dport 110 -j ACCEPT
[root@tp ~]# iptables -A INPUT -p tcp –dport 25 -j ACCEPT
如果做了FTP服务器,开启21端口
[root@tp ~]# iptables -A INPUT -p tcp –dport 21 -j ACCEPT
[root@tp ~]# iptables -A INPUT -p tcp –dport 20 -j ACCEPT
如果做了DNS服务器,开启53端口
[root@tp ~]# iptables -A INPUT -p tcp –dport 53 -j ACCEPT
如果你还做了其他的服务器,需要开启哪个端口,照写就行了.
上面主要写的都是INPUT链,凡是不在上面的规则里的,都DROP
允许icmp包通过,也就是允许ping,
[root@tp ~]# iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT设置成DROP的话)
[root@tp ~]# iptables -A INPUT -p icmp -j ACCEPT (INPUT设置成DROP的话)
允许loopback!(不然会导致DNS无法正常关闭等问题)
IPTABLES -A INPUT -i lo -p all -j ACCEPT (如果是INPUT DROP)
IPTABLES -A OUTPUT -o lo -p all -j ACCEPT(如果是OUTPUT DROP)
下面写OUTPUT链,OUTPUT链默认规则是ACCEPT,所以我们就写需要DROP(放弃)的链.
减少不安全的端口连接
[root@tp ~]# iptables -A OUTPUT -p tcp –sport 31337 -j DROP
[root@tp ~]# iptables -A OUTPUT -p tcp –dport 31337 -j DROP
有些些特洛伊木马会扫描端口31337到31340(即黑客语言中的 elite 端口)上的服务。既然合法服务都不使用这些非标准端口来通信,阻塞这些端口能够有效地减少你的网络上可能被感染的机器和它们的远程主服务器进行独立通信的机会
还有其他端口也一样,像:31335、27444、27665、20034 NetBus、9704、137-139(smb),2049(NFS)端口也应被禁止,我在这写的也不全,有兴趣的朋友应该去查一下相关资料.
当然出入更安全的考虑你也可以包OUTPUT链设置成DROP,那你添加的规则就多一些,就像上边添加
允许SSH登陆一样.照着写就行了.
下面写一下更加细致的规则,就是限制到某台机器
如:我们只允许192.168.0.3的机器进行SSH连接
[root@tp ~]# iptables -A INPUT -s 192.168.0.3 -p tcp –dport 22 -j ACCEPT
如果要允许,或限制一段IP地址可用 192.168.0.0/24 表示192.168.0.1-255端的所有IP.
24表示子网掩码数.但要记得把 /etc/sysconfig/iptables 里的这一行删了.
-A INPUT -p tcp -m tcp –dport 22 -j ACCEPT 因为它表示所有地址都可以登陆.
或采用命令方式:
[root@tp ~]# iptables -D INPUT -p tcp –dport 22 -j ACCEPT
然后保存,我再说一边,反是采用命令的方式,只在当时生效,如果想要重起后也起作用,那就要保存.写入到/etc/sysconfig/iptables文件里.
[root@tp ~]# /etc/rc.d/init.d/iptables save
这样写 !192.168.0.3 表示除了192.168.0.3的ip地址
其他的规则连接也一样这么设置.
在下面就是FORWARD链,FORWARD链的默认规则是DROP,所以我们就写需要ACCETP(通过)的链,对正在转发链的监控.
开启转发功能,(在做NAT时,FORWARD默认规则是DROP时,必须做)
[root@tp ~]# iptables -A FORWARD -i eth0 -o eth1 -m state –state RELATED,ESTABLISHED -j ACCEPT
[root@tp ~]# iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT
丢弃坏的TCP包
[root@tp ~]#iptables -A FORWARD -p TCP ! –syn -m state –state NEW -j DROP
处理IP碎片数量,防止攻击,允许每秒100个
[root@tp ~]#iptables -A FORWARD -f -m limit –limit 100/s –limit-burst 100 -j ACCEPT
设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包.
[root@tp ~]#iptables -A FORWARD -p icmp -m limit –limit 1/s –limit-burst 10 -j ACCEPT
我在前面只所以允许ICMP包通过,就是因为我在这里有限制.

3、删除
删除用-D参数
删除之前添加的规则(iptables -A INPUT -s 192.168.1.5 -j DROP):
[root@test ~]# iptables -D INPUT -s 192.168.1.5 -j DROP有时候要删除的规则太长,删除时要写一大串,既浪费时间又容易写错,这时我们可以先使用–line-number找出该条规则的行号,再通过行号删除规则。
[root@test ~]# iptables -nv –line-number
iptables v1.4.7: no command specified
Try `iptables -h’ or ‘iptables –help’ for more information.
[root@test ~]# iptables -nL –line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP all — 192.168.1.1 0.0.0.0/0
2 DROP all — 192.168.1.2 0.0.0.0/0
3 DROP all — 192.168.1.3 0.0.0.0/0
删除第二行规则
[root@test ~]# iptables -D INPUT 24、

不管你在安装linux时是否启动了防火墙,如果你想配置属于自己的防火墙,那就清除现在filter的所有规则.
[root@tp ~]# iptables -F 清除预设表filter中的所有规则链的规则
[root@tp ~]# iptables -X 清除预设表filter中使用者自定链中的规则
我们在来看一下
[root@tp ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
什么都没有了吧,和我们在安装linux时没有启动防火墙是一样的.(提前说一句,这些配置就像用命令配置IP一样,重起就会失去作用),怎么保存.
[root@tp ~]# /etc/rc.d/init.d/iptables save
这样就可以写到/etc/sysconfig/iptables文件里了.写入后记得把防火墙重起一下,才能起作用.
[root@tp ~]# service iptables restart
现在IPTABLES配置表里什么配置都没有了,那我们开始我们的配置吧
(3)设定预设规则
[root@tp ~]# iptables -p INPUT DROP
[root@tp ~]# iptables -p OUTPUT ACCEPT
[root@tp ~]# iptables -p FORWARD DROP
上面的意思是,当超出了IPTABLES里filter表里的两个链规则(INPUT,FORWARD)时,不在这两个规则里的数据包怎么处理呢,那就是DROP(放弃).应该说这样配置是很安全的.我们要控制流入数据包
而对于OUTPUT链,也就是流出的包我们不用做太多限制,而是采取ACCEPT,也就是说,不在着个规则里的包怎么办呢,那就是通过.
可以看出INPUT,FORWARD两个链采用的是允许什么包通过,而OUTPUT链采用的是不允许什么包通过.
这样设置还是挺合理的,当然你也可以三个链都DROP,但这样做我认为是没有必要的,而且要写的规则就会增加.但如果你只想要有限的几个规则是,如只做WEB服务器.还是推荐三个链都是DROP.
注:如果你是远程SSH登陆的话,当你输入第一个命令回车的时候就应该掉了.因为你没有设置任何规则.
怎么办,去本机操作呗!
修改
修改使用-R参数
先看下当前规则:
[root@test ~]# iptables -nL –line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP all — 192.168.1.1 0.0.0.0/0
2 DROP all — 192.168.1.2 0.0.0.0/0
3 DROP all — 192.168.1.5 0.0.0.0/0
将第三条规则改为ACCEPT:
[root@test ~]# iptables -R INPUT 3 -j ACCEPT再查看下:
[root@test ~]# iptables -nL –line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP all — 192.168.1.1 0.0.0.0/0
2 DROP all — 192.168.1.2 0.0.0.0/0
3 ACCEPT all — 0.0.0.0/0 0.0.0.0/0
第三条规则的target已改为ACCEPT。
iptables -E old-chain-name new-chain-name
-E 旧的链名 新的链名
用新的链名取代旧的链名
说明
Iptalbes 是用来设置、维护和检查Linux内核的IP包过滤规则的。
可以定义不同的表,每个表都包含几个内部的链,也能包含用户定义的链。每个链都是一个规则列表,对对应的包进行匹配:每条规则指定应当如何处理与之相匹配的包。这被称作’target’(目标),也可以跳向同一个表内的用户定义的链。
TARGETS
防火墙的规则指定所检查包的特征,和目标。如果包不匹配,将送往该链中下一条规则检查;如果匹配,那么下一条规则由目标值确定.该目标值可以是用户定义的链名,或是某个专用值,如ACCEPT[通过], DROP[删除], QUEUE[排队], 或者 RETURN[返回]。
ACCEPT 表示让这个包通过。DROP表示将这个包丢弃。QUEUE表示把这个包传递到用户空间。RETURN表示停止这条链的匹配,到前一个链的规则重新开始。如果到达了一个内建的链(的末端),或者遇到内建链的规则是RETURN,包的命运将由链准则指定的目标决定。
TABLES
当前有三个表(哪个表是当前表取决于内核配置选项和当前模块)。
-t table
这个选项指定命令要操作的匹配包的表。如果内核被配置为自动加载模块,这时若模块没有加载,(系统)将尝试(为该表)加载适合的模块。这些表如下:filter,这是默认的表,包含了内建的链INPUT(处理进入的包)、FORWORD(处理通过的包)和OUTPUT(处理本地生成的包)。nat,这个表被查询时表示遇到了产生新的连接的包,由三个内建的链构成:PREROUTING (修改到来的包)、OUTPUT(修改路由之前本地的包)、POSTROUTING(修改准备出去的包)。mangle 这个表用来对指定的包进行修改。它有两个内建规则:PREROUTING(修改路由之前进入的包)和OUTPUT(修改路由之前本地的包)。
OPTIONS
这些可被iptables识别的选项可以区分不同的种类。
COMMANDS
这些选项指定执行明确的动作:若指令行下没有其他规定,该行只能指定一个选项.对于长格式的命令和选项名,所用字母长度只要保证iptables能从其他选项中区分出该指令就行了。
-A -append
在所选择的链末添加一条或更多规则。当源(地址)或者/与 目的(地址)转换为多个地址时,这条规则会加到所有可能的地址(组合)后面。
-D -delete
从所选链中删除一条或更多规则。这条命令可以有两种方法:可以把被删除规则指定为链中的序号(第一条序号为1),或者指定为要匹配的规则。
-R -replace
从选中的链中取代一条规则。如果源(地址)或者/与 目的(地址)被转换为多地址,该命令会失败。规则序号从1开始。
-I -insert
根据给出的规则序号向所选链中插入一条或更多规则。所以,如果规则序号为1,规则会被插入链的头部。这也是不指定规则序号时的默认方式。
-L -list
显示所选链的所有规则。如果没有选择链,所有链将被显示。也可以和z选项一起使用,这时链会被自动列出和归零。精确输出受其它所给参数影响。
-F -flush
清空所选链。这等于把所有规则一个个的删除。
–Z -zero
把所有链的包及字节的计数器清空。它可以和 -L配合使用,在清空前察看计数器,请参见前文。
-N -new-chain
根据给出的名称建立一个新的用户定义链。这必须保证没有同名的链存在。
-X -delete-chain
删除指定的用户自定义链。这个链必须没有被引用,如果被引用,在删除之前你必须删除或者替换与之有关的规则。如果没有给出参数,这条命令将试着删除每个非内建的链。

-P -policy
设置链的目标规则。
-E -rename-chain
根据用户给出的名字对指定链进行重命名,这仅仅是修饰,对整个表的结构没有影响。TARGETS参数给出一个合法的目标。只有非用户自定义链可以使用规则,而且内建链和用户自定义链都不能是规则的目标。
-h Help.
帮助。给出当前命令语法非常简短的说明。
PARAMETERS
参数
以下参数构成规则详述,如用于add、delete、replace、append 和 check命令。
-p -protocal [!]protocol
规则或者包检查(待检查包)的协议。指定协议可以是tcp、udp、icmp中的一个或者全部,也可以是数值,代表这些协议中的某一个。当然也可以使用在/etc/protocols中定义的协议名。在协议名前加上”!”表示相反的规则。数字0相当于所有all。Protocol all会匹配所有协议,而且这是缺省时的选项。在和check命令结合时,all可以不被使用。
-s -source [!] address[/mask]
指定源地址,可以是主机名、网络名和清楚的IP地址。mask说明可以是网络掩码或清楚的数字,在网络掩码的左边指定网络掩码左边”1″的个数,因此,mask值为24等于255.255.255.0。在指定地址前加上”!”说明指定了相反的地址段。标志 –src 是这个选项的简写。
-d –destination [!] address[/mask]
指定目标地址,要获取详细说明请参见 -s标志的说明。标志 –dst 是这个选项的简写。
-j –jump target
-j 目标跳转
指定规则的目标;也就是说,如果包匹配应当做什么。目标可以是用户自定义链(不是这条规则所在的),某个会立即决定包的命运的专用内建目标,或者一个扩展(参见下面的EXTENSIONS)。如果规则的这个选项被忽略,那么匹配的过程不会对包产生影响,不过规则的计数器会增加。
-i -in-interface [!] [name]
i -进入的(网络)接口 [!][名称]
这是包经由该接口接收的可选的入口名称,包通过该接口接收(在链INPUT、FORWORD和PREROUTING中进入的包)。当在接口名前使用”!”说明后,指的是相反的名称。如果接口名后面加上”+”,则所有以此接口名开头的接口都会被匹配。如果这个选项被忽略,会假设为”+”,那么将匹配任意接口。
-o –out-interface [!][name]
-o –输出接口[名称]
这是包经由该接口送出的可选的出口名称,包通过该口输出(在链FORWARD、OUTPUT和POSTROUTING中送出的包)。当在接口名前使用”!”说明后,指的是相反的名称。如果接口名后面加上”+”,则所有以此接口名开头的接口都会被匹配。如果这个选项被忽略,会假设为”+”,那么将匹配所有任意接口。
[!] -f, –fragment
[!] -f –分片
这意味着在分片的包中,规则只询问第二及以后的片。自那以后由于无法判断这种把包的源端口或目标端口(或者是ICMP类型的),这类包将不能匹配任何指定对他们进行匹配的规则。如果”!”说明用在了”-f”标志之前,表示相反的意思。
OTHER OPTIONS
其他选项
还可以指定下列附加选项:
-v –verbose
-v –详细
详细输出。这个选项让list命令显示接口地址、规则选项(如果有)和TOS(Type of Service)掩码。包和字节计数器也将被显示,分别用K、M、G(前缀)表示1000、1,000,000和1,000,000,000倍(不过请参看-x标志改变它),对于添加,插入,删除和替换命令,这会使一个或多个规则的相关详细信息被打印。
-n –numeric
-n –数字
数字输出。IP地址和端口会以数字的形式打印。默认情况下,程序试显示主机名、网络名或者服务(只要可用)。
-x -exact
-x -精确
扩展数字。显示包和字节计数器的精确值,代替用K,M,G表示的约数。这个选项仅能用于 -L 命令。
–line-numbers
当列表显示规则时,在每个规则的前面加上行号,与该规则在链中的位置相对应。
MATCH EXTENSIONS
对应的扩展
iptables能够使用一些与模块匹配的扩展包。以下就是含于基本包内的扩展包,而且他们大多数都可以通过在前面加上!来表示相反的意思。
tcp
当 –protocol tcp 被指定,且其他匹配的扩展未被指定时,这些扩展被装载。它提供以下选项:
–source-port [!] [port[:port]]
源端口或端口范围指定。这可以是服务名或端口号。使用格式端口:端口也可以指定包含的(端口)范围。如果首端口号被忽略,默认是”0″,如果末端口号被忽略,默认是”65535″,如果第二个端口号大于第一个,那么它们会被交换。这个选项可以使用 –sport的别名。
–destionation-port [!] [port:[port]]
目标端口或端口范围指定。这个选项可以使用 –dport别名来代替。
–tcp-flags [!] mask comp
匹配指定的TCP标记。第一个参数是我们要检查的标记,一个用逗号分开的列表,第二个参数是用逗号分开的标记表,是必须被设置的。标记如下:SYN ACK FIN RST URG PSH ALL NONE。因此这条命令:iptables -A FORWARD -p tcp –tcp-flags SYN, ACK, FIN, RST SYN只匹配那些SYN标记被设置而ACK、FIN和RST标记没有设置的包。
[!] –syn
只匹配那些设置了SYN位而清除了ACK和FIN位的TCP包。这些包用于TCP连接初始化时发出请求;例如,大量的这种包进入一个接口发生堵塞时会阻止进入的TCP连接,而出去的TCP连接不会受到影响。这等于 –tcp-flags SYN, RST, ACK SYN。如果”–syn”前面有”!”标记,表示相反的意思。
–tcp-option [!] number
匹配设置了TCP选项的。
udp
当protocol udp 被指定,且其他匹配的扩展未被指定时,这些扩展被装载,它提供以下选项:
–source-port [!] [port:[port]]
源端口或端口范围指定。详见 TCP扩展的–source-port选项说明。
–destination-port [!] [port:[port]]
目标端口或端口范围指定。详见 TCP扩展的–destination-port选项说明。
icmp
当protocol icmp被指定,且其他匹配的扩展未被指定时,该扩展被装载。它提供以下选项:
–icmp-type [!] typename
这个选项允许指定ICMP类型,可以是一个数值型的ICMP类型,或者是某个由命令iptables -p icmp -h所显示的ICMP类型名。
mac
–mac-source [!] address
匹配物理地址。必须是XX:XX:XX:XX:XX这样的格式。注意它只对来自以太设备并进入PREROUTING、FORWORD和INPUT链的包有效。
limit
这个模块匹配标志用一个标记桶过滤器一一定速度进行匹配,它和LOG目标结合使用来给出有限的登陆数.当达到这个极限值时,使用这个扩展包的规则将进行匹配.(除非使用了”!”标记)
–limit rate
最大平均匹配速率:可赋的值有’/second’, ‘/minute’, ‘/hour’, or ‘/day’这样的单位,默认是3/hour。
–limit-burst number
待匹配包初始个数的最大值:若前面指定的极限还没达到这个数值,则概数字加1.默认值为5
multiport
这个模块匹配一组源端口或目标端口,最多可以指定15个端口。只能和-p tcp 或者 -p udp 连着使用。
–source-port [port[, port]]
如果源端口是其中一个给定端口则匹配
–destination-port [port[, port]]
如果目标端口是其中一个给定端口则匹配
–port [port[, port]]
若源端口和目的端口相等并与某个给定端口相等,则匹配。
mark
这个模块和与netfilter过滤器标记字段匹配(就可以在下面设置为使用MARK标记)。
–mark value [/mask]
匹配那些无符号标记值的包(如果指定mask,在比较之前会给掩码加上逻辑的标记)。
owner
此模块试为本地生成包匹配包创建者的不同特征。只能用于OUTPUT链,而且即使这样一些包(如ICMP ping应答)还可能没有所有者,因此永远不会匹配。
–uid-owner userid
如果给出有效的user id,那么匹配它的进程产生的包。
–gid-owner groupid
如果给出有效的group id,那么匹配它的进程产生的包。
–sid-owner seessionid
根据给出的会话组匹配该进程产生的包。
state
此模块,当与连接跟踪结合使用时,允许访问包的连接跟踪状态。
–state state
这里state是一个逗号分割的匹配连接状态列表。可能的状态是:INVALID表示包是未知连接,ESTABLISHED表示是双向传送的连接,NEW表示包为新的连接,否则是非双向传送的,而RELATED表示包由新连接开始,但是和一个已存在的连接在一起,如FTP数据传送,或者一个ICMP错误。
unclean
此模块没有可选项,不过它试着匹配那些奇怪的、不常见的包。处在实验中。
tos
此模块匹配IP包首部的8位tos(服务类型)字段(也就是说,包含在优先位中)。
–tos tos
这个参数可以是一个标准名称,(用iptables -m tos -h 察看该列表),或者数值。
TARGET EXTENSIONS
iptables可以使用扩展目标模块:以下都包含在标准版中。
LOG
为匹配的包开启内核记录。当在规则中设置了这一选项后,linux内核会通过printk()打印一些关于全部匹配包的信息(诸如IP包头字段等)。
–log-level level
记录级别(数字或参看 syslog.conf(5))。
–log-prefix prefix
在纪录信息前加上特定的前缀:最多14个字母长,用来和记录中其他信息区别。
–log-tcp-sequence
记录TCP序列号。如果记录能被用户读取那么这将存在安全隐患。
–log-tcp-options
记录来自TCP包头部的选项。
–log-ip-options
记录来自IP包头部的选项。
MARK
用来设置包的netfilter标记值。只适用于mangle表。
–set-mark mark
REJECT
作为对匹配的包的响应,返回一个错误的包:其他情况下和DROP相同。
此目标只适用于INPUT、FORWARD和OUTPUT链,和调用这些链的用户自定义链。这几个选项控制返回的错误包的特性:
–reject-with type
Type可以是icmp-net-unreachable、icmp-host-unreachable、icmp-port-nreachable、icmp-proto-unreachable、 icmp-net-prohibited 或者 icmp-host-prohibited,该类型会返回相应的ICMP错误信息(默认是port-unreachable)。选项 echo-reply也是允许的;它只能用于指定ICMP ping包的规则中,生成ping的回应。最后,选项tcp-reset可以用于在INPUT链中,或自INPUT链调用的规则,只匹配TCP协议:将回应一个TCP RST包。
TOS
用来设置IP包的首部八位tos。只能用于mangle表。
–set-tos tos
你可以使用一个数值型的TOS 值,或者用iptables -j TOS -h 来查看有效TOS名列表。
MIRROR
这是一个试验示范目标,可用于转换IP首部字段中的源地址和目标地址,再传送该包,并只适用于INPUT、FORWARD和OUTPUT链,以及只调用它们的用户自定义链。
SNAT
这个目标只适用于nat表的POSTROUTING链。它规定修改包的源地址(此连接以后所有的包都会被影响),停止对规则的检查,它包含选项:
–to-source [-][:port-port]
可以指定一个单一的新的IP地址,一个IP地址范围,也可以附加一个端口范围(只能在指定-p tcp 或者-p udp的规则里)。如果未指定端口范围,源端口中512以下的(端口)会被安置为其他的512以下的端口;512到1024之间的端口会被安置为1024以下的,其他端口会被安置为1024或以上。如果可能,端口不会被修改。
–to-destiontion [-][:port-port]
可以指定一个单一的新的IP地址,一个IP地址范围,也可以附加一个端口范围(只能在指定-p tcp 或者-p udp的规则里)。如果未指定端口范围,目标端口不会被修改。
MASQUERADE
只用于nat表的POSTROUTING链。只能用于动态获取IP(拨号)连接:如果你拥有静态IP地址,你要用SNAT。伪装相当于给包发出时所经过接口的IP地址设置一个映像,当接口关闭连接会终止。这是因为当下一次拨号时未必是相同的接口地址(以后所有建立的连接都将关闭)。它有一个选项:
–to-ports [-port>]
指定使用的源端口范围,覆盖默认的SNAT源地址选择(见上面)。这个选项只适用于指定了-p tcp或者-p udp的规则。
REDIRECT
只适用于nat表的PREROUTING和OUTPUT链,和只调用它们的用户自定义链。它修改包的目标IP地址来发送包到机器自身(本地生成的包被安置为地址127.0.0.1)。它包含一个选项:
–to-ports [ ]
指定使用的目的端口或端口范围:不指定的话,目标端口不会被修改。只能用于指定了-p tcp 或 -p udp的规则。
DIAGNOSTICS
诊断
不同的错误信息会打印成标准错误:退出代码0表示正确。类似于不对的或者滥用的命令行参数错误会返回错误代码2,其他错误返回代码为1。
BUGS
臭虫
Check is not implemented (yet).
检查还未完成。
COMPATIBILITY WITH IPCHAINS
与ipchains的兼容性
iptables和Rusty Russell的ipchains非常相似。主要区别是INPUT 链只用于进入本地主机的包,而OUTPUT只用于自本地主机生成的包。因此每个包只经过三个链的一个;以前转发的包会经过所有三个链。其他主要区别是 -i 引用进入接口;-o引用输出接口,两者都适用于进入FORWARD链的包。当和可选扩展模块一起使用默认过滤器表时,iptables是一个纯粹的包过滤器。这能大大减少以前对IP伪装和包过滤结合使用的混淆,所以以下选项作了不同的处理:
-j MASQ
-M -S
-M -L
在iptables中有几个不同的链。

全面详解Linux日志管理技巧

2016年11月9日 评论已被关闭

全面详解Linux日志管理技巧

输出iptables日志到一个指定的文件

http://www.linuxidc.com/Linux/2007-05/4097p2.htm
2. 输出iptables日志到一个指定的文件

Iptables的man参考页中提到: 我们可以使用iptables在linux内核中建立, 维护和检查IP包过滤规则表. 几个不同的表可能已经创建, 每一个表包含了很多内嵌的链, 也可能包含用户自定义的链.

Iptables默认把日志信息输出到/var/log/messages文件. 不过一些情况下你可能需要修改日志输出的位置. 下面向大家介绍如何建立一个新的日志文件/var/log/iptables.log. 通过修改或使用新的日志文件, 你可以创建更好的统计信息或者帮助你分析网络攻击信息.

1). Iptables默认的日志文件
例如, 如果你输入下面的命令, 屏幕将显示/var/log/messages文件中的iptables日志信息:

# tail -f /var/log/messages

输出:

Oct 4 00:44:28 debian gconfd (vivek-4435): Resolved address “xml:readonly:/etc/gconf/gconf.xml.defaults” to a read-only configuration source at position 2
Oct 4 01:14:19 debian kernel: IN=ra0 OUT= MAC=00:17:9a:0a:f6:44:00:08:5c:00:00:01:08:00 SRC=200.142.84.36 DST=192.168.1.2 LEN=60 TOS=0x00 PREC=0x00 TTL=51 ID=18374 DF PROTO=TCP SPT=46040 DPT=22 WINDOW=5840 RES=0x00 SYN URGP=0

2). 输出iptables日志信息到一个指定文件的方法
打开你的/etc/syslog.conf文件:
# vi /etc/syslog.conf

在文件末尾加入下面一行信息
kern.warning /var/log/iptables.log

保存和关闭文件.

重新启动syslogd(如果你使用Debian/Ubuntu Linux):
# /etc/init.d/sysklogd restart

另外, 使用下面命令重新启动syslogd(如果你使用Red Hat/Cent OS/Fedora Core Linux):
# /etc/init.d/syslog restart

现在确认你的iptables使用了log-level 4参数(前面有一个log-prefix标志). 例如:
# DROP everything and Log it
iptables -A INPUT -j LOG –log-level 4
iptables -A INPUT -j DROP

举一个例子, 丢弃和记录所有来自IP地址65.55.11.2的连接信息到/var/log/iptables.log文件.
iptables -A INPUT -s 64.55.11.2 -m limit –limit 5/m –limit-burst 7 -j LOG –log-prefix ‘** HACKERS **’ –log-level 4
iptables -A INPUT -s 64.55.11.2 -j DROP

命令解释:

. – log-level 4: 记录的级别. 级别4为警告(warning).
. – log-prefix ‘*** TEXT ***’: 这里定义了在日志输出信息前加上TEXT前缀. TEXT信息最长可以是29个字符, 这样你就可以在记录文件中方便找到相关的信息.

现在你可以通过/var/log/iptables.log文件参考iptables的所有信息:# tail -f /var/log/iptables.loglinux

分类: Linux防火墙iptables 标签:

全面详解Linux日志管理技巧

2016年11月9日 评论已被关闭

全面详解Linux日志管理技巧

输出iptables日志到一个指定的文件

http://www.linuxidc.com/Linux/2007-05/4097p2.htm
2. 输出iptables日志到一个指定的文件

Iptables的man参考页中提到: 我们可以使用iptables在linux内核中建立, 维护和检查IP包过滤规则表. 几个不同的表可能已经创建, 每一个表包含了很多内嵌的链, 也可能包含用户自定义的链.

Iptables默认把日志信息输出到/var/log/messages文件. 不过一些情况下你可能需要修改日志输出的位置. 下面向大家介绍如何建立一个新的日志文件/var/log/iptables.log. 通过修改或使用新的日志文件, 你可以创建更好的统计信息或者帮助你分析网络攻击信息.

1). Iptables默认的日志文件
例如, 如果你输入下面的命令, 屏幕将显示/var/log/messages文件中的iptables日志信息:

# tail -f /var/log/messages

输出:

Oct 4 00:44:28 debian gconfd (vivek-4435): Resolved address “xml:readonly:/etc/gconf/gconf.xml.defaults” to a read-only configuration source at position 2
Oct 4 01:14:19 debian kernel: IN=ra0 OUT= MAC=00:17:9a:0a:f6:44:00:08:5c:00:00:01:08:00 SRC=200.142.84.36 DST=192.168.1.2 LEN=60 TOS=0x00 PREC=0x00 TTL=51 ID=18374 DF PROTO=TCP SPT=46040 DPT=22 WINDOW=5840 RES=0x00 SYN URGP=0

2). 输出iptables日志信息到一个指定文件的方法
打开你的/etc/syslog.conf文件:
# vi /etc/syslog.conf

在文件末尾加入下面一行信息
kern.warning /var/log/iptables.log

保存和关闭文件.

重新启动syslogd(如果你使用Debian/Ubuntu Linux):
# /etc/init.d/sysklogd restart

另外, 使用下面命令重新启动syslogd(如果你使用Red Hat/Cent OS/Fedora Core Linux):
# /etc/init.d/syslog restart

现在确认你的iptables使用了log-level 4参数(前面有一个log-prefix标志). 例如:
# DROP everything and Log it
iptables -A INPUT -j LOG –log-level 4
iptables -A INPUT -j DROP

举一个例子, 丢弃和记录所有来自IP地址65.55.11.2的连接信息到/var/log/iptables.log文件.
iptables -A INPUT -s 64.55.11.2 -m limit –limit 5/m –limit-burst 7 -j LOG –log-prefix ‘** HACKERS **’ –log-level 4
iptables -A INPUT -s 64.55.11.2 -j DROP

命令解释:

. – log-level 4: 记录的级别. 级别4为警告(warning).
. – log-prefix ‘*** TEXT ***’: 这里定义了在日志输出信息前加上TEXT前缀. TEXT信息最长可以是29个字符, 这样你就可以在记录文件中方便找到相关的信息.

现在你可以通过/var/log/iptables.log文件参考iptables的所有信息:# tail -f /var/log/iptables.loglinux

分类: Linux防火墙iptables 标签:

iptables端口转发的一些事例

2016年11月9日 评论已被关闭

iptables端口转发的一些事例
http://xmmok.blog.sohu.com/260275436.html
本机端口转发

转发8081到3306

iptables -t nat -A PREROUTING -p tcp –dport 8081 -j REDIRECT –to-ports 3306

转发所有端口

配置单网卡PPTP VPN的时候需要用到此条配置
转发所有tcp访问到外网ip

iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o eth0 -j MASQUERADE

端口转发跳板

单网卡通过 192.168.1.100:8081 访问 192.168.1.101:3306

iptables -t nat -A PREROUTING -d 192.168.1.100 -p tcp –dport 8081 -j DNAT –to-destination 192.168.1.101:3306
iptables -t nat -A POSTROUTING -d 192.168.1.101 -p tcp –dport 3306 -j SNAT –to 192.168.1.100
顺便说说SNAT, DNAT与MASQUERADE区别

SNAT: source nat 源网络地址转换
数据包从网卡发送出去的时候,把数据包中的源地址部分替换为指定的IP
接收方就认为数据包的来源是被替换的那个IP的主机
在目标机连接外部时要用到这种转换, 例如上面192.168.1.101数据返回到外部访问

DNAT: destination nat 目标网络地址转换,
就是指数据包从网卡发送出去的时候,修改数据包中的目的IP
表现为如果你想访问A,可是因为网关做了DNAT,把所有访问A的数据包的目的IP全部修改为B,那么,你实际上访问的是B
通常用于外部机器访问内部服务器, 例如上面外部机器访问192.168.1.101:3306

MASQUERADE
是用发送数据的网卡上的IP来替换源IP, 是对SNAT的一种扩展
通常用于对于那些IP不固定的场合,比如拨号网络或者通过dhcp分配IP的情况下

分类: Linux安全防护 标签:

iptables做两机之间的端口转发

2016年11月9日 评论已被关闭

iptables做两机之间的端口转发
http://blog.sina.com.cn/s/blog_702eef650101moqb.html

两机:192.168.0.54和192.168.0.61,最终结果就是在指定端口上,54相当于61的代理。

IP包来到之后,修改目的地址,使之转向目标机器的目标端口,在54这个机器上:

iptables -t nat -A PREROUTING -d 192.168.0.54 -p tcp –dport 9000 -j DNAT –to 192.168.0.61:9000

IP包出去的时候,修改源地址(源端口),使之符合IP协议,可以正确返回,还是在54这个机器上:

iptables -t nat -A POSTROUTING -d 192.168.0.61 -p tcp –dport 9000 -j SNAT –to 192.168.0.54:9000

然后我们需要在54操作系统上打开IP转发:

echo ‘1’ > /proc/sys/net/ipv4/ip_forward

最后再设置54防火墙将这两个端口放行:

iptables -A FORWARD -i eth0 -s 192.168.0.61 -p tcp –sport 9000 -m state –state ESTABLISHED -j ACCEPT
iptables -A FORWARD -o eth0 -d 192.168.0.54 -p tcp –dport 9000 -j ACCEPT

保存iptables配置,完成。

service iptables save

**************20140911增加**************
在某两台机器上配置时,POSTROUTING表不起作用,或者说,iptables似乎对这种转发性能不“够”?10次里成功1次,一段时间里只成功1次,很奇怪,在iptables日志里看不出来异常。后来尝试如下配置,成功率目前看来100%,第一条不变,第二条换一种方式:
#iptables -t nat -A PREROUTING -d 192.168.0.54 -p tcp –dport 9000 -j LOG –log-prefix “*** IN ***” –log-level 4
iptables -t nat -A PREROUTING -d 192.168.0.54 -p tcp –dport 9000 -j DNAT –to 192.168.0.61:9000
#iptables -t nat -A POSTROUTING -d 192.168.0.61 -p tcp –dport 9000 -j LOG –log-prefix “*** IN ***” –log-level 4
iptables -t nat -A POSTROUTING -d 192.168.0.61 -p tcp –dport 9000 -j MASQUERADE
**************20140911增加结束**************
==========================================================================================
附其它文章:http://xmmok.blog.sohu.com/260275436.html
本机端口转发

转发8081到3306

iptables -t nat -A PREROUTING -p tcp –dport 8081 -j REDIRECT –to-ports 3306

转发所有端口

配置单网卡PPTP VPN的时候需要用到此条配置
转发所有tcp访问到外网ip

iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o eth0 -j MASQUERADE

端口转发跳板

单网卡通过 192.168.1.100:8081 访问 192.168.1.101:3306

iptables -t nat -A PREROUTING -d 192.168.1.100 -p tcp –dport 8081 -j DNAT –to-destination 192.168.1.101:3306
iptables -t nat -A POSTROUTING -d 192.168.1.101 -p tcp –dport 3306 -j SNAT –to 192.168.1.100
顺便说说SNAT, DNAT与MASQUERADE区别

SNAT: source nat 源网络地址转换
数据包从网卡发送出去的时候,把数据包中的源地址部分替换为指定的IP
接收方就认为数据包的来源是被替换的那个IP的主机
在目标机连接外部时要用到这种转换, 例如上面192.168.1.101数据返回到外部访问

分类: Linux安全防护 标签:

[SOLVED]iptables table `NAT’: Table does not exist (do … to insmod?)

2016年11月8日 评论已被关闭

[SOLVED]iptables table `NAT’: Table does not exist (do … to insmod?)
https://bbs.archlinux.org/viewtopic.php?id=182400
[root@machine ~]# iptables -t NAT -A POSTROUTING -s 192.168.1.0/24 -o enp2s0 -j MASQUERADE
iptables v1.4.21: can’t initialize iptables table `NAT’: Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
It’s probably extremely easy to solve this issue, but I’ve bashed my head on this one for far to long.
Latest update just installed with
pacman -Syu
and the machine is freshly rebooted.
Standard kernel/installation of Arch, nothing fancy.
All my other iptable rules work like a charm, only thing missing is the NAT table.
Called a few modprobes without any luck.
Some other general information:
[root@machine ~]# ls /lib/modules/*/kernel/net/*/netfilter/
/lib/modules/3.14.5-1-ARCH/kernel/net/bridge/netfilter/:
ebt_802_3.ko.gz ebtables.ko.gz ebt_dnat.ko.gz ebt_log.ko.gz ebt_pkttype.ko.gz ebt_ulog.ko.gz
ebtable_broute.ko.gz ebt_among.ko.gz ebt_ip6.ko.gz ebt_mark.ko.gz ebt_redirect.ko.gz ebt_vlan.ko.gz
ebtable_filter.ko.gz ebt_arp.ko.gz ebt_ip.ko.gz ebt_mark_m.ko.gz ebt_snat.ko.gz nf_tables_bridge.ko.gz
ebtable_nat.ko.gz ebt_arpreply.ko.gz ebt_limit.ko.gz ebt_nflog.ko.gz ebt_stp.ko.gz

/lib/modules/3.14.5-1-ARCH/kernel/net/ipv4/netfilter/:
arptable_filter.ko.gz iptable_nat.ko.gz ipt_CLUSTERIP.ko.gz ipt_SYNPROXY.ko.gz nf_nat_ipv4.ko.gz nf_tables_ipv4.ko.gz
arp_tables.ko.gz iptable_raw.ko.gz ipt_ECN.ko.gz ipt_ULOG.ko.gz nf_nat_pptp.ko.gz nft_chain_nat_ipv4.ko.gz
arpt_mangle.ko.gz iptable_security.ko.gz ipt_MASQUERADE.ko.gz nf_conntrack_ipv4.ko.gz nf_nat_proto_gre.ko.gz nft_chain_route_ipv4.ko.gz
iptable_filter.ko.gz ip_tables.ko.gz ipt_REJECT.ko.gz nf_defrag_ipv4.ko.gz nf_nat_snmp_basic.ko.gz nft_reject_ipv4.ko.gz
iptable_mangle.ko.gz ipt_ah.ko.gz ipt_rpfilter.ko.gz nf_nat_h323.ko.gz nf_tables_arp.ko.gz

/lib/modules/3.14.5-1-ARCH/kernel/net/ipv6/netfilter/:
ip6table_filter.ko.gz ip6_tables.ko.gz ip6t_ipv6header.ko.gz ip6t_rpfilter.ko.gz nf_nat_ipv6.ko.gz
ip6table_mangle.ko.gz ip6t_ah.ko.gz ip6t_MASQUERADE.ko.gz ip6t_rt.ko.gz nf_tables_ipv6.ko.gz
ip6table_nat.ko.gz ip6t_eui64.ko.gz ip6t_mh.ko.gz ip6t_SYNPROXY.ko.gz nft_chain_nat_ipv6.ko.gz
ip6table_raw.ko.gz ip6t_frag.ko.gz ip6t_NPT.ko.gz nf_conntrack_ipv6.ko.gz nft_chain_route_ipv6.ko.gz
ip6table_security.ko.gz ip6t_hbh.ko.gz ip6t_REJECT.ko.gz nf_defrag_ipv6.ko.gz nft_reject_ipv6.ko.gz
[root@machine ~]# iptables –version
iptables v1.4.21
[root@machine ~]# cat /proc/net/ip_tables_names
[root@machine ~]#
[root@machine doxid]# lsmod
Module Size Used by
iptable_mangle 1616 0
iptable_nat 3454 0
nf_conntrack_ipv4 9474 1
nf_defrag_ipv4 1499 1 nf_conntrack_ipv4
nf_nat_ipv4 3728 1 iptable_nat
nf_nat 13069 2 nf_nat_ipv4,iptable_nat
nf_conntrack 75784 4 nf_nat,nf_nat_ipv4,iptable_nat,nf_conntrack_ipv4
iptable_filter 1552 0
ctr 3927 2
ccm 8278 2
bridge 99966 0
stp 1653 1 bridge
llc 3729 2 stp,bridge
ip_tables 18051 3 iptable_filter,iptable_mangle,iptable_nat
x_tables 17344 3 ip_tables,iptable_filter,iptable_mangle
tun 20995 2
snd_hda_codec_hdmi 36716 1
arc4 2064 2
snd_hda_codec_realtek 48293 1
snd_hda_codec_generic 53860 1 snd_hda_codec_realtek
pcmcia 46612 0
ath9k 94641 0
ath9k_common 1906 1 ath9k
tg3 158849 0
coretemp 6550 0
ath9k_hw 396166 2 ath9k_common,ath9k
ptp 8404 1 tg3
ath 19419 3 ath9k_common,ath9k,ath9k_hw
mac80211 510593 1 ath9k
pps_core 8993 1 ptp
yenta_socket 34233 0
libphy 21863 1 tg3
joydev 10367 0
snd_hda_intel 38728 0
hwmon 3153 2 tg3,coretemp
mousedev 10912 0
iTCO_wdt 5535 0
cfg80211 459335 3 ath,ath9k,mac80211
pcmcia_rsrc 9392 1 yenta_socket
pcmcia_core 14655 3 pcmcia,pcmcia_rsrc,yenta_socket
i915 753180 1
acer_wmi 24550 0
sparse_keymap 3242 1 acer_wmi
iTCO_vendor_support 1929 1 iTCO_wdt
led_class 3611 2 ath9k,acer_wmi
rfkill 15971 3 cfg80211,acer_wmi
drm_kms_helper 35720 1 i915
snd_hda_codec 101816 4 snd_hda_codec_realtek,snd_hda_codec_hdmi,snd_hda_codec_generic,snd_hda_intel
snd_hwdep 6396 1 snd_hda_codec
snd_pcm 81607 3 snd_hda_codec_hdmi,snd_hda_codec,snd_hda_intel
microcode 17157 0
pcspkr 2059 0
mxm_wmi 1595 0
snd_timer 19038 1 snd_pcm
drm 242043 2 i915,drm_kms_helper
psmouse 92968 0
snd 60086 8 snd_hda_codec_realtek,snd_hwdep,snd_timer,snd_hda_codec_hdmi,snd_pcm,snd_hda_codec_generic,snd_hda_codec,snd_hda_intel
shpchp 25706 0
i2c_i801 11364 0
evdev 11784 4
mac_hid 3273 0
serio_raw 5009 0
i2c_algo_bit 5480 1 i915
i2c_core 25400 5 drm,i915,i2c_i801,drm_kms_helper,i2c_algo_bit
lpc_ich 13560 0
soundcore 5551 1 snd
wmi 8539 2 acer_wmi,mxm_wmi
thermal 8812 0
intel_agp 11504 0
intel_gtt 12856 3 i915,intel_agp
battery 7821 0
ac 3366 0
video 12057 2 i915,acer_wmi
button 4765 1 i915
processor 25217 1
ext4 505189 1
crc16 1359 1 ext4
mbcache 6266 1 ext4
jbd2 86487 1 ext4
sd_mod 37234 2
sr_mod 15026 0
cdrom 35191 1 sr_mod
crc_t10dif 1135 1 sd_mod
crct10dif_common 1436 1 crc_t10dif
ata_generic 3434 0
pata_acpi 3579 0
atkbd 16934 0
libps2 4507 2 atkbd,psmouse
ata_piix 25496 1
libata 174140 3 pata_acpi,ata_generic,ata_piix
scsi_mod 137312 3 libata,sd_mod,sr_mod
uhci_hcd 34795 0
ehci_pci 4152 0
ehci_hcd 64747 1 ehci_pci
usbcore 187240 3 uhci_hcd,ehci_hcd,ehci_pci
usb_common 1712 1 usbcore
i8042 13135 2 acer_wmi,libps2
serio 10785 9 serio_raw,atkbd,i8042,psmouse
[root@machine doxid]# strace iptables -nvL
execve(“/usr/bin/iptables”, [“iptables”, “-nvL”], [/* 17 vars */]) = 0
brk(0) = 0x25f8000
access(“/etc/ld.so.preload”, R_OK) = -1 ENOENT (No such file or directory)
open(“/etc/ld.so.cache”, O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=81635, …}) = 0
mmap(NULL, 81635, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f0b4672b000
close(3) = 0
open(“/usr/lib/libip4tc.so.0”, O_RDONLY|O_CLOEXEC) = 3
read(3, “\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20\32\0\0\0\0\0\0″…, 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=31440, …}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0b4672a000
mmap(NULL, 2126632, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f0b46317000
mprotect(0x7f0b4631d000, 2097152, PROT_NONE) = 0
mmap(0x7f0b4651d000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6000) = 0x7f0b4651d000
close(3) = 0
open(“/usr/lib/libip6tc.so.0”, O_RDONLY|O_CLOEXEC) = 3
read(3, “\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\33\0\0\0\0\0\0″…, 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=31472, …}) = 0
mmap(NULL, 2126664, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f0b4610f000
mprotect(0x7f0b46116000, 2093056, PROT_NONE) = 0
mmap(0x7f0b46315000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6000) = 0x7f0b46315000
close(3) = 0
open(“/usr/lib/libxtables.so.10”, O_RDONLY|O_CLOEXEC) = 3
read(3, “\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@4\0\0\0\0\0\0″…, 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=51984, …}) = 0
mmap(NULL, 2149016, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f0b45f02000
mprotect(0x7f0b45f0d000, 2097152, PROT_NONE) = 0
mmap(0x7f0b4610d000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xb000) = 0x7f0b4610d000
close(3) = 0
open(“/usr/lib/libc.so.6”, O_RDONLY|O_CLOEXEC) = 3
read(3, “\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20\1\2\0\0\0\0\0″…, 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2047384, …}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0b46729000
mmap(NULL, 3858192, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f0b45b54000
mprotect(0x7f0b45cf8000, 2097152, PROT_NONE) = 0
mmap(0x7f0b45ef8000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1a4000) = 0x7f0b45ef8000
mmap(0x7f0b45efe000, 16144, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f0b45efe000
close(3) = 0
open(“/usr/lib/libdl.so.2”, O_RDONLY|O_CLOEXEC) = 3
read(3, “\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\16\0\0\0\0\0\0″…, 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=14672, …}) = 0
mmap(NULL, 2109712, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f0b45950000
mprotect(0x7f0b45953000, 2093056, PROT_NONE) = 0
mmap(0x7f0b45b52000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f0b45b52000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0b46728000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0b46727000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0b46726000
arch_prctl(ARCH_SET_FS, 0x7f0b46727700) = 0
mprotect(0x7f0b45ef8000, 16384, PROT_READ) = 0
mprotect(0x7f0b45b52000, 4096, PROT_READ) = 0
mprotect(0x7f0b4610d000, 4096, PROT_READ) = 0
mprotect(0x7f0b46315000, 4096, PROT_READ) = 0
mprotect(0x7f0b4651d000, 4096, PROT_READ) = 0
mprotect(0x613000, 4096, PROT_READ) = 0
mprotect(0x7f0b4673f000, 4096, PROT_READ) = 0
munmap(0x7f0b4672b000, 81635) = 0
socket(PF_LOCAL, SOCK_STREAM, 0) = 3
bind(3, {sa_family=AF_LOCAL, sun_path=@”xtables”}, 10) = 0
socket(PF_INET, SOCK_RAW, IPPROTO_RAW) = 4
fcntl(4, F_SETFD, FD_CLOEXEC) = 0
getsockopt(4, SOL_IP, 0x40 /* IP_??? */, “filter\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0″…, [84]) = 0
brk(0) = 0x25f8000
brk(0x2619000) = 0x2619000
getsockopt(4, SOL_IP, 0x41 /* IP_??? */, “filter\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0″…, [672]) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), …}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0b4673e000
write(1, “Chain INPUT (policy ACCEPT 11953″…, 54Chain INPUT (policy ACCEPT 11953 packets, 964K bytes)
) = 54
write(1, ” pkts bytes target prot opt “…, 89 pkts bytes target prot opt in out source destination
) = 89
write(1, “\n”, 1
) = 1
write(1, “Chain FORWARD (policy ACCEPT 0 p”…, 49Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
) = 49
write(1, ” pkts bytes target prot opt “…, 89 pkts bytes target prot opt in out source destination
) = 89
write(1, “\n”, 1
) = 1
write(1, “Chain OUTPUT (policy ACCEPT 1284″…, 56Chain OUTPUT (policy ACCEPT 12848 packets, 1242K bytes)
) = 56
write(1, ” pkts bytes target prot opt “…, 89 pkts bytes target prot opt in out source destination
) = 89
close(4) = 0
exit_group(0) = ?
+++ exited with 0 +++
[root@machine ~]# zgrep FILTER /proc/config.gz
CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
CONFIG_SECCOMP_FILTER=y
CONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not set
CONFIG_NETFILTER_ADVANCED=y
CONFIG_BRIDGE_NETFILTER=y
CONFIG_NETFILTER_NETLINK=m
CONFIG_NETFILTER_NETLINK_ACCT=m
CONFIG_NETFILTER_NETLINK_QUEUE=m
CONFIG_NETFILTER_NETLINK_LOG=m
CONFIG_NETFILTER_NETLINK_QUEUE_CT=y
CONFIG_NETFILTER_SYNPROXY=m
CONFIG_NETFILTER_XTABLES=m
CONFIG_NETFILTER_XT_MARK=m
CONFIG_NETFILTER_XT_CONNMARK=m
CONFIG_NETFILTER_XT_SET=m
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m
CONFIG_NETFILTER_XT_TARGET_CT=m
CONFIG_NETFILTER_XT_TARGET_DSCP=m
CONFIG_NETFILTER_XT_TARGET_HL=m
CONFIG_NETFILTER_XT_TARGET_HMARK=m
CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m
CONFIG_NETFILTER_XT_TARGET_LED=m
CONFIG_NETFILTER_XT_TARGET_LOG=m
CONFIG_NETFILTER_XT_TARGET_MARK=m
CONFIG_NETFILTER_XT_TARGET_NETMAP=m
CONFIG_NETFILTER_XT_TARGET_NFLOG=m
CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
CONFIG_NETFILTER_XT_TARGET_NOTRACK=m
CONFIG_NETFILTER_XT_TARGET_RATEEST=m
CONFIG_NETFILTER_XT_TARGET_REDIRECT=m
CONFIG_NETFILTER_XT_TARGET_TEE=m
CONFIG_NETFILTER_XT_TARGET_TPROXY=m
CONFIG_NETFILTER_XT_TARGET_TRACE=m
CONFIG_NETFILTER_XT_TARGET_SECMARK=m
CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m
CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m
CONFIG_NETFILTER_XT_MATCH_BPF=m
CONFIG_NETFILTER_XT_MATCH_CGROUP=m
CONFIG_NETFILTER_XT_MATCH_CLUSTER=m
CONFIG_NETFILTER_XT_MATCH_COMMENT=m
CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m
CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m
CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
CONFIG_NETFILTER_XT_MATCH_CPU=m
CONFIG_NETFILTER_XT_MATCH_DCCP=m
CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m
CONFIG_NETFILTER_XT_MATCH_DSCP=m
CONFIG_NETFILTER_XT_MATCH_ECN=m
CONFIG_NETFILTER_XT_MATCH_ESP=m
CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
CONFIG_NETFILTER_XT_MATCH_HELPER=m
CONFIG_NETFILTER_XT_MATCH_HL=m
CONFIG_NETFILTER_XT_MATCH_IPCOMP=m
CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
CONFIG_NETFILTER_XT_MATCH_IPVS=m
CONFIG_NETFILTER_XT_MATCH_L2TP=m
CONFIG_NETFILTER_XT_MATCH_LENGTH=m
CONFIG_NETFILTER_XT_MATCH_LIMIT=m
CONFIG_NETFILTER_XT_MATCH_MAC=m
CONFIG_NETFILTER_XT_MATCH_MARK=m
CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
CONFIG_NETFILTER_XT_MATCH_NFACCT=m
CONFIG_NETFILTER_XT_MATCH_OSF=m
CONFIG_NETFILTER_XT_MATCH_OWNER=m
CONFIG_NETFILTER_XT_MATCH_POLICY=m
CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m
CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
CONFIG_NETFILTER_XT_MATCH_QUOTA=m
CONFIG_NETFILTER_XT_MATCH_RATEEST=m
CONFIG_NETFILTER_XT_MATCH_REALM=m
CONFIG_NETFILTER_XT_MATCH_RECENT=m
CONFIG_NETFILTER_XT_MATCH_SCTP=m
CONFIG_NETFILTER_XT_MATCH_SOCKET=m
CONFIG_NETFILTER_XT_MATCH_STATE=m
CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
CONFIG_NETFILTER_XT_MATCH_STRING=m
CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
CONFIG_NETFILTER_XT_MATCH_TIME=m
CONFIG_NETFILTER_XT_MATCH_U32=m
CONFIG_IP_NF_MATCH_RPFILTER=m
CONFIG_IP_NF_FILTER=m
CONFIG_IP_NF_ARPFILTER=m
CONFIG_IP6_NF_MATCH_RPFILTER=m
CONFIG_IP6_NF_FILTER=m
CONFIG_BRIDGE_EBT_T_FILTER=m
# CONFIG_ATM_BR2684_IPFILTER is not set
CONFIG_BRIDGE_VLAN_FILTERING=y
CONFIG_BT_BNEP_MC_FILTER=y
CONFIG_BT_BNEP_PROTO_FILTER=y
CONFIG_PPP_FILTER=y
CONFIG_IPPP_FILTER=y
Even tho i think the module is properly loaded, i ran:
[root@machine ~]# modprobe iptable-filter
[root@machine ~]# echo $?
130

Have you tried using “-t nat” instead of “-t NAT” in your iptables command?

分类: Linux安全防护 标签:

iptables详解

2016年11月8日 评论已被关闭

iptables详解

http://blog.chinaunix.net/uid-22780578-id-3346350.html

一:前言
 
防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种。无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘。而我们的任务就是需要去定义到底防火墙如何工作,这就是防火墙的策略,规则,以达到让它对出入网络的IP、数据进行检测。
 
目前市面上比较常见的有3、4层的防火墙,叫网络层的防火墙,还有7层的防火墙,其实是代理层的网关
 
对于TCP/IP的七层模型来讲,我们知道第三层是网络层,三层的防火墙会在这层对源地址和目标地址进行检测。但是对于七层的防火墙,不管你源端口或者目标端口,源地址或者目标地址是什么,都将对你所有的东西进行检查。所以,对于设计原理来讲,七层防火墙更加安全,但是这却带来了效率更低。所以市面上通常的防火墙方案,都是两者结合的。而又由于我们都需要从防火墙所控制的这个口来访问,所以防火墙的工作效率就成了用户能够访问数据多少的一个最重要的控制,配置的不好甚至有可能成为流量的瓶颈。
 
二:iptables 的历史以及工作原理
 
1.iptables的发展:
 
iptables的前身叫ipfirewall (内核1.x时代),这是一个作者从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。但是ipfirewall工作功能极其有限(它需要将所有的规则都放进内核当中,这样规则才能够运行起来,而放进内核,这个做法一般是极其困难的)。当内核发展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用,而现在,它叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能
 
他们都是工作在用户空间中,定义规则的工具,本身并不算是防火墙。它们定义的规则,可以让在内核空间当中的netfilter来读取,并且实现让防火墙工作。而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的地方就叫做 netfilter.(网络过滤器)
 
    作者一共在内核空间中选择了5个位置,
    1.内核空间中:从一个网络接口进来,到另一个网络接口去的
    2.数据包从内核流入用户空间的
    3.数据包从用户空间流出的
    4.进入/离开本机的外网接口
    5.进入/离开本机的内网接口
        
2.iptables的工作机制
 
从上面的发展我们知道了作者选择了5个位置,来作为控制的地方,但是你有没有发现,其实前三个位置已经基本上能将路径彻底封锁了,但是为什么已经在进出的口设置了关卡之后还要在内部卡呢? 由于数据包尚未进行路由决策,还不知道数据要走向哪里,所以在进出口是没办法实现数据过滤的。所以要在内核空间里设置转发的关卡,进入用户空间的关卡,从用户空间出去的关卡。那么,既然他们没什么用,那我们为什么还要放置他们呢?因为我们在做NAT和DNAT的时候,目标地址转换必须在路由之前转换。所以我们必须在外网而后内网的接口处进行设置关卡。        
 
这五个位置也被称为五个钩子函数(hook functions),也叫五个规则链。
1.PREROUTING (路由前)
2.INPUT (数据包流入口)
3.FORWARD (转发管卡)
4.OUTPUT(数据包出口)
5.POSTROUTING(路由后)
        这是NetFilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。       
 
3.防火墙的策略
 
防火墙策略一般分为两种,一种叫“通”策略,一种叫“堵”策略,通策略,默认门是关着的,必须要定义谁能进堵策略则是,大门是洞开的,但是你必须有身份认证,否则不能进。所以我们要定义,让进来的进来,让出去的出去,所以通,是要全通,而堵,则是要选择。当我们定义的策略的时候,要分别定义多条功能,其中:定义数据包中允许或者不允许的策略,filter过滤的功能,而定义地址转换的功能的则是nat选项。为了让这些功能交替工作,我们制定出了“表”这个定义,来定义、区分各种不同的工作功能和处理方式。
 
我们现在用的比较多个功能有3个:
1.filter 定义允许或者不允许的
2.nat 定义地址转换的 
                3.mangle功能:修改报文原数据
 
我们修改报文原数据就是来修改TTL的。能够实现将数据包的元数据拆开,在里面做标记/修改内容的。而防火墙标记,其实就是靠mangle来实现的。
 
小扩展:
对于filter来讲一般只能做在3个链上:INPUT ,FORWARD ,OUTPUT
对于nat来讲一般也只能做在3个链上:PREROUTING ,OUTPUT ,POSTROUTING
而mangle则是5个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
 
iptables/netfilter(这款软件)是工作在用户空间的,它可以让规则进行生效的,本身不是一种服务,而且规则是立即生效的。而我们iptables现在被做成了一个服务,可以进行启动,停止的。启动,则将规则直接生效,停止,则将规则撤销。 
iptables还支持自己定义链。但是自己定义的链,必须是跟某种特定的链关联起来的。在一个关卡设定,指定当有数据的时候专门去找某个特定的链来处理,当那个链处理完之后,再返回。接着在特定的链中继续检查。
 
注意:规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的。
 
三.规则的写法:
 
iptables定义规则的方式比较复杂:
格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION
-t table :3个filter nat mangle
COMMAND:定义如何对规则进行管理
chain:指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候,是可以省略的
CRETIRIA:指定匹配标准
-j ACTION :指定如何进行处理
 
比如:不允许172.16.0.0/24的进行访问。
iptables -t filter -A INPUT -s 172.16.0.0/16 -p udp –dport 53 -j DROP
当然你如果想拒绝的更彻底:
iptables -t filter -R INPUT 1 -s 172.16.0.0/16 -p udp –dport 53 -j REJECT
 
iptables -L -n -v #查看定义规则的详细信息
 
四:详解COMMAND:
 
1.链管理命令(这都是立即生效的)
-P :设置默认策略的(设定默认门是关着的还是开着的)
默认策略一般只有两种
iptables -P INPUT (DROP|ACCEPT)  默认是关的/默认是开的
比如:
iptables -P INPUT DROP 这就把默认规则给拒绝了。并且没有定义哪个动作,所以关于外界连接的所有规则包括Xshell连接之类的,远程连接都被拒绝了。
        -F: FLASH,清空规则链的(注意每个链的管理权限)
    iptables -t nat -F PREROUTING
    iptables -t nat -F 清空nat表的所有链
        -N:NEW 支持用户新建一个链
            iptables -N inbound_tcp_web 表示附在tcp表上用于检查web的。
        -X: 用于删除用户自定义的空链
            使用方法跟-N相同,但是在删除之前必须要将里面的链给清空昂了
        -E:用来Rename chain主要是用来给用户自定义的链重命名
            -E oldname newname
         -Z:清空链,及链中默认规则的计数器的(有两个计数器,被匹配到多少个数据包,多少个字节)
            iptables -Z :清空
 
2.规则管理命令
         -A:追加,在当前链的最后新增一个规则
         -I num : 插入,把当前规则插入为第几条。
            -I 3 :插入为第三条
         -R num:Replays替换/修改第几条规则
            格式:iptables -R 3 …………
         -D num:删除,明确指定删除第几条规则
        
3.查看管理命令 “-L”
附加子命令
-n:以数字的方式显示ip,它会将ip直接显示出来,如果不加-n,则会将ip反向解析成主机名。
-v:显示详细信息
-vv
-vvv :越多越详细
-x:在计数器上显示精确值,不做单位换算
–line-numbers : 显示规则的行号
-t nat:显示所有的关卡的信息
 
五:详解匹配标准
 
1.通用匹配:源地址目标地址的匹配
-s:指定作为源地址匹配,这里不能指定主机名称,必须是IP
IP | IP/MASK | 0.0.0.0/0.0.0.0
而且地址可以取反,加一个“!”表示除了哪个IP之外
-d:表示匹配目标地址
-p:用于匹配协议的(这里的协议通常有3种,TCP/UDP/ICMP)
-i eth0:从这块网卡流入的数据
流入一般用在INPUT和PREROUTING上
-o eth0:从这块网卡流出的数据
流出一般在OUTPUT和POSTROUTING上
        
2.扩展匹配
2.1隐含扩展:对协议的扩展
    -p tcp :TCP协议的扩展。一般有三种扩展
–dport XX-XX:指定目标端口,不能指定多个非连续端口,只能指定单个端口,比如
–dport 21  或者 –dport 21-23 (此时表示21,22,23)
–sport:指定源端口
–tcp-fiags:TCP的标志位(SYN,ACK,FIN,PSH,RST,URG)
    对于它,一般要跟两个参数:
1.检查的标志位
2.必须为1的标志位
–tcpflags syn,ack,fin,rst syn   =    –syn
表示检查这4个位,这4个位中syn必须为1,其他的必须为0。所以这个意思就是用于检测三次握手的第一次包的。对于这种专门匹配第一包的SYN为1的包,还有一种简写方式,叫做–syn
    -p udp:UDP协议的扩展
        –dport
        –sport
    -p icmp:icmp数据报文的扩展
        –icmp-type:
echo-request(请求回显),一般用8 来表示
所以 –icmp-type 8 匹配请求回显数据包
echo-reply (响应的数据包)一般用0来表示
                  
2.2显式扩展(-m)
     扩展各种模块
      -m multiport:表示启用多端口扩展
      之后我们就可以启用比如 –dports 21,23,80
                  
        
六:详解-j ACTION
 
常用的ACTION:
DROP:悄悄丢弃
一般我们多用DROP来隐藏我们的身份,以及隐藏我们的链表
REJECT:明示拒绝
ACCEPT:接受
custom_chain:转向一个自定义的链
DNAT
SNAT
MASQUERADE:源地址伪装
REDIRECT:重定向:主要用于实现端口重定向
MARK:打防火墙标记的
RETURN:返回
在自定义链执行完毕后使用返回,来返回原规则链。
 
练习题1:
     只要是来自于172.16.0.0/16网段的都允许访问我本机的172.16.100.1的SSHD服务
     分析:首先肯定是在允许表中定义的。因为不需要做NAT地址转换之类的,然后查看我们SSHD服务,在22号端口上,处理机制是接受,对于这个表,需要有一来一回两个规则,如果我们允许也好,拒绝也好,对于访问本机服务,我们最好是定义在INPUT链上,而OUTPUT再予以定义就好。(会话的初始端先定义),所以加规则就是:
     定义进来的: iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp –dport 22 -j ACCEPT
     定义出去的: iptables -t filter -A OUTPUT -s 172.16.100.1 -d 172.16.0.0/16 -p tcp –dport 22 -j ACCEPT
     将默认策略改成DROP:
 iptables -P INPUT DROP
 iptables -P OUTPUT DROP
 iptables -P FORWARD DROP
        
七:状态检测:
 
是一种显式扩展,用于检测会话之间的连接关系的,有了检测我们可以实现会话间功能的扩展
        什么是状态检测?对于整个TCP协议来讲,它是一个有连接的协议,三次握手中,第一次握手,我们就叫NEW连接,而从第二次握手以后的,ack都为1,这是正常的数据传输,和tcp的第二次第三次握手,叫做已建立的连接(ESTABLISHED),还有一种状态,比较诡异的,比如:SYN=1 ACK=1 RST=1,对于这种我们无法识别的,我们都称之为INVALID无法识别的。还有第四种,FTP这种古老的拥有的特征,每个端口都是独立的,21号和20号端口都是一去一回,他们之间是有关系的,这种关系我们称之为RELATED。
所以我们的状态一共有四种:
        NEW
        ESTABLISHED
        RELATED
        INVALID
 
所以我们对于刚才的练习题,可以增加状态检测。比如进来的只允许状态为NEW和ESTABLISHED的进来,出去只允许ESTABLISHED的状态出去,这就可以将比较常见的反弹式木马有很好的控制机制。
        
对于练习题的扩展:
进来的拒绝出去的允许,进来的只允许ESTABLISHED进来,出去只允许ESTABLISHED出去。默认规则都使用拒绝
iptables -L -n –line-number  :查看之前的规则位于第几行
    改写INPUT
        iptables -R INPUT 2 -s 172.16.0.0/16 -d 172.16.100.1 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
        iptables -R OUTPUT 1 -m state –state ESTABLISHED -j ACCEPT
 
    此时如果想再放行一个80端口如何放行呢?
        iptables -A INPUT -d 172.16.100.1 -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT
 
        iptables -R INPUT 1 -d 172.16.100.1 -p udp –dport 53 -j ACCEPT
 
练习题2:
假如我们允许自己ping别人,但是别人ping自己ping不通如何实现呢?
分析:对于ping这个协议,进来的为8(ping),出去的为0(响应).我们为了达到目的,需要8出去,允许0进来
 
在出去的端口上:iptables -A OUTPUT -p icmp –icmp-type 8 -j ACCEPT
在进来的端口上:iptables -A INPUT -p icmp –icmp-type 0 -j ACCEPT
 
小扩展:对于127.0.0.1比较特殊,我们需要明确定义它
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
 
八:SNAT和DNAT的实现
 
由于我们现在IP地址十分紧俏,已经分配完了,这就导致我们必须要进行地址转换,来节约我们仅剩的一点IP资源。那么通过iptables如何实现NAT的地址转换呢?
 
1.SNAT基于原地址的转换
基于原地址的转换一般用在我们的许多内网用户通过一个外网的口上网的时候,这时我们将我们内网的地址转换为一个外网的IP,我们就可以实现连接其他外网IP的功能
所以我们在iptables中就要定义到底如何转换:
定义的样式:
比如我们现在要将所有192.168.10.0网段的IP在经过的时候全都转换成172.16.100.1这个假设出来的外网地址:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT –to-source 172.16.100.1
这样,只要是来自本地网络的试图通过网卡访问网络的,都会被统统转换成172.16.100.1这个IP.
那么,如果172.16.100.1不是固定的怎么办?
我们都知道当我们使用联通或者电信上网的时候,一般它都会在每次你开机的时候随机生成一个外网的IP,意思就是外网地址是动态变换的。这时我们就要将外网地址换成 MASQUERADE(动态伪装):它可以实现自动寻找到外网地址,而自动将其改为正确的外网地址。所以,我们就需要这样设置:
         iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
         这里要注意:地址伪装并不适用于所有的地方。
 
2.DNAT目标地址转换
对于目标地址转换,数据流向是从外向内的,外面的是客户端,里面的是服务器端通过目标地址转换,我们可以让外面的ip通过我们对外的外网ip来访问我们服务器不同的服务器,而我们的服务却放在内网服务器的不同的服务器上
 
    如何做目标地址转换呢?:
iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp –dport 80 -j DNAT –todestination 172.16.100.2
        目标地址转换要做在到达网卡之前进行转换,所以要做在PREROUTING这个位置上
 
九:控制规则的存放以及开启
 
注意:你所定义的所有内容,当你重启的时候都会失效,要想我们能够生效,需要使用一个命令将它保存起来
1.service iptables save 命令
它会保存在/etc/sysconfig/iptables这个文件中
    2.iptables-save 命令
iptables-save > /etc/sysconfig/iptables
 
    3.iptables-restore 命令
开机的时候,它会自动加载/etc/sysconfig/iptabels
如果开机不能加载或者没有加载,而你想让一个自己写的配置文件(假设为iptables.2)手动生效的话:
iptables-restore < /etc/sysconfig/iptables.2
则完成了将iptables中定义的规则手动生效
 
 
十:总结
         Iptables是一个非常重要的工具,它是每一个防火墙上几乎必备的设置,也是我们在做大型网络的时候,为了很多原因而必须要设置的。学好Iptables,可以让我们对整个网络的结构有一个比较深刻的了解,同时,我们还能够将内核空间中数据的走向以及linux的安全给掌握的非常透彻。我们在学习的时候,尽量能结合着各种各样的项目,实验来完成,这样对你加深iptables的配置,以及各种技巧有非常大的帮助。
附加iptables比较好的文章:

 

分类: Linux安全防护 标签: