route规则和iptables规则的添加是经常使用,却也总是记不住的。我们来好好整理下。
通过route指令查看当前路由规则,列表一般有Destination,Gateway,Genmask,Flags,Metric,Ref,Use Iface例如
Destination Gateway Genmask Flags Metric Ref Use Iface
default gateway 0.0.0.0 UG 0 0 0 eth0
10.163.0.0 0.0.0.0 255.255.128.0 U 0 0 0 eth0
link-local 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.1.11 0.0.0.0 255.255.255.255 UH 0 0 0 eth0
-net目的网络地址
-host目的ip地址
gw设置网关
dev设置网卡
设置到另一个网络的路由用-net,设置到一个具体ip的用-host,设置到达目的地址的网关用gw,设置到达目的地址的下一跳网卡用dev
# 指定访问网络用哪张网卡
route add -net 10.0.0.0/24 dev eth0
# 指定访问网络通过哪个网关
route add -net 10.0.0.0/24 gw 192.168.1.1
# 指定访问ip用哪张网卡
route add -host 10.0.0.1 dev eth0
# 指定访问网络通过哪个网关
route add -host 10.0.0.1 gw 192.168.1.1
默认路由
route add -net 0.0.0.0/0 dev eth0
route add -net 0.0.0.0/0 gw 1.1.1.1
#简略写法
route add default dev eth0
route add default gw 1.1.1.1
关于掩码,下列两者等价
route add -net 10.0.0.0/24 gw 192.168.1.1
route add -net 10.0.0.0 netmask 255.255.255.0 gw 192.168.1.1
用法和route add一样如
route del -net 10.0.0.0/24 dev eth0
route del -net 10.0.0.0/24 gw 192.168.1.1
route del -host 10.0.0.1 dev eth0
route del -host 10.0.0.1 gw 192.168.1.1
有些时候可以简化比如到达网络或ip的路由只有想删除的那一条就直接
route del -net 10.0.0.0/24
route del -host 10.0.0.1
iptables可以设置本机的出入规则,所以有时候把他叫做防火墙,iptables本身是维系三个表的,mangle,nat,filter优先级依次降低, 查看当前的iptables规则
#查看列表-L 附带行号--line-numbers -t指定哪个表,不指定就是filter
iptables -L --line-numbers -t filter
分了几个大的块每个块叫做Chain(链)。比较常见的filter中的Chain为
nat表中的链择除了有INPUT,OUTPUT,PREROUTING和POSTROUTING。
而每个记录又有这些字段
例如我们看最简单的filter规则
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp -- 10.0.0.1 anywhere tcp dpt:ssh
policy ACCEPT
如果没有一条规则匹配则按照policy中设置的来,第一条规则配置了10.0.0.1这个ip发过来的想要连接22号端口的数据包全部丢弃。添加的指令如下
# -A等价于--append追加一条规则;-A INPUT指定了INPUT链追加
# -j指定target类型
# -p指定协议
# -s指定源地址,-d则是目的地址
# --sport指定源端口,--dport指定目的端口
iptables -A INPUT -j DROP -p tcp --dport 22 -s 10.0.0.1
将所有INPUT端口设为DROP,只有手动开启才能访问,建立端口安全的防火墙
# 设置已经建立连接的和在已有链接中建立新的连接的规则为accept
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# -P等价于--policy,将policy设为DROP
iptables -P INPUT DROP
不要乱试,这可能导致ssh断开,永远失联。
如果不加第一条,则会导致想要连接其他服务器,连接后无法收到对面发回来的响应,curl baidu.com会超时,补充上第一条后,才可以。
从第1条开始匹配,如果匹配成功则按照第一条的规则来,否则到第二条,全部不匹配则按照policy。
因为有先后顺序而-A是追加到最后的,所以需要用-I参数插入到最前面,-I还可以指定插入到第几行
iptables -I input 2 -j ACCEPT
删除某一条规则
iptables -D input 2
然后我们来看下转发规则表nat
除了设置过滤规则iptables还可以设置转发规则,通过-t nat指定为转发规则,上面的过滤规则是默认参数-t filter。
设置发到本机(192.168.0.33)的80端口的数据包全都转发到1.1.1.1:80:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 1.1.1.1:80
iptables -t nat -A POSTROUTING -p tcp -d 1.1.1.1 --dport 80 -j SNAT --to 192.168.0.33
注意这里需要在路由生效后进行源地址的修改,第二句是将发送到1.1.1.1:80的数据包的源地址修改为192.168.0.33(本机ip),这样这个ip的数据才能正常的返回给这台机器。 上面的第二行可以简写为:
# MASQUERADE是用发送数据的网卡上的IP来替换源IP
iptables -t nat -A POSTROUTING -p tcp -d 1.1.1.1 --dport 80 -j MASQUERADE
80转8080
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
iptables下,数据包的处理流程