iptables用法初解

一、四表五链之间的关系

4个表:filter,nat,mangle,raw,默认表是filter(没有指定表的时候就是filter表)。表的处理优先级:raw>mangle>nat>filter。

filter:一般的过滤功能
nat:用于nat功能(端口映射,地址映射,中转IP等)
mangle:用于对特定数据包的修改
raw:有限级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能

5个链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。
PREROUTING:数据包进入路由表之前
INPUT:通过路由表后目的地为本机
FORWARDING:通过路由表后,目的地不为本机
OUTPUT:由本机产生,向外转发
POSTROUTIONG:发送到网卡接口之前。
关系如下两个图:

iptables中表和链的对应关系如下:

二、修改

1) 配置文件修改方式

iptables 装好后,可以用service iptables start来启动,默认是不写配置文件的,可以修改/etc/sysconfig/iptables-

config文件的IPTABLES_SAVE_ON_RESTART参数为"YES",那么再次service iptables restart后,会生成/etc/sysconfig/iptables文件,这个是iptables的规则配置文件。然后每次修改这个文件,重启iptables服务就可以生效。

2)使用iptables-save和iptables-restore实时修改

另一种方法可以实时的修改iptables,先调用iptables-save > 1.txt(任一文件), 1.txt保存的就是当前iptables所有的规则。然后修改1.txt文件,再调用iptables-restore 1.txt,这样可以实时的修改iptables。下面我们以一个IP中转的例子的说明操作

例1:中转机10.193.33.199, 客户机:10.194.40.99,内网(192.168.205.199) 服务器:192.168.207.31。前提:客户机与中转机是相通的,中转机和服务器是相通的,但是客户机和服务机不通,如何通过修改中转机的iptables使客户机能直接用ssh登录到服务器?

步骤1,打开中转机的IP转发功能,#echo "1" >/proc/sys/net/ipv4/ip_forward

步骤2,使用iptables-save > 1.txt,打开1.txt查看当前的所有配置,如下:

[cpp] view plaincopy
# Generated by iptables-save v1.3.5 on Wed Jan 23 13:42:41 2013
*nat
:PREROUTING ACCEPT [987255:120400313]
:POSTROUTING ACCEPT [69206:4531327]
:OUTPUT ACCEPT [69171:4525042]
COMMIT
# Completed on Wed Jan 23 13:42:41 2013
# Generated by iptables-save v1.3.5 on Wed Jan 23 13:42:41 2013
*filter
:INPUT ACCEPT [8263685:2471630642]
:FORWARD ACCEPT [744189:1336659724]
:OUTPUT ACCEPT [6320185:4534993027]
COMMIT
# Completed on Wed Jan 23 13:42:41 2013
修改如下:
[cpp] view plaincopy
# Generated by iptables-save v1.3.5 on Wed Jan 23 13:42:41 2013
*nat
:PREROUTING ACCEPT [987255:120400313]
:POSTROUTING ACCEPT [69206:4531327]
:OUTPUT ACCEPT [69171:4525042]
-A PREROUTING -s 10.194.41.99 -i eth0 -p tcp -m tcp --dport 22 -j DNAT --to-destination 192.168.207.31:22
-A POSTROUTING -s 10.194.41.99 -p tcp -m tcp -j SNAT --to-source 192.168.205.199
COMMIT
# Completed on Wed Jan 23 13:42:41 2013
# Generated by iptables-save v1.3.5 on Wed Jan 23 13:42:41 2013
*filter
:INPUT ACCEPT [8263685:2471630642]
:FORWARD ACCEPT [744189:1336659724]
:OUTPUT ACCEPT [6320185:4534993027]
COMMIT
# Completed on Wed Jan 23 13:42:41 2013

步骤3,iptables-restore 1.txt
此时,在客户机上ssh到中转机的IP上,实际上就已经ssh到服务机上了。

-A PREROUTING这一行是在路由前就会执行的,主要是把从客户机来的经过eth0口的tcp且目的端口是22(ssh端口)的请求的目的地址改为192.168.207.31:22。此时tcp封包就变成了由99机器到31机器的包,但是这个包如果到达了31机器,31机器是没办法回复此包的,因为31机器与99机器不通。

而第二行-A POSTROUTING 是在数据包出去时将客户机的IP改写成199的内网IP,即192.168.205.199,这个IP是中转机与服务机通信的IP,此时tcp封包就变成了由199机器到31机器的包,当31机器收到包后,就会直接回复199机器,而199机器就会回复客户机。

3)使用iptables命令直接修改当前配置,实时生效

直接用iptables命令查看和修改:

1、查看
iptables -nvL –line-number

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

2、添加
添加规则有两个参数:-A和-I。其中-A是添加到规则的末尾;-I可以插入到指定位置,没有指定位置的话默认插入到规则的首部。

当前规则:

[cpp] view plaincopy
[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
添加一条规则到尾部:

[cpp] view plaincopy
[root@test ~]# iptables -A INPUT -s 192.168.1.5 -j DROP

再插入一条规则到第三行,将行数直接写到规则链的后面:

[cpp] view plaincopy
[root@test ~]# iptables -I INPUT 3 -s 192.168.1.3 -j DROP
查看:

[cpp] view plaincopy
[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变成了第四行。

3、删除
删除用-D参数

删除之前添加的规则(iptables -A INPUT -s 192.168.1.5 -j DROP):

[cpp] view plaincopy
[root@test ~]# iptables -D INPUT -s 192.168.1.5 -j DROP
有时候要删除的规则太长,删除时要写一大串,既浪费时间又容易写错,这时我们可以先使用–line-number找出该条规则的行号,再通过行号删除规则。

[cpp] view plaincopy
[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
删除第二行规则

[cpp] view plaincopy
[root@test ~]# iptables -D INPUT 2
4、修改
修改使用-R参数

先看下当前规则:

[cpp] view plaincopy
[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:

[cpp] view plaincopy
[root@test ~]# iptables -R INPUT 3 -j ACCEPT
再查看下:

[cpp] view plaincopy
[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

转载自 http://blog.csdn.net/hepeng597/article/details/8270138

分享到:
Comment (1)
Trackback (0)
  • #2015/04/04 17:08

    = =,哥们 猜猜我是谁?

  • 还没有Trackback
Leave a Reply

昵称*

邮箱*

网址

0