码迷,mamicode.com
首页 > 其他好文 > 详细

linyux iptables SNAt NAT 【原创】

时间:2015-09-12 01:00:43      阅读:290      评论:0      收藏:0      [点我收藏+]

标签:linux iptables nat snat

 

 技术分享

 技术分享

技术分享

技术分享


rpm -ql iptables 查看安装的模块

 

iptables -t filter -L –n
iptables -L –n这两个命令的效果是一样的
iptables -t nat -L –n查nat表
iptables -t mangle -L –n查mangle表

 

 技术分享

 

 ==============================================



技术分享




 

[root@localhost ~]# iptables -help
Usage: iptables -[AD] chain rule-specification [options]
       iptables -I chain [rulenum] rule-specification [options]
       iptables -R chain rulenum rule-specification [options]
       iptables -D chain rulenum [options]
       iptables -[LS] [chain [rulenum]] [options]
       iptables -[FZ] [chain] [options]
       iptables -[NX] chain
       iptables -E old-chain-name new-chain-name
       iptables -P chain target [options]
       iptables -h (print this help information)
Commands:
Either long or short options are allowed.
  --append  -A chainAppend to chain
  --delete  -D chainDelete matching rule from chain
  --delete  -D chain rulenum
Delete rule rulenum (1 = first) from chain
  --insert  -I chain [rulenum]
Insert in chain as rulenum (default 1=first)
  --replace -R chain rulenum
Replace rule rulenum (1 = first) in chain
  --list    -L [chain [rulenum]]
List the rules in a chain or all chains
  --list-rules -S [chain [rulenum]]
Print the rules in a chain or all chains
  --flush   -F [chain]Delete all rules in  chain or all chains
  --zero    -Z [chain [rulenum]]
Zero counters in chain or all chains
  --new     -N chainCreate a new user-defined chain
  --delete-chain
            -X [chain]Delete a user-defined chain
  --policy  -P chain target
Change policy on chain to target
  --rename-chain
            -E old-chain new-chain
Change chain name, (moving any references)

 

 技术分享


-----------------------------------------------------------------------------------

iptables -L –n
iptables -L -n -t nat
iptables -L -n -t mangle
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -X
[root@localhost ~]# iptables –Z



以上三步只是临时清除,重启后原配置文件继续生效

[root@localhost ~]# iptables -L –n

对tcp协议的22端口做DROP动作

[root@localhost ~]# iptables -A INPUT -p tcp --dport 22 -j DROP

 

SSH工具连接立即失效

 技术分享






恢复

[root@localhost ~]# iptables -D INPUT -p tcp --dport 22 -j DROP

 技术分享



关闭所有,ping也ping不通

iptables -t filter -A INPUT -s 0.0.0.0/0.0.0.0 -d 192.168.1.4 -j DROP

恢复

iptables -F

关闭web服务

iptables -A INPUT -s 0.0.0.0/0.0.0.0 -d  192.168.1.4 -p tcp --dport 80 目标端口

别人ping不到我们

iptables -A INPUT -s 0.0.0.0/0.0.0.0 -d 192.168.1.4 -p icmp --icmp-type 8 -j DROP


【实验】1,给自己留一条路,其他全部被封杀!

iptables -A INPUT -d 192.168.1.4 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.4 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
[root@localhost ~]# iptables -P INPUT DROP
[root@localhost ~]# iptables -P OUTPUT DROP

自己ping自己起码得可以吧?

[root@localhost ~]# iptables -I INPUT 1 -s 192.168.1.4 -d 192.168.1.4 -j ACCEPT
[root@localhost ~]# iptables -I OUTPUT 1 -s 192.168.1.4 -d 192.168.1.4 -j ACCEPT

放行web服务

iptables -A INPUT -d 192.168.1.4 -p tcp --dport 80 -m state  --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.4 -p tcp --sport 80 -m state  --state ESTABLISHED -j ACCEPT



合并同样的规则

