Решил просто проверить (потренироваться). У меня 2 сетевые карты, на одной внешний ip, на второй внутренний. Во внутренней сетке есть комп, являющийся шлюзом (другой провайдер), вот я и решил проверить, сделать маршрутизацию с моего компа так, чтоб до какого-то (рабочего) ip в Интернете ping шел именно через этот внутренний шлюз. Для этого я сделал в первую очередь:
Код: Выделить всё
# iptables -A POSTROUTING -d 62.5.246.190/32 -o eth1 -p icmp -j DROP (eth1 - это где внешний адрес)Код: Выделить всё
# iptables -A OUTPUT -t mangle -p icmp -d 62.5.246.190 -j MARK --set-mark 2Код: Выделить всё
# echo 200 eth0-out >> /etc/iproute2/rt_tables
# ip ru add fwmark 2 table eth0-out
# ip ro add 192.168.0.0/24 dev eth0 src 192.168.0.1 table eth0-out (0.1 - мой внутренний ip)
# ip ro add default via 192.168.0.2 table eth0-out (0.2 - внутренний комп с другим провайдером, который тоже может быть шлюзом)Код: Выделить всё
# iptables -t nat -A POSTROUTING -p icmp -d 62.5.246.190 -o eth0 -j ACCEPTКод: Выделить всё
# ip ro flush cache
# ping 62.5.246.190
. . .
1 packets transmitted, 0 received, 100% packet loss, time 0ms
# iptables -t nat -nvL POSTROUTING
Chain POSTROUTING (policy ACCEPT 361K packets, 31M bytes)
pkts bytes target prot opt in out source destination
2569K 212M SNAT all -- * eth1 192.168.0.0/24 0.0.0.0/0 to:213.186.54.30
4 336 DROP icmp -- * eth1 0.0.0.0/0 62.5.246.190
1 84 ACCEPT icmp -- * eth0 0.0.0.0/0 62.5.246.190Проверяем
Код: Выделить всё
# ip ru ls
0: from all lookup local
32765: from all fwmark 0x2 lookup eth0-out
32766: from all lookup main
32767: from all lookup default
# ip ro ls
213.186.54.30/30 dev eth1 proto kernel scope link src 213.186.54.28
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.1
169.254.0.0/16 dev eth0 scope link metric 1000
default via 213.186.54.28 dev eth1
# ip ro ls table eth0-out
192.168.0.0/24 dev eth0 scope link src 192.168.0.1
default via 192.168.0.2 dev eth0Код: Выделить всё
# ip ro ad 62.5.246.190 via 192.168.0.2 dev eth0
# ping 62.5.246.190
1 packets transmitted, 1 received, 0% packet loss, time 0msОтсюда вопрос: Что я делаю не так?
Возникла мысль сделать iptables -j LOG. Удалил маршрут
Код: Выделить всё
# ip ro del 62.5.246.190 via 192.168.0.2 dev eth0
# ping 62.5.246.190
. . .
1 packets transmitted, 0 received, 100% packet loss, time 0msРешил, что не проходит пинг из-за адреса отправителя, ведь когда я задаю маршрутизацию относительно fwmark, то комп её не понимает, пока не пошлет пакет, т.е. ip ro get 62.5.246.190 все равно показывает маршрут по-умолчанию через внешний интерфейс (т.е. он не моделирует, куда пойдет пакет и что с ним сделает iptables), таким образом он и отправляет его от имени своего внешнего ip. Сделал такkernel: [9478512.287710] IN= OUT=eth0 SRC=213.186.54.30 DST=62.5.246.190 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=53370 SEQ=1 MARK=0x2
Код: Выделить всё
iptables -t nat -I POSTROUTING 1 -m mark --mark 2 -j SNAT --to-source 192.168.0.1