近日将iptables防火墙捣弄了下,按以下链接每一条规则输一遍:

25个iptables常用示例 | 《Linux就该这么学》

其中知识点在这里分享下:

1、iptables是linux的内核,没有开启和关闭,一经保存就生效。

2、-A 和 -I 的区别

结论:-A 会将后执行的策略添加到已有策略后,而-I 则会插入到已有策略的前(既成为第一条策略)

-A参数

iptables是由上往下进行匹配

iptables -A INPUT -s 192.168.228.0/24 -p tcp --dport 22 -j ACCEPT

iptables -A INPUT -s 10.153.97.0/24 -p tcp --dport 22 -j ACCEPT

iptables -A INPUT -p tcp --dport 22 -j DROP

执行以上三条命令后,防火墙由上往下匹配,既从num 1开始匹配到num 3,则允许192.168.228.0/24和10.153.97.0/24这两个网段访问,其他不允许访问

[root@GDY-TEST07 etc]# iptables -L -n --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination        
1    ACCEPT     tcp  --  192.168.228.0/24     0.0.0.0/0           tcp dpt:22
2    ACCEPT     tcp  --  10.153.97.0/24       0.0.0.0/0           tcp dpt:22
3    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:22

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination        

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

对比    -I 参数

iptables -I INPUT -s 192.168.228.0/24 -p tcp --dport 22 -j ACCEPT

iptables -I INPUT -s 10.153.97.0/24 -p tcp --dport 22 -j ACCEPT

iptables -I INPUT -p tcp --dport 22 -j DROP

执行以上三条命令后,防火墙由上往下匹配,既从num 1开始匹配,此时num 1的防火墙策略已将访问拒绝,num 2和num 3即使accept也不会生效

[root@GDY-TEST07 etc]# iptables -L -n --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:22        
2    ACCEPT     tcp  --  192.168.228.0/24     0.0.0.0/0           tcp dpt:22
3    ACCEPT     tcp  --  10.153.97.0/24       0.0.0.0/0           tcp dpt:22

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination        

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

3、dport和sport的区别:

先来翻译一下dport和sport的意思:

dport:目的端口 
sport:来源端口 

dport 和sport字面意思来说很好理解,一个是数据要到达的目的端口,一个是数据来源的端口。

但是在使用的时候要分具体情况来对待,这个具体情况就是你的数据包的流动行为方式。(INPUT还是OUTPUT)

比如你的例子:iptables -A INPUT -p tcp –dport 80 -j ACCEPT 
注意里面的INPUT参数,这个代表你的这条数据包的进行的 “进入” 操作! 
那么你的这条数据包可以这么描述: 
1.这是一条从外部进入内部本地服务器的数据。 
2.数据包的目的(dport)地址是80,就是要访问我本地的80端口。 
3.允许以上的数据行为通过。 
总结:允许外部数据访问我的本地服务器80端口。

再看第2条列子:iptables -A INPUT -p tcp –sport 80 -j ACCEPT 
1.这是一条从外部进入内部本地服务器的数据。 
2.数据包的来源端口是(sport)80,就是对方的数据包是80端口发送过来的。 
3.允许以上数据行为。 
总结:允许外部的来自80端口的数据访问我的本地服务器。

input方式总结: dport指本地,sport指外部。

如果你的数据包是(OUTPUT)行为,那么就是另外一种理解方式: 
比如: iptables -A OUTPUT -p tcp –dport 80 -j ACCEPT 
1.这是一条从内部出去的数据。 
2.出去的目的(dport)端口是80。 
3.允许以上数据行为。

output行为总结:dport只外部,sport指本地。

4、端口转发:

以端口转发3389为例,远程桌面连接linux 192.168.0.1,通过端口转发,连接到另一个win主机192.168.0.5:

1)#目标地址端口为3389的,转换为 192.168.0.1:3389

iptables -t nat -I PREROUTING -p tcp --dport 3389 -j DNAT --to 192.168.0.1 :3389

2)#凡目标地址为192.168.0.1:3389的,把源地址转换为192.168.0.5

iptables -t nat -I POSTROUTING -p tcp -d 192.168.0.5  --dport 3389 -j SNAT --to 192.168.0.1

3)若发现新增出错,可删除FORWARD 规则:

1

2

iptables -nL FORWARD --line-number

iptables -D FORWARD 1

删除一条nat 规则  删除SNAT规则

1

3

iptables -t nat  -D POSTROUTING  1

iptables -t nat -D POSTROUTING 7

3)设置sysctl命令用于运行时配置内核参数,否则端口转发失效

nano /etc/sysctl.conf

删除 #net.ipv4.ip_forward=1 前的#号,开启ipv4 forward

sysctl -p 从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载。