[root@localhost ~]# iptables -L -n
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  192.168.1.4          192.168.1.4         
ACCEPT     tcp  --  0.0.0.0/0            192.168.1.4         tcp dpt:22 state NEW,ESTABLISHED 
ACCEPT     tcp  --  0.0.0.0/0            192.168.1.4         tcp dpt:80 state NEW,ESTABLISHED 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  192.168.1.4          192.168.1.4         
ACCEPT     tcp  --  192.168.1.4          0.0.0.0/0           tcp spt:22 state ESTABLISHED 
ACCEPT     tcp  --  192.168.1.4          0.0.0.0/0           tcp spt:80 state ESTABLISHED




扩展匹配

[root@localhost ~]# iptables -I INPUT 2 -d 192.168.1.4 -p tcp -m state --state NEW,ESTABLISHED -m 
multiport --destination-ports 22,53,80 -j ACCEPT


一次性合并多条法则

先合并再删除,否则连自己都登录不进去!

 [root@localhost ~]# iptables -L -n
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  192.168.1.4          192.168.1.4         
ACCEPT     tcp  --  0.0.0.0/0            192.168.1.4         state NEW,ESTABLISHED multiport dports 22,53,80 
ACCEPT     tcp  --  0.0.0.0/0            192.168.1.4         tcp dpt:22 state NEW,ESTABLISHED 
ACCEPT     tcp  --  0.0.0.0/0            192.168.1.4         tcp dpt:80 state NEW,ESTABLISHED 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  192.168.1.4          192.168.1.4         
ACCEPT     tcp  --  192.168.1.4          0.0.0.0/0           tcp spt:22 state ESTABLISHED 
ACCEPT     tcp  --  192.168.1.4          0.0.0.0/0           tcp spt:80 state ESTABLISHED

绿色标记的法则将不再被匹配,不会再产生数据流量!

删除不会被匹配的法则 第三行

 iptables -D INPUT 3


放谁进来就放谁出去 !

[root@localhost ~]# iptables -I OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT


删除不会被匹配的法则 第二行

 iptables -D OUTPUT 2



以上的设置,ping自己是ping不通的,因为自己先出去,添加下面的就OK

iptables -A OUTPUT -s 192.168.1.4 -d 192.168.1.4 -j ACCEPT


规则的优化,已建立的连接直接匹配第一个,高效匹配!流量不走下面的ESTABLISHED了!

iptables -I INPUT 1 -m state --state ESTABLISHED -j ACCEPT


限制  192.168.1.1-192.168.1.100才能访问我

[root@localhost home]# iptables -A INPUT -m iprange --src-range 192.168.1.1-192.168.1.100 -p tcp --dport 23 -m state --state NEW -j ACCEPT



限制连接数目【限定22端口仅有2个新建连接】

[root@localhost home]# iptables -I INPUT 2 -d 192.168.1.4 -p tcp --dport 22 -m state  --state NEW -m connlimit ! --connlimit-above 2 -j ACCEPT


会新加一个

ACCEPT     tcp  --  0.0.0.0/0            192.168.1.4         tcp dpt:22 state NEW #conn/32 <= 2


继续打开ssh界面的连接,超过3个依然OK,是因为下面的规则被匹配,删这行就OK了,

iptables -D INPUT 4实测有效!

ACCEPT     tcp  --  0.0.0.0/0            192.168.1.4         state NEW,ESTABLISHED multiport dports 22,53,80



【速率限定  限制别人访问我的服务器 频率一分钟2次 峰值为5个 】

iptables -A INPUT -d 192.168.1.4 -p tcp --dport 80 -m state --state NEW -m limit --limit 2/minute --limit-burst 5 -j ACCEPT
iptables -L -n -v
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.1.4      tcp dpt:80 state NEW limit: avg 2/min burst 5


【本机服务器页面中含有“LCL”的页面,无法被访问】 实测有效!

iptables -I OUTPUT 1 -m string --algo kmp --string "LCL" -j REJECT
web可被访问的规则
iptables -A INPUT -d 192.168.1.4 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -d 192.168.1.4 -p tcp --sport 80 -m state --state NEW,ESTABLISHED -j ACCEPT















