stateless nat с использованием iproute (tc)

Sep 17, 2015 15:45

Если нам нужно использовать NAT, не задействуя подсистему трассировки соединений (conntrack),
можно сделать примерно следующее(схему см тут: http://anonymus88.livejournal.com/51506.html ):
root@pm# cat nat.sh                                                                                                                                              
>>
#!/bin/bash
pm=172.16.33.1
ps=172.16.33.6
ps1=172.16.33.2

pm_ext=netc
pm_int=netb

tc qdisc del dev $pm_ext ingress
tc qdisc del dev $pm_int ingress

tc qdisc add dev $pm_ext ingress handle ffff
tc filter add dev $pm_ext parent ffff: protocol ip prio 10 u32 match ip dst "${pm}"/32 action nat ingress "${pm}"/32 $ps

Данные правила создадут правила DNAT перенаправляющие на $ps пакеты, приходящие на $pm.

При этом в подсистеме conntrack регистрации соединений не происходит:

root@pm# cat /proc/net/nf_conntrack                                                                                                                              
cat: /proc/net/nf_conntrack: No such file or directory

Пакеты приходят с $ps1 на $ps:
root@ps# tcpdump -i any icmp                                                                                    
>>
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes
15:42:39.559087 IP 172.16.33.2 > 172.16.33.6: ICMP echo request, id 56363, seq 1, length 64
15:42:39.559260 IP 172.16.33.6 > 172.16.33.2: ICMP echo reply, id 56363, seq 1, length 64
15:42:40.809806 IP 172.16.33.2 > 172.16.33.6: ICMP echo request, id 56619, seq 1, length 64
15:42:40.809894 IP 172.16.33.6 > 172.16.33.2: ICMP echo reply, id 56619, seq 1, length 64

ip, tc

Previous post Next post
Up