iptables 命令
对网络上的一些包通过表的形式进行限定和一些规则的修改
表主要有三种:
- mangle:(用的少,只有在操作级别才会用)
- filter:对进入的包进行过滤(默认的表)
- nat:网络地址转换
filter:
查看filter表信息:
[root@localhost ~]# iptables -t filter -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8500
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8500
Chain FORWARD (policy DROP)
target prot opt source destination
DOCKER-USER all -- 0.0.0.0/0 0.0.0.0/0
DOCKER-ISOLATION-STAGE-1 all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
DOCKER all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
自带三条链:INPUT、FORWARD、OUTPUT
(policy ACCEPT):默认全部接收
target:处理方式
prot:协议,有tcp,udp,all
opt:额外的参数
source:原地址,原端口
destination:目的地址,目的端口
填加规则:
[root@localhost ~]# iptables -t filter -A INPUT -j DROP -p tcp --dport 8080
[root@localhost ~]# iptables -t filter -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8500
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8500
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080
Chain FORWARD (policy DROP)
target prot opt source destination
DOCKER-USER all -- 0.0.0.0/0 0.0.0.0/0
DOCKER-ISOLATION-STAGE-1 all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
DOCKER all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
-A :表示追加,需指定链;
-I:表示在插入(默认第一个,但是也是指定位置),需指定链;例如 -I INPUT 2(表示插入到第二条)
-j :表示处理方式,需指定target
-p:需要指定协议
–dport:需要指定input的端口
-d:需要指定IP
-s:需要源IP
注意:
关于添加的规则的执行顺序和优先级;是按照规则的顺序执行,从上往下;当时没有找到匹配的就按照policy 来
删除规则:
[root@localhost ~]# iptables -t filter -D INPUT 3
[root@localhost ~]# iptables -t filter -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8500
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8500
-D :表示删除,需指定链;可以指定具体的规则所在位置数
iptables -t filter -A OUTPUT -j DROP -p tcp -d IP地址
表示对本机基于tcp协议的访问对指定IP的包进行丢弃
nat:
查看列表:
[root@localhost ~]# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0
MASQUERADE tcp -- 172.17.0.2 172.17.0.2 tcp dpt:8500
默认有四条链:PREROUTING、INPUT、OUTPUT、POSTROUTING
PREROUTING:路由前;改目的地址
POSTROUTING:路由后;改源地址
ip转接:
例如:假设需要将访问192.168.0.12:7788的包给转接到192.168.0.11:7799;需要两步
- 在192.168.0.12:7788的nat表的Prerouting链中添加目的地址;
- 在192.168.0.12:7788的nat表的postrouting链中添加源规则;
注意:如果没起作用可能是ip_forward没有开启;可以通过cat /proc/sys/net/ipv4/ip_forward查看(1为开启)
通过sysctl -w net.ipv4.ip_forward=1开启
iptables -t nat -A PREROUTING -j DNAT -p tcp --dport 7788 --to 192.168.0.11:7799
iptables -t nat -A POSTROUTING -j SNAT -p tcp -d 192.168.0.11 --dport 7799 --to 192.168.0.12
备注:
NAT -p tcp --dport 7788 --to 192.168.0.11:7799
```bash
iptables -t nat -A POSTROUTING -j SNAT -p tcp -d 192.168.0.11 --dport 7799 --to 192.168.0.12
备注:
nat表中的INPUT和OUTPUT链是使用主要是一些APP是直接通过forward进行发包,这时候就需要用到OUTPUT进行修改目的地址