【本地主机当防火墙,处理本地服务】

vsftpd,端口是 21

yum -y install vsftpd
service vsftpd restart
cp /etc/passwd /var/ftp/pub/

先关闭iptables测试效果

service iptables stop

也可以清除所有规则

[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -Z
[root@localhost ~]# iptables –X


打开win7的ftp功能

在cmd窗口下面,ftp 192.168.1.4 (本机的IP地址)

用户名 ftp

ls 可以看到 pub目录


开始写规则

打开本地所有连接

[root@localhost ~]# iptables -A  INPUT -i lo -j ACCEPT
[root@localhost ~]# iptables -A  OUTPUT -o lo -j ACCEPT

所有已建立的连接,都放行

[root@localhost ~]# iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT


放行ssh的22端口服务,同个IP最多发起3个连接

iptables -A INPUT -d 192.168.1.4 -p tcp --dport 22 -m state --state NEW  -m connlimit ! --connlimit-above 3 -j ACCEPT


关闭所有进口,出口

[root@localhost ~]# iptables -P INPUT DROP【P是默认规则ACCEPT】
[root@localhost ~]# iptables -P OUTPUT DROP【P是默认规则ACCEPT】

放行FTP的21端口

iptables -A INPUT  -d 192.168.1.4 -p tcp --dport 21 -m state --state NEW -j ACCEPT

加载ip_nat_ftp模块  这个很重要,否则后面的RELATED状态不起作用 

modprobe ip_nat_ftp 
root@localhost ~]# lsmod | grep "ftp"
nf_nat_ftp              3507  0 
nf_nat                 22759  1 nf_nat_ftp
nf_conntrack_ftp       12913  1 nf_nat_ftp


把INPUIT和OUTPUT有跟踪关系的都加进来,修改表的第二行

iptables -R INPUT 2 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -R OUTPUT 2 -m state --state RELATED,ESTABLISHED -j ACCEPT

这样就可以正常访问ftp了

ipotables
vim /etc/sysconfig/iptables 保存规则的文件
vim /etc/sysconfig/iptables-config 为iptables脚本提供配置的文件

保存iptables的规则

service iptables save
iptables-save >/etc/sysconfig/iptables 
iptables-save >/etc/sysconfig/iptables.txt 保存在另外一个文件
iptables-restore< /etc/sysconfig/iptables.txt 读取保存的规则

脚本执行Iptables

 

开机自动执行的脚本放在这里面

cat /etc/rc.d/rc.local




网络防火墙

看看Ipv4路由转换,0无效,1有效

cat /proc/sys/net/ipv4/ip_forward
临时修改网卡
 [root@localhost rc.d]# ifconfig eth1 192.168.1.100/24


【我的网络参考】

 技术分享


 3号机 ping 172.16.0.100 是ping不通的

 3号机添加路由 route add default gw 192.168.3.3

 此时可以ping通2号机的172.16.0.103

2号机

 vim /etc/sysctl.conf
# Controls IP packet forwarding
net.ipv4.ip_forward = 0 【0改为1】


 2号机 使配置生效 [root@localhost ~]# sysctl –p

 win7 添加路由 cmd :route add 192.168.3.0 MASK 255.255.255.0 172.16.0.103

让192.168.3.0/24网段内的主机通过172.16.0.103这个主机做网关通信


【*】此删除操作会导致无法连接ssh   route DELETE 192.168.3.0

7 3号机 各种ping成功!

[root@localhost ~]# ping 192.168.3.3
PING 192.168.3.3 (192.168.3.3) 56(84) bytes of data.
64 bytes from 192.168.3.3: icmp_seq=1 ttl=64 time=0.252 ms
64 bytes from 192.168.3.3: icmp_seq=2 ttl=64 time=0.337 ms
[root@localhost ~]# ping 172.16.0.100
PING 172.16.0.100 (172.16.0.100) 56(84) bytes of data.
64 bytes from 172.16.0.100: icmp_seq=1 ttl=127 time=0.496 ms
64 bytes from 172.16.0.100: icmp_seq=2 ttl=127 time=0.522 ms

