Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
OpenWrt map-e (JPNE v6plus) において、割当ポート240個をちゃんと使わせるための設定。
## /etc/firewall.user
# This file is interpreted as shell script.
# Put your custom iptables rules here, they will
# be executed with each firewall (re-)start.
# Internal uci firewall chains are flushed and recreated on reload, so
# put custom rules into the root chains e.g. INPUT or FORWARD or into the
# special user chains, e.g. input_wan_rule or postrouting_lan_rule.
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet 0 -j MARK --set-mark 10
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet 1 -j MARK --set-mark 11
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet 2 -j MARK --set-mark 12
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet 3 -j MARK --set-mark 13
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet 4 -j MARK --set-mark 14
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet 5 -j MARK --set-mark 15
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet 6 -j MARK --set-mark 16
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet 7 -j MARK --set-mark 17
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet 8 -j MARK --set-mark 18
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet 9 -j MARK --set-mark 19
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet 10 -j MARK --set-mark 20
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet 11 -j MARK --set-mark 21
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet 12 -j MARK --set-mark 22
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet 13 -j MARK --set-mark 23
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet 14 -j MARK --set-mark 24
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet 0 -j MARK --set-mark 10
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet 1 -j MARK --set-mark 11
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet 2 -j MARK --set-mark 12
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet 3 -j MARK --set-mark 13
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet 4 -j MARK --set-mark 14
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet 5 -j MARK --set-mark 15
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet 6 -j MARK --set-mark 16
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet 7 -j MARK --set-mark 17
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet 8 -j MARK --set-mark 18
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet 9 -j MARK --set-mark 19
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet 10 -j MARK --set-mark 20
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet 11 -j MARK --set-mark 21
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet 12 -j MARK --set-mark 22
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet 13 -j MARK --set-mark 23
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet 14 -j MARK --set-mark 24
#$ diff -c /lib/netifd/proto/map.sh.orig /lib/netifd/proto/map.sh
*** /lib/netifd/proto/map.sh.orig 2017-05-30 02:45:19.000000000 +0900
--- /lib/netifd/proto/map.sh 2017-05-30 02:45:18.000000000 +0900
***************
*** 135,140 ****
--- 135,141 ----
json_add_string snat_ip $(eval "echo \$RULE_${k}_IPV4ADDR")
json_close_object
else
+ local mark=10
for portset in $(eval "echo \$RULE_${k}_PORTSETS"); do
for proto in icmp tcp udp; do
json_add_object ""
***************
*** 142,152 ****
--- 143,155 ----
json_add_string target SNAT
json_add_string family inet
json_add_string proto "$proto"
+ json_add_string mark "$mark"
json_add_boolean connlimit_ports 1
json_add_string snat_ip $(eval "echo \$RULE_${k}_IPV4ADDR")
json_add_string snat_port "$portset"
json_close_object
done
+ mark=`expr $mark + 1`
done
fi
if [ "$type" = "map-t" ]; then
@RemiNV

This comment has been minimized.

Copy link

@RemiNV RemiNV commented Aug 20, 2020

回避策として利用されている設定だと思いますが、バグは下記の通り直していますので新しいバージョンを使っていればもう必要ないかと思います。
https://bugs.openwrt.org/index.php?do=details&task_id=3284

あとは、バグがまだ直されていないバージョンを使っていれば、これを使うのではなく、「json_add_boolean connlimit_ports 1」を「json_add_string connlimit_ports "1"」に変えるだけで済むと思います。

@osakanataro

This comment has been minimized.

Copy link

@osakanataro osakanataro commented Nov 12, 2020

うちで使っているGL-MV1000はまだfirewall3部分は修正されてなかったので、map.sh の「json_add_boolean connlimit_ports "1"」修正だけを行ったところ、「iptables -t nat -L -v」で確認できるChain POSTROUTINGが最初の3つぐらいしか使われていない、という事象は継続しました。
ただ、同時接続セッションが増えすぎた時にそれ以上の新規セッションがはれなくなっているような動作は無くなりました。

とりあえず、偏りすぎなのは大丈夫なのかよくわからなかったので、両方の対策を実施しています

@RemiNV

This comment has been minimized.

Copy link

@RemiNV RemiNV commented Nov 24, 2020

「json_add_boolean connlimit_ports "1"」ではなく、「json_add_string connlimit_ports "1"」です(booleanの読み取りにバグがあったため、「boolean」を「string」に変えます)。

うまく行けば、
iptables -t nat -S POSTROUTING
で確認すると、「-m connlimit」の入ったルールが出るはずです。そうなったらこの上の30個のルールを使う必要無いと思います。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.