转载自鸟哥的私房菜网站
[root@www ~]# iptables [-t tables] [-L] [-nv]选项与参数:
-t :后面接 table ,例如 nat 或 filter ,若省略此项目,则使用默认的 filter
-L :列出目前的 table 的规则
-n :不进行 IP 与 HOSTNAME 的检查,显示信息的速度会快很多!
-v :列出更多的信息,包括通过该规则的封包总位数、相关的网络接口等
[root@www ~]#iptables [-AI 名称] [-io 网络接口] [-p 协议] [-s 来源IP/网段] [-d 目标IP/网段] -j [ACCEPT|DROP|REJECT|LOG]
选项与参数:
-AI 链名:针对某的链进行规则的 "插入" 或 "累加"
-A :新增加一条规则,该规则增加在原本规则的最后面。例如原本已经有四条规则,
使用 -A 就可以加上第五条规则!
-I :插入一条规则。如果没有指定此规则的顺序,默认是插入变成第一条规则。
例如原本有四条规则,使用 -I 则该规则变成第一条,而原本四条变成 2~5 号
链 :有 INPUT, OUTPUT, FORWARD 等,此链名称又与 -io 有关,请看底下。
-io 网络接口:设定封包进出的接口规范
-i :封包所进入的那个网络接口,例如 eth0, lo 等接口。需与 INPUT 链配合;
-o :封包所传出的那个网络接口,需与 OUTPUT 链配合;
-p 协定:设定此规则适用于哪种封包格式
主要的封包格式有: tcp, udp, icmp 及 all 。
-s 来源 IP/网域:设定此规则之封包的来源项目,可指定单纯的 IP 或包括网域,例如:
IP :192.168.0.100
网域:192.168.0.0/24, 192.168.0.0/255.255.255.0 均可。
若规范为『不许』时,则加上 ! 即可,例如:
-s ! 192.168.100.0/24 表示不许 192.168.100.0/24 之封包来源;
-d 目标 IP/网域:同 -s ,只不过这里指的是目标的 IP 或网域。
-j :后面接动作,主要的动作有接受(ACCEPT)、丢弃(DROP)、拒绝(REJECT)及记录(LOG)
范例:只要是来自 192.168.100.10 就接受,但 192.168.100.230 这个恶意来源就丢弃
[root@www ~]# iptables -A INPUT -i eth1 -s 192.168.100.10 -j ACCEPT
[root@www ~]# iptables -A INPUT -i eth1 -s 192.168.100.230 -j DROP
范例:想要联机进入本机 port 21 的封包都抵挡掉:
[root@www ~]# iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP
[root@www ~]# iptables -A INPUT [-m state] [--state 状态]
选项与参数:
-m :一些 iptables 的外挂模块,主要常见的有:
state :状态模块
mac :网卡硬件地址 (hardware address)
--state :一些封包的状态,主要有:
INVALID :无效的封包,例如数据破损的封包状态
ESTABLISHED:已经联机成功的联机状态;
NEW :想要新建立联机的封包状态;
RELATED :这个最常用!表示这个封包是与我们主机发送出去的封包有关
范例:针对局域网络内的 aa:bb:cc:dd:ee:ff 主机开放其联机
[root@www ~]# iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff -j ACCEPT
选项与参数:
--mac-source :就是来源主机的 MAC
Linux下iptables(NAT)的用法
1、来源NAT:SNAT
内部LAN通过SNAT转为接口IP方可访问互联网的相关应用,相当于网络里的源地址转换(思科的PAT/动态NAT,华三的EASYIP)
将外网的一个IP、端口做映射到内部的服务器的IP、端口,所有外网区域的主机都可以通过这个外网IP访问内部服务器,相当于思科的静态IP映射、华为的内部服务器映射。
SNAT举例:
外部接口使用 eth0 ,这个接口具有 public IP 喔;
内部接口使用 eth1 ,假设这个 IP 为 192.168.100.254 ;
iptables -A INPUT -i $INIF -j ACCEPT
# 这一行为非必要的,主要的目的是让内网 LAN 能够完全的使用 NAT 服务器资源。
# 其中 $INIF 在本例中为 eth1 接口
echo "1" > /proc/sys/net/ipv4/ip_forward
# 上头这一行则是在让你的 Linux 具有 router 的能力
iptables -t nat -A POSTROUTING -s $innet -o $EXTIF -j MASQUERADE
# 这一行最关键!就是加入 nat table 封包伪装!本例中 $innet 是 192.168.100.0/24# 而 $EXTIF 则是对外界面,本例中为 eth0
例题:
所有来自192.168.0.0/24的数据包源地址转换为1.1.1.1:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 1.1.1.1
这里需要注意的是,系统在路由及过虑等处理直到数据包要被送出时才进行SNAT。
有一种SNAT的特殊情况是ip欺骗,也就是所谓的Masquerading,通常建议在使用拨号上网的时候使用,或者说在合法ip地址不固定的情况下使用。(直接映射到接口上,转换后的IP随着接口IP的变化而变化)
# iptables -t nat -A POSTROUTING -o ppp0-j MASQUERADE
可以看出,这时候我们没有必要显式的指定源ip地址等信息。
例题:
假设对外的 IP 固定为 192.168.1.100 ,若不想使用伪装,该如何处理?
答:
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.1.100
例题:
假设你的 NAT 服务器对外 IP 有好几个,那你想要轮流使用不同的 IP 时,又该如何设定?举例来说,你的 IP 范围为 192.168.1.210~192.168.1.220
答:
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.1.210-192.168.1.220
DNAT 设定
例题:
假设内网有部主机 IP 为 192.168.100.10 ,该主机是可对 Internet 开放的 WWW 服务器。你该如何透过 NAT 机制,将 WWW 封包传到该主机上?
答:
假设 public IP 所在的接口为 eth0 ,IP为52.185.25.16,那么你的规则就是:
iptables -t nat -A PREROUTING -i eth0 -d 52.185.25.16 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.10:80
-j REDIRECT --to-ports
# 这个也挺常见的,基本上,就是进行本机上面 port 的转换就是了!
# 不过,特别留意的是,这个动作仅能够在 nat table 的 PREROUTING 以及
# OUTPUT 链上面实行而已喔!
范例:将要求与 80 联机的封包转递到 8080 这个 port
[root@www ~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
# 这玩意最容易在你使用了非正规的 port 来进行某些 well known 的协议,
# 例如使用 8080 这个 port 来启动 WWW ,但是别人都以 port 80 来联机,
# 所以,你就可以使用上面的方式来将对方对你主机的联机传递到 8080 啰!