【现在实验可以ssh不可以通过防火墙ping】

当前准备,禁用win7上的虚拟网卡net1和net8

当前环境,两个网段可以任意互相ping ssh工具可以使用



防火墙主机添加规则,不让互相ping

[root@localhost ~]# iptables -A FORWARD -p icmp --icmp-type 8 -j REJECT

这样就不能互相ping了,但是都可以去ping防火墙


【假如3号机是web服务器 不允许包含有“***”的字符访问请求】

安装httpd yum -y install httpd

service httpd restart  win7浏览器可以打开欢迎界面192.168.3.1

vim /var/www/html/index.html随便写点东西


在防火墙主机上配置

iptables -A FORWARD -d 192.168.3.1 -p tcp --dport 22 -m state --state NEW -j ACCEPT

允许已连接的转发

iptables -I FORWARD 1 -m state --state ESTABLISHED -j ACCEPT

当前ssh已匹配到的链,但是NEW并没有匹配到数据,那么开始测试NEW

 

 4   232 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state ESTABLISHED


关闭3号机的ssh连接

在防火墙添加配置

iptables -P FORWARD DROP

重新连接到3号机的ssh  一切Ok,NEW匹配到了数据

2   128 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.3.1         tcp dpt:22 state NEW

此时ssh是可以访问的 但web已经访问不了



防火墙添加规则 允许ftp的21端口

iptables -A FORWARD -d 192.168.3.1 -p tcp --dport 21 -m state --state NEW -j ACCEPT

加载ip_nat_ftp模块  这个很重要,否则RELATED状态不起作用 

modprobe ip_nat_ftp

添加规则,

iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT

【win7 cmd测试 ftp 192.168.3.1 用户名ftp 密码kong】 OK

C:\Users\Administrator>ftp 192.168.3.1
连接到 192.168.3.1。
220 (vsFTPd 2.2.2)
用户(192.168.3.1:(none)): ftp
331 Please specify the password.
密码:
230 Login successful.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
fstab
pub
upload
226 Directory send OK.

ftp: 收到 20 字节,用时 0.00秒 20000.00千字节/秒。

ftp>


【可以让你ping  一秒只让你ping 3次】

iptables -A FORWARD -d 192.168.3.1 -p icmp --icmp-type 8 -m limit --limit 3/second -m state --state NEW -j ACCEPT
iptables -A FORWARD -d 192.168.3.1 -p icmp --icmp-type 8 -m limit --limit 6/minute -m state --state NEW -j ACCEPT
iptables -A FORWARD -d 192.168.3.1 -p icmp --icmp-type 8 -m limit --limit 6/minute --limit-burst 3  -m state --state NEW -j ACCEPT


【上面的RELATED状态对本设置有影响】





【笨鸟先飞】:

NEW        NEW说明这个包是我们看到的第一个 包。意思就是,这是conntrack模块看到的某个连接第一个包,它即将被匹配了。比如,我们看到一个SYN 包,是我们所留意的连接的第一个包,就要匹配它。第一个包也可能不是SYN包,但它仍会被认为是NEW状态。这样做有时会导致一些问题,但对某些情况是有非常大的帮助的。例如,在 我们想恢复某条从其他的防火墙丢失的连接时,或者某个连接已经超时,但实际上并未关闭时。


ESTABLISHED        ESTABLISHED已经注意到两个方向上 的数据传输,而且会继续匹配这个连接的包。处于ESTABLISHED状态的连接是非常容 易理解的。只要发送并接到应答,连接就是ESTABLISHED的了。一个连接要从NEW变 为ESTABLISHED,只需要接到应答包即可,不管这个包是发往防火墙的,还是要由防 火墙转发的。ICMP的错误和重定向等信息包也被看作是ESTABLISHED,只要它们是我 们所发出的信息的应答。


