其实这几个内容,任何一个都可以单独开一篇,这里主要写常用部分
转发
IP动态伪装(我理解为换IP包中的源地址):
iptables -t nat -A POSTROUTING -j MASQUERADE
在很多时候,可以通过在Postroute链中直接换(这种方法需要指定具体的IP):
-A PREROUTING -p tcp --dport 本机端口号 -j DNAT --to-destination 目标地址:目标端口号
-A PREROUTING -p udp --dport 本机端口号 -j DNAT --to-destination 目标地址:目标端口号
-A POSTROUTING -p tcp -d 目标地址 --dport 目标端口号 -j SNAT --to-source 本机内网地址
-A POSTROUTING -p udp -d 目标地址 --dport 目标端口号 -j SNAT --to-source 本机内网地址
注意:以上方法开启的端口转发,需要开启ip转发(我没有验证,但是可以根据iptables模型来思考,在换目的地后,如果目的地地址不是内网断,不开启转发应该是没法路由的)、还需要Forward链通过(filter表)
# -P 修改链的默认策略
sudo iptables -P FORWARD ACCEPT
# 开启ip转发
sysctl -w net.ipv4.ip_forward=1
或者 echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl -p /etc/sysctl.conf
/etc/init.d/procps restart
ubuntu18以后采用systemd而非initd管理启动,所以需要修改文件
/etc/sysctl.d/99-sysctl.conf中的forward参数(其实bbr也在这里),反正我修改了sysctl.conf 再执行sysctl -p /etc/sysctl.conf仅仅是当时有用
# -P 修改链的默认策略
sudo iptables -P FORWARD ACCEPT
# 开启ip转发
sysctl -w net.ipv4.ip_forward=1
或者 echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl -p /etc/sysctl.conf
/etc/init.d/procps restart
ubuntu18以后采用systemd而非initd管理启动,所以需要修改文件
/etc/sysctl.d/99-sysctl.conf中的forward参数(其实bbr也在这里),反正我修改了sysctl.conf 再执行sysctl -p /etc/sysctl.conf仅仅是当时有用,echo 1 > /proc/sys/net/ipv4/ip_for也是当时有用,重启失效
还要注意:由于本机数据包(我理解为lo网卡)发出去时是不会经过PREROUTING链的,另外如果是127到127这种,实际测试感觉同样在127接受时也不会经过PREROUTING链,所以要想路由前处理生效,需要这样处理:
用策略路由实现,但是我还没有弄清楚,出现了一些意料之外的问题
路由
路由表的作用在于iptables作用过程中两个位置需要用到,由于我用过单臂路由器,数据帧走向比较复杂,所以很多都是脑补的网络模型,先说常用操作。
路由表操作:
查看
ip route show
route -n
route -nee 详细
netstat -rn
删除
ip route del default via 192.168.2.1 dev eth0
route del -host 192.168.168.119 gw 192.168.168.1
ip route del default table 100
ip route del 192.168.1.0/24 table 100
添加路由
通过route添加和删除的要点是主机还是网络段
ip rule add from 192.168.7.0/24 to 8.8.8.8 prio 10 table 200
ip route append 192.168.5.0/24 via 192.168.7.1
ip route change 192.168.2.0/24 via 192.168.7.2 都是修改,效果一样
ip route replace 192.168.3.0/24 via 192.168.7.2
route add -host 192.168.168.110 dev eth0
route add -host 192.168.168.119 gw 192.168.168.1
route add -net IP netmask MASK eth0
一种比较复杂的情况,这里的local表示的是TYPE := [ unicast | local | broadcast | multicast | throw | unreachable | prohibit | blackhole | nat ],如果省略type,默认是unicast,我觉得这里理解为包从哪里来能说的通,比如,本机发出的包就是local,来自广播的包就是brodcast,一般网卡收到的包都是一对一即unicast
ip route add local 0.0.0.0/0 dev lo table 2233
添加默认路由
ip route add 192.168.11.0/24 via 192.168.7.1 metric 10 table 10
route add default gw IP 默认路由,不确定后续是否必须跟dev
route add default gw 192.168.1.1 dev eth0 有这种写法
添加/删除路由到指定网络为不可达
route add -net 10.0.0.0 netmask 255.0.0.0 reject 很少见到
设置优先级(metric低的优先)
route add default gw 192.168.1.1 dev eth0 metric 100
ip route add default via 1.1.1.1 metric 101
查看网卡是否连接网线
ip addr show dev eth0 | grep BROADCAST
设置包转发
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
路由永久生效(在网卡配置中添加)
vim /etc/network/interfaces
auto eth0
iface eth0 inet static
address 192.168.2.1
network 192.168.2.0
netmask 255.255.255.0
broadcast 192.168.2.255
gateway 192.168.2.254
up route add -net 192.168.3.0 netmask 255.255.255.0 gw 192.168.2.2 dev eth0
down route del -net 192.168.3.0 netmask 255.255.255.0 gw 192.168.2.2 dev eth0
up route add -net 192.168.4.0 netmask 255.255.255.0 gw 192.168.2.2 dev eth0
down route del -net 192.168.4.0 netmask 255.255.255.0 gw 192.168.2.2 dev eth0
策略路由
ip rule show
根据来源端IP来决定数据包参考哪个路由表发送出去
ip rule add from 192.168.1.10 table 10
根据目的端IP来决定数据包参考哪个路由表发送出去
ip rule add to 1.1.1.1/24 table 20
fwmark作为匹配条件
首先打上mark,mangle表打
-i 是进入网卡的数据
iptables -t mangle -A FORWARD -i eth3 -p tcp --dport 80 -j MARK --set-mark 1
iptables -t mangle -A FORWARD -i eth3 -p tcp --dport 25 -j MARK --set-mark 2
iptables -t mangle -A FORWARD -i eth3 -p tcp --dport 110 -j MARK --set-mark 2
iptables -t mangle -A FORWARD -i eth3 -j MARK --set-mark 3
根据mark号选择不同的路由表
ip rule add fwmark 1 table 1
ip rule add fwmark 2 table 2
ip rule add fwmark 3 table 3
根据不同的输入网卡接口作为依据
ip rule add dev eth2 table 1
ip rule add dev eth3 table 3
ACTION 里的 table 关键字也可以用 lookup 代替
ip rule add fwmark 1 lookup 100
优先级,前面数字,越小优先级越高
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
ip rule add ... prio XXX
ip rule add from 192.168.7.0/24 to 8.8.8.8 prio 10 table 200
网卡
主要是关于网卡开启关闭、配置等等,另外操作网卡有多种命令,另外还有多种配置方法,比如在openwrt中不直接操作网卡,而是通过更高级的配置文件生成,先说基础的:
抓包
注意:很多时候最好是要手动指定网卡,否则抓不到想要的包
dns解析:
tcpdump -nn -v -c 100 -w 1.cap port 53
包的方向(在单臂旁路由上很有用,通过ip方向永远无法知道数据包此时的位置,以及未来的动作):
# 在一遍文章上,我看到了-P参数设置 in out可以控制,但是我没有成功过
-P:指定要抓取的包是流入还是流出的包。可以给定的值为"in"、"out"和"inout",默认为"inout"。
tcpdump -e -nn -v -c 100 -w 1.cap port 53 // -e显示mac地址,由此判断包的位置和方向
更复杂的写法:
tcpdump -i eth1(接口名称) host 192.168.1.1(计算机IP地址)
tcpdump -i eth1 -nn(不做地址解析) -s0(抓取数据包长度不限制) -v(显示详细信息,需要显示更详细信息,可再加两个) -e (列出链路层头部) -c 20 (抓取指定个数的数据包,比如此处写20个,则为抓取20个包就停止)
如果不加-s0参数的话,默认只抓取一部分(68字节),则数据包在wireshark中打开,会显示数据包不完整
tcpdump 基于mac地址抓取数据包
在分析dhcp数据包的交互(IP地址下发),arp攻击等问题时,会涉及到链路层头部的抓取,也就是mac地址。抓取命令为
tcpdump -i eth1 ether src 6c:41:6a:ac:11:42 -c 10 // 在接口eth1上,抓取源mac地址为6c:41:6a:ac:01:42的数据包,个数为10
防火墙(泛指iptables)
待补充
- THE END -
最后修改:2022年12月4日
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://blog.melulu.top/?p=184
共有 0 条评论