chain.uc 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. {%
  2. function get_local_verdict() {
  3. let v = o_local_default;
  4. if (v == "checkdst") {
  5. return "goto ss_rules_dst_" + proto;
  6. } else if (v == "forward") {
  7. return "goto ss_rules_forward_" + proto;
  8. } else {
  9. return null;
  10. }
  11. }
  12. function get_src_default_verdict() {
  13. let v = o_src_default;
  14. if (v == "checkdst") {
  15. return "goto ss_rules_dst_" + proto;
  16. } else if (v == "forward") {
  17. return "goto ss_rules_forward_" + proto;
  18. } else {
  19. return "accept";
  20. }
  21. }
  22. function get_dst_default_verdict() {
  23. let v = o_dst_default;
  24. if (v == "forward") {
  25. return "goto ss_rules_forward_" + proto;
  26. } else {
  27. return "accept";
  28. }
  29. }
  30. function get_ifnames() {
  31. let res = [];
  32. for (let ifname in split(o_ifnames, /[ \t\n]/)) {
  33. ifname = trim(ifname);
  34. if (ifname) push(res, ifname);
  35. }
  36. return res;
  37. }
  38. let type, hook, priority, redir_port;
  39. if (proto == "tcp") {
  40. type = "nat";
  41. hook = "prerouting";
  42. priority = -1;
  43. redir_port = o_redir_tcp_port;
  44. } else if (proto == "udp") {
  45. type = "filter";
  46. hook = "prerouting";
  47. priority = "mangle";
  48. redir_port = o_redir_udp_port;
  49. if (system("
  50. set -o errexit
  51. iprr() {
  52. while ip $1 rule del fwmark 1 lookup 100 2>/dev/null; do true; done
  53. ip $1 rule add fwmark 1 lookup 100
  54. ip $1 route flush table 100 2>/dev/null || true
  55. ip $1 route add local default dev lo table 100
  56. }
  57. iprr -4
  58. iprr -6
  59. ") != 0) {
  60. return ;
  61. }
  62. } else {
  63. return;
  64. }
  65. %}
  66. {% if (redir_port): %}
  67. chain ss_rules_pre_{{ proto }} {
  68. type {{ type }} hook {{ hook }} priority {{ priority }};
  69. meta l4proto {{ proto }}{%- let ifnames=get_ifnames(); if (length(ifnames)): %} iifname { {{join(", ", ifnames)}} }{% endif %} goto ss_rules_pre_src_{{ proto }};
  70. }
  71. chain ss_rules_pre_src_{{ proto }} {
  72. ip daddr @ss_rules_dst_bypass_ accept;
  73. ip6 daddr @ss_rules6_dst_bypass_ accept;
  74. goto ss_rules_src_{{ proto }};
  75. }
  76. chain ss_rules_src_{{ proto }} {
  77. ip saddr @ss_rules_src_bypass accept;
  78. ip saddr @ss_rules_src_forward goto ss_rules_forward_{{ proto }};
  79. ip saddr @ss_rules_src_checkdst goto ss_rules_dst_{{ proto }};
  80. ip6 saddr @ss_rules6_src_bypass accept;
  81. ip6 saddr @ss_rules6_src_forward goto ss_rules_forward_{{ proto }};
  82. ip6 saddr @ss_rules6_src_checkdst goto ss_rules_dst_{{ proto }};
  83. {{ get_src_default_verdict() }};
  84. }
  85. chain ss_rules_dst_{{ proto }} {
  86. ip daddr @ss_rules_dst_bypass accept;
  87. ip daddr @ss_rules_dst_forward goto ss_rules_forward_{{ proto }};
  88. ip6 daddr @ss_rules6_dst_bypass accept;
  89. ip6 daddr @ss_rules6_dst_forward goto ss_rules_forward_{{ proto }};
  90. {{ get_dst_default_verdict() }};
  91. }
  92. {% if (proto == "tcp"): %}
  93. chain ss_rules_forward_{{ proto }} {
  94. meta l4proto tcp {{ o_nft_tcp_extra }} redirect to :{{ redir_port }};
  95. }
  96. {% let local_verdict = get_local_verdict(); if (local_verdict): %}
  97. chain ss_rules_local_out {
  98. type {{ type }} hook output priority -1;
  99. meta l4proto != tcp accept;
  100. ip daddr @ss_rules_dst_bypass_ accept;
  101. ip daddr @ss_rules_dst_bypass accept;
  102. ip6 daddr @ss_rules6_dst_bypass_ accept;
  103. ip6 daddr @ss_rules6_dst_bypass accept;
  104. {{ local_verdict }};
  105. }
  106. {% endif %}
  107. {% elif (proto == "udp"): %}
  108. chain ss_rules_forward_{{ proto }} {
  109. meta l4proto udp {{ o_nft_udp_extra }} meta mark set 1 tproxy to :{{ redir_port }};
  110. }
  111. {% endif %}
  112. {% endif %}