RELATED        RELATED是个比较麻烦的状态。当一 个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为是RELATED的了。换句话说,一个连接要想 是RELATED的,首先要有一个ESTABLISHED的连接。这个ESTABLISHED连接再产生一个主连接之外的连接,这 个新的连接就是RELATED的了,当然前提是conntrack模块要能理解RELATED。ftp是个很好的例子,FTP-data 连接就是和FTP-control有RELATED的。还有其他的例子,比如,通过IRC的DCC连接。有了这个状态,ICMP应 答、FTP传输、DCC等才能穿过防火墙正常工作。注意,大部分还有一些UDP协议都依赖这个机制。这些协议 是很复杂的,它们把连接信息放在数据包里,并且要求这些信息能被正确理解。


INVALID        INVALID说明数据包不能被识别属于 哪个连接或没有任何状态。有几个原因可以产生这种情况,比如,内存溢出,收到不知属于哪个连接的ICMP 错误信息。一般地,我们DROP这个状态的任何东西。

----------------------------------------------------------------------------------

【SNAT】 源地址转换

 

还是用这个网络结构图,完成实验

 技术分享

技术分享

有4个表,优先级 raw淰愀渀最氀攀滰愀琀曰椀氀琀攀爀

查看当前防火墙的转发状态

[root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward 
1

win7浏览器通过防火墙查看另一台ftp服务器

ftp://192.168.3.1/   测试 OK

win7浏览器通过防火墙查看另一台web服务器

192.168.3.1   测试 OK


在192.168.3.1主机查看被访问的日志,来访者就是原来的win7主机,不是防火墙

[root@localhost ~]# tail /var/log/httpd/access_log
172.16.0.100 - - [20/May/2015:14:05:38 +0800] "GET /favicon.ico HTTP/1.1" 404 286 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36"

防火墙配置 把172.16.0.0/16转换成192.168.3.3

iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j SNAT --to-source 192.168.3.3

再去win7刷新web页面 去web服务器看访问日志

 [root@localhost ~]# tail /var/log/httpd/access_log
192.168.3.3 - - [20/May/2015:14:23:29 +0800] "GET /favicon.ico HTTP/1.1" 404 286 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36"


删除web机器指向防火墙192.168.3.3的网关

[root@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.3.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0         192.168.3.3删     0.0.0.0         UG    0      0        0 eth0
0.0.0.0         192.168.3.2     0.0.0.0         UG    0      0        0 eth0
route del -net 0.0.0.0

重新连接ssh到web服务器

刷新win7的web页面


看web服务器访问日志

 [root@localhost ~]# tail /var/log/httpd/access_log
0 Chrome/30.0.1599.101 Safari/537.36"
192.168.3.3 - - [20/May/2015:14:35:06 +0800] "GET /favicon.ico HTTP/1.1" 404 286 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36"


防火墙添加过滤法则 拒绝所有协议的服务

[root@localhost ~]# iptables -A FORWARD -m string --algo kmp --string "game" -j REJECT

web端测试

[root@localhost ~]# cd /var/www/html/
[root@localhost html]# vim index.html
添加game 测试


再刷新win7 浏览器 确实有效!


以上的设置可以作为代理服务器上网功能

1, 外网的IP要是固定的

2, 此时的防洪墙充当代理服务器

3, 1号机同IP段的主机都是客户机

-------------------------------------------------------------------------

 


【DNAT】地址转换


内网当服务器,外网通过防火墙访问内网的web服务器,3号机是web服务器,1号机外网

技术分享

 






iptables -t nat -L –nv 看看

iptables -t nat -F POSTROUTING 清除规则

把访问172.16.0.103 tcp协议80端口连接指向192.168.3.1

iptables -t nat -A PREROUTING -d 172.16.0.103 -p tcp --dport 80  -j DNAT --to-destination 192.168.3.1




























本文出自 “生命不息,折腾不止。” 博客,谢绝转载!

linyux iptables SNAt NAT 【原创】

标签:linux iptables nat snat

原文地址:http://990487026.blog.51cto.com/10133282/1693932

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!